diff --git a/404.html b/404.html index 7cf5b65..68ac877 100644 --- a/404.html +++ b/404.html @@ -90,7 +90,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -215,6 +215,7 @@ + diff --git a/build.json b/build.json index 97453ea..ce6e81e 100644 --- a/build.json +++ b/build.json @@ -1,15 +1,15 @@ { - "timestamp": "2025-12-22T01:23:12Z", + "timestamp": "2025-12-22T13:04:45Z", "git": { - "commit": "d03e699084774ebecef9c6d4662498907c5e2080", + "commit": "c4b2a05dbc85c1eb37f204ef3c57ebee0f50eaf3", "branch": "origin/develop", "url": "git@github.com:vacp2p/rfc-index.git" }, "build": { - "id": "626", - "number": "626", + "id": "628", + "number": "628", "name": "website/dev-rfc.vac.dev", "slave": "linux-01", - "url": "https://ci.infra.status.im/job/website/job/dev-rfc.vac.dev/626/" + "url": "https://ci.infra.status.im/job/website/job/dev-rfc.vac.dev/628/" } } \ No newline at end of file diff --git a/codex/index.html b/codex/index.html index 2b32c46..6c06d8c 100644 --- a/codex/index.html +++ b/codex/index.html @@ -3,7 +3,7 @@ - Overview - Vac RFC + Codex - Vac RFC @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -190,7 +190,7 @@ to view the new Codex specifications currently under discussion. - + @@ -204,7 +204,7 @@ to view the new Codex specifications currently under discussion. - + @@ -228,6 +228,7 @@ to view the new Codex specifications currently under discussion. + diff --git a/codex/raw/codex-block-exchange.html b/codex/raw/codex-block-exchange.html index 8f6a53d..5f4e325 100644 --- a/codex/raw/codex-block-exchange.html +++ b/codex/raw/codex-block-exchange.html @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -177,18 +177,25 @@ - -title: CODEX-BLOCK-EXCHANGE -name: Codex Block Exchange Protocol -status: raw -category: Standards Track -tags: codex, block-exchange, p2p, data-distribution -editor: Codex Team -contributors: + CODEX-BLOCK-EXCHANGE + + +NameCodex Block Exchange Protocol +Statusraw +CategoryStandards Track +EditorCodex Team +ContributorsFilip Dimitrijevic <filip@status.im> + + + +Timeline -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-12-12 — b2f3564 — Improved codex/raw/codex-block-exchange.md file (#215) +2025-11-19 — 63107d3 — Created new codex/raw/codex-block-exchange.md file (#211) - + Specification Status This specification contains a mix of: @@ -1637,11 +1644,11 @@ in RFCs to Indicate Requirement Levels - + - + @@ -1651,11 +1658,11 @@ in RFCs to Indicate Requirement Levels - + - + @@ -1679,6 +1686,7 @@ in RFCs to Indicate Requirement Levels + diff --git a/codex/raw/codex-marketplace.html b/codex/raw/codex-marketplace.html index e7c38cb..c8e4696 100644 --- a/codex/raw/codex-marketplace.html +++ b/codex/raw/codex-marketplace.html @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -177,23 +177,25 @@ - -slug: codex-marketplace -title: CODEX-MARKETPLACE -name: Codex Storage Marketplace -status: raw -category: Standards Track -tags: codex, storage, marketplace, smart-contract -editor: Codex Team and Dmitriy Ryajov dryajov@status.im -contributors: + CODEX-MARKETPLACE + + +NameCodex Storage Marketplace +Slugcodex-marketplace +Statusraw +CategoryStandards Track +EditorCodex Team and Dmitriy Ryajov <dryajov@status.im> +ContributorsMark Spanbroek <mark@codex.storage>Adam Uhlíř <adam@codex.storage>Eric Mastro <eric@codex.storage>Jimmy Debe <jimmy@status.im>Filip Dimitrijevic <filip@status.im> + + + +Timeline -Mark Spanbroek mark@codex.storage -Adam Uhlíř adam@codex.storage -Eric Mastro eric@codex.storage -Jimmy Debe jimmy@status.im -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-11-19 — d2df7e0 — Created codex/raw/codex-marketplace.md file, without integration of Sales a… (#208) - + Abstract Codex Marketplace and its interactions are defined by a smart contract deployed on an EVM-compatible blockchain. This specification describes these interactions for the various roles within the network. The document is intended for implementors of Codex nodes. @@ -885,6 +887,7 @@ method requestState*(market: Market, requestId: RequestId): Future[?RequestState + diff --git a/codex/raw/index.html b/codex/raw/index.html new file mode 100644 index 0000000..f51ed57 --- /dev/null +++ b/codex/raw/index.html @@ -0,0 +1,234 @@ + + + + + + Raw - Vac RFC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage + + + + + + + + + + + + + + + + + + + + + + + Light + Rust + Coal + Navy + Ayu + + + + + + + Vac RFC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Codex Raw Specifications +Early-stage Codex specifications collected before reaching draft status. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/custom.css b/custom.css index e5d6afe..50970be 100644 --- a/custom.css +++ b/custom.css @@ -1,3 +1,313 @@ :root { - --content-max-width: 60em; + --content-max-width: 68em; +} + +body { + background: var(--bg); + color: var(--fg); + font-family: "Source Serif Pro", "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Georgia, serif; + line-height: 1.6; + letter-spacing: 0.01em; +} + +code, pre, .hljs { + font-family: "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 0.95em; +} + +a { + color: var(--links); +} + +a:hover { + color: var(--links); + opacity: 0.85; +} + +.page { + background: var(--bg); + box-shadow: none; + border: 1px solid var(--table-border-color); +} + +.menu-bar { + background: var(--bg); + box-shadow: none; + border-bottom: 1px solid var(--table-border-color); + min-height: 52px; +} + +.menu-title { + font-weight: 600; + color: var(--fg); +} + +.icon-button { + box-shadow: none; + border: 1px solid transparent; +} + +#sidebar { + background: var(--sidebar-bg); + border-right: 1px solid var(--sidebar-spacer); + box-shadow: none; +} + +#sidebar a { + color: var(--sidebar-fg); +} + +#sidebar .chapter-item > a strong { + color: var(--sidebar-active); +} + +#sidebar .part-title { + color: var(--sidebar-non-existant); + font-weight: 600; + letter-spacing: 0.02em; +} + +main h1, main h2, main h3, main h4 { + font-family: "Source Serif Pro", "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Georgia, serif; + color: var(--fg); + font-weight: 600; + margin-top: 1.2em; + margin-bottom: 0.6em; +} + +.rfc-meta { + margin: 1rem 0 1.5rem 0; + padding: 0.75rem 1rem; + border: 1px solid var(--table-border-color); + background: var(--bg); +} + +.rfc-meta table { + margin: 0; + border: none; +} + +.rfc-meta th, +.rfc-meta td { + border: none; + padding: 0.2rem 0.4rem 0.2rem 0; + text-align: left; + vertical-align: top; +} + +.rfc-meta th { + width: 10rem; + color: var(--sidebar-fg); + font-weight: 600; +} + +main p, main li { + color: var(--fg); +} + +main blockquote { + border-left: 3px solid var(--quote-border); + color: var(--fg); + background: var(--quote-bg); +} + +table { + border: 1px solid var(--table-border-color); + border-collapse: collapse; + width: 100%; +} + +th, td { + border: 1px solid var(--table-border-color); + padding: 0.5em 0.75em; +} + +thead { + background: var(--table-header-bg); +} + +.content { + padding: 1.5rem 2rem 3rem 2rem; +} + +.nav-chapters, .nav-wrapper { + box-shadow: none; +} + +/* Landing layout */ +.landing-hero { + margin-bottom: 1.5rem; + padding: 1.25rem 1.5rem; + background: var(--bg); + border: 1px solid var(--table-border-color); +} + +.landing-hero p { + margin: 0.3rem 0 0; + color: var(--sidebar-fg); +} + +.filter-row { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + align-items: center; + margin-bottom: 0.75rem; +} + +.filter-row input[type="search"] { + padding: 0.5rem 0.65rem; + border: 1px solid var(--searchbar-border-color); + border-radius: 4px; + min-width: 240px; + background: var(--searchbar-bg); + color: var(--searchbar-fg); +} + +.chips { + display: flex; + gap: 0.5rem; + flex-wrap: wrap; +} + +.chip { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.35rem 0.6rem; + border: 1px solid var(--table-border-color); + border-radius: 999px; + background: var(--theme-hover); + color: var(--fg); + cursor: pointer; + font-size: 0.95em; +} + +.chip.active { + background: var(--theme-hover); + border-color: var(--sidebar-active); + color: var(--sidebar-active); + font-weight: 600; +} + +.quick-links { + display: flex; + gap: 0.5rem; + flex-wrap: wrap; + margin: 0.5rem 0 1rem 0; +} + +.quick-links a { + border: 1px solid var(--table-border-color); + padding: 0.35rem 0.65rem; + border-radius: 4px; + background: var(--bg); + text-decoration: none; + color: var(--fg); +} + +.quick-links a:hover { + border-color: var(--sidebar-active); + color: var(--links); +} + +.rfc-table { + width: 100%; + border-collapse: collapse; + margin-top: 0.75rem; +} + +.rfc-table th, .rfc-table td { + border: 1px solid var(--table-border-color); + padding: 0.45rem 0.6rem; +} + +.rfc-table thead { + background: var(--table-header-bg); +} + +.rfc-table tbody tr:hover { + background: var(--theme-hover); +} + +.badge { + display: inline-block; + padding: 0.15rem 0.45rem; + border-radius: 4px; + font-size: 0.85em; + border: 1px solid var(--table-border-color); + background: var(--table-alternate-bg); + color: var(--fg); +} + + +/* Landing polish */ +main h1 { + text-align: left; +} + +.results-row { + display: flex; + justify-content: space-between; + align-items: baseline; + gap: 1rem; + margin: 0.5rem 0 0.75rem 0; + color: var(--sidebar-fg); + font-size: 0.95em; +} + +.results-count { + color: var(--fg); + font-weight: 600; +} + +.results-hint { + color: var(--sidebar-fg); + font-size: 0.9em; +} + +.table-wrap { + overflow-x: auto; + border: 1px solid var(--table-border-color); + border-radius: 6px; + background: var(--bg); +} + +.table-wrap .rfc-table { + margin: 0; + border: none; +} + +.rfc-table tbody tr:nth-child(even) { + background: var(--table-alternate-bg); +} + +.rfc-table th[data-sort] { + cursor: pointer; + user-select: none; +} + +.rfc-table th.sorted { + color: var(--links); +} + +.rfc-table td:first-child a { + word-break: break-word; +} + +.noscript-note { + margin-top: 0.75rem; + color: var(--sidebar-fg); +} + +@media (max-width: 900px) { + .results-row { + flex-direction: column; + align-items: flex-start; + } + + .filter-row input[type="search"] { + width: 100%; + min-width: 0; + } } diff --git a/index.html b/index.html index b4dd6bc..1b787a8 100644 --- a/index.html +++ b/index.html @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -177,50 +177,54 @@ - Vac Request For Comments(RFC) -NOTE: This repo is WIP. We are currently restructuring the RFC process. -This repository contains specifications from the Waku, Nomos, -Codex, and -Status projects that are part of the IFT portfolio. -Vac is an -IFT service that will manage the RFC, -Request for Comments, -process within this repository. -New RFC Process -This repository replaces the previous rfc.vac.dev resource. -Each project will maintain initial specifications in separate repositories, -which may be considered as a raw specification. -All Vac raw specifications and -discussions will live in the Vac subdirectory. -When projects have reached some level of maturity -for a specification living in their repository, -the process of updating the status to draft may begin in this repository. -Specifications will adhere to -1/COSS before obtaining draft status. -Implementations should follow specifications as described, -and all contributions will be discussed before the stable status is obtained. -The goal of this RFC process will to engage all interseted parities and -reach a rough consensus for techcinal specifications. -Contributing -Please see 1/COSS for general guidelines and specification lifecycle. -Feel free to join the Vac discord. -Here's the project board used by core contributors and maintainers: Projects -IFT Projects' Raw Specifications -The repository for each project raw specifications: - -Vac Raw Specifications -Status Raw Specifications -Waku Raw Specificiations -Codex Raw Specifications -Nomos Raw Specifications - + Vac RFC Index +An IETF-style index of Vac-managed RFCs across Waku, Nomos, Codex, and Status. Use the filters below to jump straight to a specification. + + + + + All + Stable + Draft + Raw + Deprecated + Deleted + + + + + All projects + Vac + Waku + Status + Nomos + Codex + + + + 1/COSS (Process) + Vac index + Waku index + Status index + Nomos index + Codex index + + + + Loading RFC index... + Click a column to sort + + + + JavaScript is required to load the RFC index table. + - + @@ -231,7 +235,7 @@ reach a rough consensus for techcinal specifications. - + @@ -255,6 +259,7 @@ reach a rough consensus for techcinal specifications. + diff --git a/nomos/deprecated/claro.html b/nomos/deprecated/claro.html index 3eb9dbf..d125d86 100644 --- a/nomos/deprecated/claro.html +++ b/nomos/deprecated/claro.html @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -177,23 +177,27 @@ - -title: CONSENSUS-CLARO -name: Claro Consensus Protocol -status: deprecated -category: Standards Track -tags: + CONSENSUS-CLARO + + +NameClaro Consensus Protocol +Statusdeprecated +CategoryStandards Track +EditorCorey Petty <corey@status.im> +ContributorsÁlvaro Castro-CastillaMark Evenson + + + +Timeline -logos/consensus -editor: Corey Petty corey@status.im -created: 01-JUL-2022 -revised: <2022-08-26 Fri 13:11Z> -uri: <https://rdf.logos.co/protocol/Claro/1/0/0#<2022-08-26%20Fri$2013:11Z> -contributors: -Álvaro Castro-Castilla -Mark Evenson +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-02-15 — 1ddddc7 — update to tree structure (#128) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-02-02 — f52c54f — Update and rename CLARO.md to claro.md +2024-01-27 — 01e2781 — Create CLARO.md - + Abstract This document specifies Claro: a Byzantine, fault-tolerant, binary decision agreement algorithm that utilizes bounded memory for its execution. @@ -852,11 +856,11 @@ Move: a Language for Writing DAG Abstractions - + - + @@ -866,11 +870,11 @@ Move: a Language for Writing DAG Abstractions - + - + @@ -894,6 +898,7 @@ Move: a Language for Writing DAG Abstractions + diff --git a/nomos/deprecated/index.html b/nomos/deprecated/index.html new file mode 100644 index 0000000..20fc541 --- /dev/null +++ b/nomos/deprecated/index.html @@ -0,0 +1,234 @@ + + + + + + Deprecated - Vac RFC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage + + + + + + + + + + + + + + + + + + + + + + + Light + Rust + Coal + Navy + Ayu + + + + + + + Vac RFC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Nomos Deprecated Specifications +Deprecated Nomos specifications kept for archival and reference purposes. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nomos/index.html b/nomos/index.html index 381433e..ab2f8f4 100644 --- a/nomos/index.html +++ b/nomos/index.html @@ -3,7 +3,7 @@ - Overview - Vac RFC + Nomos - Vac RFC @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -191,7 +191,7 @@ Published Specifications are currently available here, - + @@ -205,7 +205,7 @@ Published Specifications are currently available here, - + @@ -229,6 +229,7 @@ Published Specifications are currently available here, + diff --git a/nomos/raw/index.html b/nomos/raw/index.html new file mode 100644 index 0000000..9720cd0 --- /dev/null +++ b/nomos/raw/index.html @@ -0,0 +1,234 @@ + + + + + + Raw - Vac RFC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage + + + + + + + + + + + + + + + + + + + + + + + Light + Rust + Coal + Navy + Ayu + + + + + + + Vac RFC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Nomos Raw Specifications +Early-stage Nomos specifications that have not yet progressed beyond raw status. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nomos/raw/nomosda-encoding.html b/nomos/raw/nomosda-encoding.html index 388b19b..9f63e99 100644 --- a/nomos/raw/nomosda-encoding.html +++ b/nomos/raw/nomosda-encoding.html @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -177,22 +177,23 @@ - -title: NOMOSDA-ENCODING -name: NomosDA Encoding Protocol -status: raw -category: -tags: data-availability -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors: + NOMOSDA-ENCODING + + +NameNomosDA Encoding Protocol +Statusraw +EditorDaniel Sanchez-Quiros <danielsq@status.im> +ContributorsDaniel Kashepava <danielkashepava@status.im>Álvaro Castro-Castilla <alvaro@status.im>Filip Dimitrijevic <filip@status.im>Thomas Lavaur <thomaslavaur@status.im>Mehmet Gonen <mehmet@status.im> + + + +Timeline -Daniel Kashepava danielkashepava@status.im -Álvaro Castro-Castilla alvaro@status.im -Filip Dimitrijevic filip@status.im -Thomas Lavaur thomaslavaur@status.im -Mehmet Gonen mehmet@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — 39d6f07 — added nomos/raw/nomosda-encoding.md draft (#156) - + Introduction This document describes the encoding and verification processes of NomosDA, which is the data availability (DA) solution used by the Nomos blockchain. NomosDA provides an assurance that all data from Nomos blobs are accessible and verifiable by every network participant. This document presents an implementation specification describing how: @@ -335,11 +336,11 @@ b. The amount of rows depends on the size of the data. - + - + @@ -349,11 +350,11 @@ b. The amount of rows depends on the size of the data. - + - + @@ -377,6 +378,7 @@ b. The amount of rows depends on the size of the data. + diff --git a/nomos/raw/nomosda-network.html b/nomos/raw/nomosda-network.html index bcd7ac8..2d49e55 100644 --- a/nomos/raw/nomosda-network.html +++ b/nomos/raw/nomosda-network.html @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -177,21 +177,23 @@ - -title: NOMOS-DA-NETWORK -name: NomosDA Network -status: raw -category: -tags: network, data-availability, da-nodes, executors, sampling -editor: Daniel Sanchez Quiros danielsq@status.im -contributors: + NOMOS-DA-NETWORK + + +NameNomosDA Network +Statusraw +EditorDaniel Sanchez Quiros <danielsq@status.im> +ContributorsÁlvaro Castro-Castilla <alvaro@status.im>Daniel Kashepava <danielkashepava@status.im>Gusto Bacvinka <augustinas@status.im>Filip Dimitrijevic <filip@status.im> + + + +Timeline -Álvaro Castro-Castilla alvaro@status.im -Daniel Kashepava danielkashepava@status.im -Gusto Bacvinka augustinas@status.im -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — 51ef4cd — added nomos/raw/nomosda-network.md (#160) - + Introduction NomosDA is the scalability solution protocol for data availability within the Nomos network. This document delineates the protocol's structure at the network level, @@ -447,6 +449,7 @@ ensures the overlay node distribution is scalable for networks of any size. + diff --git a/nomos/raw/p2p-hardware-requirements.html b/nomos/raw/p2p-hardware-requirements.html index f900477..6732a56 100644 --- a/nomos/raw/p2p-hardware-requirements.html +++ b/nomos/raw/p2p-hardware-requirements.html @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -177,18 +177,24 @@ - -title: P2P-HARDWARE-REQUIREMENTS -name: Nomos p2p Network Hardware Requirements Specification -status: raw -category: infrastructure -tags: [hardware, requirements, nodes, validators, services] -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors: + P2P-HARDWARE-REQUIREMENTS + + +NameNomos p2p Network Hardware Requirements Specification +Statusraw +Categoryinfrastructure +EditorDaniel Sanchez-Quiros <danielsq@status.im> +ContributorsFilip Dimitrijevic <filip@status.im> + + + +Timeline -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — 34bbd7a — Created nomos/raw/hardware-requirements.md file (#172) - + Abstract This specification defines the hardware requirements for running various types of Nomos blockchain nodes. Hardware needs vary significantly based on the node's role, from lightweight verification nodes to high-performance Zone Executors. The requirements are designed to support diverse participation levels while ensuring network security and performance. Motivation @@ -429,6 +435,7 @@ contributors: + diff --git a/nomos/raw/p2p-nat-solution.html b/nomos/raw/p2p-nat-solution.html index cc1cef7..90bbece 100644 --- a/nomos/raw/p2p-nat-solution.html +++ b/nomos/raw/p2p-nat-solution.html @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -177,23 +177,24 @@ - -title: P2P-NAT-SOLUTION -name: Nomos P2P Network NAT Solution Specification -status: raw -category: networking -tags: [nat, traversal, autonat, upnp, pcp, nat-pmp] -editor: Antonio Antonino antonio@status.im -contributors: + P2P-NAT-SOLUTION + + +NameNomos P2P Network NAT Solution Specification +Statusraw +Categorynetworking +EditorAntonio Antonino <antonio@status.im> +ContributorsÁlvaro Castro-Castilla <alvaro@status.im>Daniel Sanchez-Quiros <danielsq@status.im>Petar Radovic <petar@status.im>Gusto Bacvinka <augustinas@status.im>Youngjoon Lee <youngjoon@status.im>Filip Dimitrijevic <filip@status.im> + + + +Timeline -Álvaro Castro-Castilla alvaro@status.im -Daniel Sanchez-Quiros danielsq@status.im -Petar Radovic petar@status.im -Gusto Bacvinka augustinas@status.im -Youngjoon Lee youngjoon@status.im -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — cfb3b78 — Created nomos/raw/p2p-nat-solution.md draft (#174) - + Abstract This specification defines a comprehensive NAT (Network Address Translation) traversal solution for the Nomos P2P network. The solution enables nodes to automatically determine their NAT status and establish both outbound and inbound connections regardless of network configuration. The strategy combines AutoNAT, dynamic port mapping protocols, and continuous verification to maximize public reachability while maintaining decentralized operation. Motivation @@ -551,6 +552,7 @@ contributors: + diff --git a/nomos/raw/p2p-network-bootstrapping.html b/nomos/raw/p2p-network-bootstrapping.html index a62f11c..f3b8cfe 100644 --- a/nomos/raw/p2p-network-bootstrapping.html +++ b/nomos/raw/p2p-network-bootstrapping.html @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -177,23 +177,24 @@ - -title: P2P-NETWORK-BOOTSTRAPPING -name: Nomos P2P Network Bootstrapping Specification -status: raw -category: networking -tags: [p2p, networking, bootstrapping, peer-discovery, libp2p] -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors: + P2P-NETWORK-BOOTSTRAPPING + + +NameNomos P2P Network Bootstrapping Specification +Statusraw +Categorynetworking +EditorDaniel Sanchez-Quiros <danielsq@status.im> +ContributorsÁlvaro Castro-Castilla <alvaro@status.im>Petar Radovic <petar@status.im>Gusto Bacvinka <augustinas@status.im>Antonio Antonino <antonio@status.im>Youngjoon Lee <youngjoon@status.im>Filip Dimitrijevic <filip@status.im> + + + +Timeline -Álvaro Castro-Castilla alvaro@status.im -Petar Radovic petar@status.im -Gusto Bacvinka augustinas@status.im -Antonio Antonino antonio@status.im -Youngjoon Lee youngjoon@status.im -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — aa8a3b0 — Created nomos/raw/p2p-network-bootstrapping.md draft (#175) - + Introduction Nomos network bootstrapping is the process by which a new node discovers peers and synchronizes with the existing decentralized network. It ensures that a node can: @@ -381,6 +382,7 @@ contributors: + diff --git a/nomos/raw/p2p-network.html b/nomos/raw/p2p-network.html index f8aa589..56eee66 100644 --- a/nomos/raw/p2p-network.html +++ b/nomos/raw/p2p-network.html @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -177,18 +177,24 @@ - -title: NOMOS-P2P-NETWORK -name: Nomos P2P Network Specification -status: draft -category: networking -tags: [p2p, networking, libp2p, kademlia, gossipsub, quic] -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors: + NOMOS-P2P-NETWORK + + +NameNomos P2P Network Specification +Statusdraft +Categorynetworking +EditorDaniel Sanchez-Quiros <danielsq@status.im> +ContributorsFilip Dimitrijevic <filip@status.im> + + + +Timeline -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — a3a5b91 — Created nomos/raw/p2p-network.md file (#169) - + Abstract This specification defines the peer-to-peer (P2P) network layer for Nomos blockchain nodes. The network serves as the comprehensive communication infrastructure enabling transaction dissemination through mempool and block propagation. The specification leverages established libp2p protocols to ensure robust, scalable performance with low bandwidth requirements and minimal latency while maintaining accessibility for diverse hardware configurations and network environments. Motivation @@ -483,6 +489,7 @@ contributors: + diff --git a/nomos/raw/sdp.html b/nomos/raw/sdp.html index c1352e6..a2e4f44 100644 --- a/nomos/raw/sdp.html +++ b/nomos/raw/sdp.html @@ -89,7 +89,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -177,24 +177,23 @@ - -title: NOMOS-SDP -name: Nomos Service Declaration Protocol Specification -status: raw -category: -tags: participation, validators, declarations -editor: Marcin Pawlowski marcin@status.im -contributors: + NOMOS-SDP + + +NameNomos Service Declaration Protocol Specification +Statusraw +EditorMarcin Pawlowski <marcin@status.im> +ContributorsMehmet <mehmet@status.im>Daniel Sanchez Quiros <danielsq@status.im>Álvaro Castro-Castilla <alvaro@status.im>Thomas Lavaur <thomaslavaur@status.im>Filip Dimitrijevic <filip@status.im>Gusto Bacvinka <augustinas@status.im>David Rusu <davidrusu@status.im> + + + +Timeline -Mehmet mehmet@status.im -Daniel Sanchez Quiros danielsq@status.im -Álvaro Castro-Castilla alvaro@status.im -Thomas Lavaur thomaslavaur@status.im -Filip Dimitrijevic filip@status.im -Gusto Bacvinka augustinas@status.im -David Rusu davidrusu@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — 53dfb97 — Created nomos/raw/sdp.md draft (#157) - + Introduction This document defines a mechanism enabling validators to declare their participation in specific protocols that require a known and agreed-upon list of participants. Some examples of this are Data Availability and the Blend Network. We create a single repository of identifiers which is used to establish secure communication between validators and provide services. Before being admitted to the repository, the validator proves that it locked at least a minimum stake. Requirements @@ -439,7 +438,7 @@ d. The nonce is increasing monotonically. - + @@ -453,7 +452,7 @@ d. The nonce is increasing monotonically. - + @@ -477,6 +476,7 @@ d. The nonce is increasing monotonically. + diff --git a/print.html b/print.html index bf0961a..f10284d 100644 --- a/print.html +++ b/print.html @@ -90,7 +90,7 @@ - IntroductionVac1. 1/COSS2. 2/MVDS3. 3/Remote Log4. 4/MVDS Meta5. 25/Libp2p DNS Discovery6. 32/RLN-V17. Raw7.1. Consensus Hashgraphlike7.2. Decentralized Messaging Ethereum7.3. ETH MLS Offchain7.4. ETH MLS Onchain7.5. ETH SecPM7.6. Gossipsub Tor Push7.7. Logos Capability Discovery7.8. Mix7.9. Noise X3DH Double Ratchet7.10. RLN Interep Spec7.11. RLN Stealth Commitments7.12. RLN-V27.13. SDS8. TemplateWaku9. Overview10. Standards - Core10.1. 10/Waku210.2. 11/Relay10.3. 12/Filter10.4. 13/Store10.5. 14/Message10.6. 15/Bridge10.7. 17/RLN Relay10.8. 19/Lightpush10.9. 31/ENR10.10. 33/Discv510.11. 34/Peer Exchange10.12. 36/Bindings API10.13. 64/Network10.14. 66/Metadata11. Standards - Application11.1. 20/Toy ETH PM11.2. 26/Payload11.3. 53/X3DH11.4. 54/X3DH Sessions12. Standards - Legacy12.1. 6/Waku112.2. 7/Data12.3. 8/Mail12.4. 9/RPC13. Informational13.1. 22/Toy Chat13.2. 23/Topics13.3. 27/Peers13.4. 29/Config13.5. 30/Adaptive Nodes14. Deprecated14.1. 5/Waku014.2. 16/RPC14.3. 18/Swap14.4. Fault Tolerant StoreNomos15. Overview16. Raw16.1. NomosDA Encoding16.2. NomosDA Network16.3. P2P Hardware Requirements16.4. P2P NAT Solution16.5. P2P Network Bootstrapping16.6. P2P Network16.7. SDP17. Deprecated17.1. ClaroCodex18. Overview19. Raw19.1. Block Exchange19.2. MarketplaceStatus20. Overview21. 24/Curation22. 28/Featuring23. 55/1-to-1 Chat24. 56/Communities25. 61/Community History Service26. 62/Payloads27. 63/Keycard Usage28. 65/Account Address29. 71/Push Notification Server30. Raw30.1. Simple Scaling30.2. Status App Protocols30.3. Status MVDS30.4. URL Data30.5. URL Scheme31. Deprecated31.1. 3rd Party31.2. Account31.3. Client31.4. Dapp Browser API Usage31.5. EIPs31.6. Ethereum Usage31.7. Group Chat31.8. IPFS Gateway for Sticker Pack31.9. Keycard Usage for Wallet and Chat Keys31.10. Notifications31.11. Payloads31.12. Push Notification Server31.13. Secure Transport31.14. Waku Mailserver31.15. Waku Usage31.16. Whisper Mailserver31.17. Whisper Usage + Introduction1. Vac1.1. 1/COSS1.2. 2/MVDS1.3. 3/Remote Log1.4. 4/MVDS Meta1.5. 25/Libp2p DNS Discovery1.6. 32/RLN-V11.7. Raw1.7.1. Consensus Hashgraphlike1.7.2. Decentralized Messaging Ethereum1.7.3. ETH MLS Offchain1.7.4. ETH MLS Onchain1.7.5. ETH SecPM1.7.6. Gossipsub Tor Push1.7.7. Logos Capability Discovery1.7.8. Mix1.7.9. Noise X3DH Double Ratchet1.7.10. RLN Interep Spec1.7.11. RLN Stealth Commitments1.7.12. RLN-V21.7.13. SDS1.8. Template2. Waku2.1. Standards - Core2.1.1. 10/Waku22.1.2. 11/Relay2.1.3. 12/Filter2.1.4. 13/Store2.1.5. 14/Message2.1.6. 15/Bridge2.1.7. 17/RLN Relay2.1.8. 19/Lightpush2.1.9. 31/ENR2.1.10. 33/Discv52.1.11. 34/Peer Exchange2.1.12. 36/Bindings API2.1.13. 64/Network2.1.14. 66/Metadata2.2. Standards - Application2.2.1. 20/Toy ETH PM2.2.2. 26/Payload2.2.3. 53/X3DH2.2.4. 54/X3DH Sessions2.3. Standards - Legacy2.3.1. 6/Waku12.3.2. 7/Data2.3.3. 8/Mail2.3.4. 9/RPC2.4. Informational2.4.1. 22/Toy Chat2.4.2. 23/Topics2.4.3. 27/Peers2.4.4. 29/Config2.4.5. 30/Adaptive Nodes2.5. Deprecated2.5.1. 5/Waku02.5.2. 16/RPC2.5.3. 18/Swap2.5.4. Fault Tolerant Store3. Nomos3.1. Raw3.1.1. NomosDA Encoding3.1.2. NomosDA Network3.1.3. P2P Hardware Requirements3.1.4. P2P NAT Solution3.1.5. P2P Network Bootstrapping3.1.6. P2P Network3.1.7. SDP3.2. Deprecated3.2.1. Claro4. Codex4.1. Raw4.1.1. Block Exchange4.1.2. Marketplace5. Status5.1. 24/Curation5.2. 28/Featuring5.3. 55/1-to-1 Chat5.4. 56/Communities5.5. 61/Community History Service5.6. 62/Payloads5.7. 63/Keycard Usage5.8. 65/Account Address5.9. 71/Push Notification Server5.10. Raw5.10.1. Simple Scaling5.10.2. Status App Protocols5.10.3. Status MVDS5.10.4. URL Data5.10.5. URL Scheme5.11. Deprecated5.11.1. 3rd Party5.11.2. Account5.11.3. Client5.11.4. Dapp Browser API Usage5.11.5. EIPs5.11.6. Ethereum Usage5.11.7. Group Chat5.11.8. IPFS Gateway for Sticker Pack5.11.9. Keycard Usage for Wallet and Chat Keys5.11.10. Notifications5.11.11. Payloads5.11.12. Push Notification Server5.11.13. Secure Transport5.11.14. Waku Mailserver5.11.15. Waku Usage5.11.16. Whisper Mailserver5.11.17. Whisper Usage @@ -178,61 +178,81 @@ - Vac Request For Comments(RFC) -NOTE: This repo is WIP. We are currently restructuring the RFC process. -This repository contains specifications from the Waku, Nomos, -Codex, and -Status projects that are part of the IFT portfolio. -Vac is an -IFT service that will manage the RFC, -Request for Comments, -process within this repository. -New RFC Process -This repository replaces the previous rfc.vac.dev resource. -Each project will maintain initial specifications in separate repositories, -which may be considered as a raw specification. -All Vac raw specifications and -discussions will live in the Vac subdirectory. -When projects have reached some level of maturity -for a specification living in their repository, -the process of updating the status to draft may begin in this repository. -Specifications will adhere to -1/COSS before obtaining draft status. -Implementations should follow specifications as described, -and all contributions will be discussed before the stable status is obtained. -The goal of this RFC process will to engage all interseted parities and -reach a rough consensus for techcinal specifications. -Contributing -Please see 1/COSS for general guidelines and specification lifecycle. -Feel free to join the Vac discord. -Here's the project board used by core contributors and maintainers: Projects -IFT Projects' Raw Specifications -The repository for each project raw specifications: + Vac RFC Index +An IETF-style index of Vac-managed RFCs across Waku, Nomos, Codex, and Status. Use the filters below to jump straight to a specification. + + + + + All + Stable + Draft + Raw + Deprecated + Deleted + + + + + All projects + Vac + Waku + Status + Nomos + Codex + + + + 1/COSS (Process) + Vac index + Waku index + Status index + Nomos index + Codex index + + + + Loading RFC index... + Click a column to sort + + + + JavaScript is required to load the RFC index table. + +Vac RFCs +Vac builds public good protocols for the decentralised web. +Vac acts as a custodian for the protocols that live in the RFC-Index repository. +With the goal of widespread adoption, +Vac will make sure the protocols adhere to a set of principles, +including but not limited to liberty, security, privacy, decentralisation and inclusivity. +To learn more, visit Vac Research +1/COSS + + +NameConsensus-Oriented Specification System +Slug1 +Statusdraft +CategoryBest Current Practice +EditorDaniel Kaiser <danielkaiser@status.im> +ContributorsOskar Thoren <oskarth@titanproxy.com>Pieter Hintjens <ph@imatix.com>André Rebentisch <andre@openstandards.de>Alberto Barrionuevo <abarrio@opentia.es>Chris Puttick <chris.puttick@thehumanjourney.net>Yurii Rashkovskii <yrashk@gmail.com>Jimmy Debe <jimmy@status.im> + + + +Timeline -Vac Raw Specifications -Status Raw Specifications -Waku Raw Specificiations -Codex Raw Specifications -Nomos Raw Specifications +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-11-04 — dd397ad — Update Coss Date (#206) +2024-10-09 — d5e0072 — cosmetic: fix external links in 1/COSS (#100) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-09 — ed2c68f — 1/COSS: New RFC Process (#4) +2024-02-01 — 3eaccf9 — Update and rename COSS.md to coss.md +2024-01-30 — 990d940 — Rename COSS.md to COSS.md +2024-01-27 — 6495074 — Rename vac/rfcs/01/README.md to vac/01/COSS.md +2024-01-25 — bab16a8 — Rename README.md to README.md +2024-01-25 — a9162f2 — Create README.md - -slug: 1 -title: 1/COSS -name: Consensus-Oriented Specification System -status: draft -category: Best Current Practice -editor: Daniel Kaiser danielkaiser@status.im -contributors: - -Oskar Thoren oskarth@titanproxy.com -Pieter Hintjens ph@imatix.com -André Rebentisch andre@openstandards.de -Alberto Barrionuevo abarrio@opentia.es -Chris Puttick chris.puttick@thehumanjourney.net -Yurii Rashkovskii yrashk@gmail.com -Jimmy Debe jimmy@status.im - - + This document describes a consensus-oriented specification system (COSS) for building interoperable technical specifications. COSS is based on a lightweight editorial process that @@ -489,24 +509,35 @@ Color coded specifications SHOULD use the following color scheme: - -slug: 2 -title: 2/MVDS -name: Minimum Viable Data Synchronization -status: stable -editor: Sanaz Taheri sanaz@status.im -contributors: +2/MVDS + + +NameMinimum Viable Data Synchronization +Slug2 +Statusstable +EditorSanaz Taheri <sanaz@status.im> +ContributorsDean Eigenmann <dean@status.im>Oskar Thorén <oskarth@titanproxy.com> + + + +Timeline -Dean Eigenmann dean@status.im -Oskar Thorén oskarth@titanproxy.com +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-06-28 — a5b24ac — fix_: broken image links (#81) +2024-02-01 — 0253d53 — Rename MVDS.md to mvds.md +2024-01-30 — 70326d1 — Rename MVDS.md to MVDS.md +2024-01-27 — 472a7fd — Rename vac/rfcs/02/README.md to vac/02/MVDS.md +2024-01-25 — 4362a7b — Create README.md - + In this specification, we describe a minimum viable protocol for -data synchronization inspired by the Bramble Synchronization Protocol1. +data synchronization inspired by the Bramble Synchronization Protocol (BSP). This protocol is designed to ensure reliable messaging between peers across an unreliable peer-to-peer (P2P) network where they may be unreachable or unresponsive. -We present a reference implementation2 +We present a reference implementation1 including a simulation to demonstrate its performance. Definitions TermDescription @@ -647,23 +678,29 @@ therefore we simply resend them every time we receive a MESSAGE.Copyright Copyright and related rights waived via CC0. Footnotes -1 -akwizgran et al. BSP. Briar. - -2 +1 https://github.com/vacp2p/mvds - -slug: 3 -title: 3/REMOTE-LOG -name: Remote log specification -status: draft -editor: Oskar Thorén oskarth@titanproxy.com -contributors: +3/REMOTE-LOG + + +NameRemote log specification +Slug3 +Statusdraft +EditorOskar Thorén <oskarth@titanproxy.com> +ContributorsDean Eigenmann <dean@status.im> + + + +Timeline -Dean Eigenmann dean@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-02-01 — 3fd8b5a — Update and rename README.md to remote-log.md +2024-01-30 — dce61fe — Create README.md - + A remote log is a replication of a local log. This means a node can read data that originally came from a node that is offline. This specification is complemented by a proof of concept implementation1. @@ -827,19 +864,26 @@ Other messages types MAY be uploaded, depending on the implementation. 1 https://github.com/vacp2p/research/tree/master/remote_log - -slug: 4 -title: 4/MVDS-META -name: MVDS Metadata Field -status: draft -editor: Sanaz Taheri sanaz@status.im -contributors: +4/MVDS-META + + +NameMVDS Metadata Field +Slug4 +Statusdraft +EditorSanaz Taheri <sanaz@status.im> +ContributorsDean Eigenmann <dean@status.im>Andrea Maria Piana <andreap@status.im>Oskar Thorén <oskarth@titanproxy.com> + + + +Timeline -Dean Eigenmann dean@status.im -Andrea Maria Piana andreap@status.im -Oskar Thorén oskarth@titanproxy.com +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-02-01 — 3a396b5 — Update and rename README.md to mvds-meta.md +2024-01-30 — 2e80c3b — Create README.md - + In this specification, we describe a method to construct message history that will aid the consistency guarantees of 2/MVDS. Additionally, @@ -907,13 +951,25 @@ As their delivery is not needed to be guaranteed. 3: Jepsen. Causal Consistency Jepsen, LLC. 4: https://en.wikipedia.org/wiki/Eventual_consistency - -slug: 25 -title: 25/LIBP2P-DNS-DISCOVERY -name: Libp2p Peer Discovery via DNS -status: deleted -editor: Hanno Cornelius hanno@status.im -contributors: +25/LIBP2P-DNS-DISCOVERY + + +NameLibp2p Peer Discovery via DNS +Slug25 +Statusdeleted +EditorHanno Cornelius <hanno@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-08 — a3ad14e — Create libp2p-dns-discovery.md + + 25/LIBP2P-DNS-DISCOVERY specifies a scheme to implement libp2p peer discovery via DNS for Waku v2. The generalised purpose is to retrieve an arbitrarily long, authenticated, @@ -1024,22 +1080,30 @@ and verify that the content matches the hash. libp2p peer identity Merkle trees - -slug: 32 -title: 32/RLN-V1 -name: Rate Limit Nullifier -status: draft -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors: +32/RLN-V1 + + +NameRate Limit Nullifier +Slug32 +Statusdraft +EditorAaryamann Challani <p1ge0nh8er@proton.me> +ContributorsBarry Whitehat <barrywhitehat@protonmail.com>Sanaz Taheri <sanaz@status.im>Oskar Thorén <oskarth@titanproxy.com>Onur Kilic <onurkilic1004@gmail.com>Blagoj Dimovski <blagoj.dimovski@yandex.com>Rasul Ibragimov <curryrasul@gmail.com> + + + +Timeline -Barry Whitehat barrywhitehat@protonmail.com -Sanaz Taheri sanaz@status.im -Oskar Thorén oskarth@titanproxy.com -Onur Kilic onurkilic1004@gmail.com -Blagoj Dimovski blagoj.dimovski@yandex.com -Rasul Ibragimov curryrasul@gmail.com +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-05 — eb25cd0 — chore: replace email addresses (#86) +2024-06-06 — cbefa48 — 32/RLN-V1: Move to Draft (#40) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-01 — 94db406 — Update rln-v1.md +2024-02-01 — a23299f — Update and rename RLN-V1.md to rln-v1.md +2024-01-27 — 539575b — Create RLN-V1.md - + Abstract The following specification covers the RLN construct as well as some auxiliary libraries useful for interacting with it. @@ -1695,14 +1759,24 @@ assert!(verified); Vac Raw Specifications All Vac specifications that have not reached draft status will live in this repository. To learn more about raw specifications, take a look at 1/COSS. - -title: HASHGRAPHLIKE CONSENSUS -name: Hashgraphlike Consensus Protocol -status: raw -category: Standards Track -tags: -editor: Ugur Sen ugur@status.im -contributors: seemenkina ekaterina@status.im +HASHGRAPHLIKE CONSENSUS + + +NameHashgraphlike Consensus Protocol +Statusraw +CategoryStandards Track +EditorUgur Sen [ugur@status.im](mailto:ugur@status.im) +Contributorsseemenkina [ekaterina@status.im](mailto:ekaterina@status.im) + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-15 — f051117 — VAC-RAW/Consensus-hashgraphlike RFC (#142) + + Abstract This document specifies a scalable, decentralized, and Byzantine Fault Tolerant (BFT) consensus mechanism inspired by Hashgraph, designed for binary decision-making in P2P networks. @@ -1917,13 +1991,26 @@ in different stages of the protocol, violating vote consistency and attempting t Gossip about gossip Simple implementation of hashgraph consensus - -title: ETH-DCGKA -name: Decentralized Key and Session Setup for Secure Messaging over Ethereum -status: raw -category: informational -editor: Ramses Fernandez-Valencia ramses@status.im -contributors: +ETH-DCGKA + + +NameDecentralized Key and Session Setup for Secure Messaging over Ethereum +Statusraw +Categoryinformational +EditorRamses Fernandez-Valencia <ramses@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-04 — 517b639 — Update the RFCs: Vac Raw RFC (#143) +2024-10-03 — c655980 — Eth secpm splitted (#91) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-05-27 — 7e3a625 — ETH-SECPM-DEC (#28) + + Abstract This document introduces a decentralized group messaging protocol using Ethereum adresses as identifiers. @@ -2630,15 +2717,25 @@ opens the door to some novel research. UPKE from ElGamal UPKE from Lattices - -title: ETH-MLS-OFFCHAIN -name: Secure channel setup using decentralized MLS and Ethereum accounts -status: raw -category: Standards Track -tags: -editor: Ugur Sen ugur@status.im -contributors: seemenkina ekaterina@status.im - +ETH-MLS-OFFCHAIN + + +NameSecure channel setup using decentralized MLS and Ethereum accounts +Statusraw +CategoryStandards Track +EditorUgur Sen [ugur@status.im](mailto:ugur@status.im) +Contributorsseemenkina [ekaterina@status.im](mailto:ekaterina@status.im) + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-11-26 — e39d288 — VAC/RAW/ ETH-MLS-OFFCHAIN RFC multi-steward support (#193) +2025-08-21 — 3b968cc — VAC/RAW/ ETH-MLS-OFFCHAIN RFC (#166) + + Abstract The following document specifies Ethereum authenticated scalable and decentralized secure group messaging application by @@ -3006,14 +3103,32 @@ This design choice is intentional, in order to preserve the efficiency advantage Hashgraphlike Consensus vacp2p/de-mls - -title: ETH-MLS-ONCHAIN -name: Secure channel setup using decentralized MLS and Ethereum accounts -status: raw -category: Standards Track -tags: -editor: Ramses Fernandez ramses@status.im -contributors: Aaryamann Challani aaryamann@status.im, Ekaterina Broslavskaya ekaterina@status.im, Ugur Sen ugur@status.im, Ksr ksr@status.im +ETH-MLS-ONCHAIN + + +NameSecure channel setup using decentralized MLS and Ethereum accounts +Statusraw +CategoryStandards Track +EditorRamses Fernandez <ramses@status.im> +ContributorsAaryamann Challani <aaryamann@status.im>, Ekaterina Broslavskaya <ekaterina@status.im>, Ugur Sen <ugur@status.im>, Ksr <ksr@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-04 — 517b639 — Update the RFCs: Vac Raw RFC (#143) +2024-10-03 — c655980 — Eth secpm splitted (#91) +2024-08-29 — 13aaae3 — Update eth-secpm.md (#84) +2024-05-21 — e234e9d — Update eth-secpm.md (#35) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-28 — b842725 — Update eth-secpm.md +2024-02-01 — f2e1b4c — Rename ETH-SECPM.md to eth-secpm.md +2024-02-01 — 22bb331 — Update ETH-SECPM.md +2024-01-27 — 5b8ce46 — Create ETH-SECPM.md + + Motivation The need for secure communications has become paramount. Traditional centralized messaging protocols are susceptible to various security threats, @@ -3904,14 +4019,32 @@ control mechanisms to restrict who can call the set and get functions. Uniform Resource Identifier WalletConnect URI Format - -title: ETH-SECPM -name: Secure channel setup using Ethereum accounts -status: deleted -category: Standards Track -tags: -editor: Ramses Fernandez ramses@status.im -contributors: +ETH-SECPM + + +NameSecure channel setup using Ethereum accounts +Statusdeleted +CategoryStandards Track +EditorRamses Fernandez <ramses@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-06-05 — 36caaa6 — Fix Errors rfc.vac.dev (#165) +2025-06-02 — db90adc — Fix LaTeX errors (#163) +2025-04-04 — 517b639 — Update the RFCs: Vac Raw RFC (#143) +2024-08-29 — 13aaae3 — Update eth-secpm.md (#84) +2024-05-21 — e234e9d — Update eth-secpm.md (#35) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-28 — b842725 — Update eth-secpm.md +2024-02-01 — f2e1b4c — Rename ETH-SECPM.md to eth-secpm.md +2024-02-01 — 22bb331 — Update ETH-SECPM.md +2024-01-27 — 5b8ce46 — Create ETH-SECPM.md + + NOTE The content of this specification has been split between ETH-DEMLS and NOISE-X3DH-RATCHET @@ -5101,14 +5234,26 @@ the prospective key package has not been already used. Uniform Resource Identifier WalletConnect URI Format - -title: GOSSIPSUB-TOR-PUSH -name: Gossipsub Tor Push -status: raw -category: Standards Track -tags: -editor: Daniel Kaiser danielkaiser@status.im -contributors: +GOSSIPSUB-TOR-PUSH + + +NameGossipsub Tor Push +Statusraw +CategoryStandards Track +EditorDaniel Kaiser <danielkaiser@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-05-27 — 99be3b9 — Move Raw Specs (#37) +2024-02-01 — cd8c9f4 — Update and rename GOSSIPSUB-TOR-PUSH.md to gossipsub-tor-push.md +2024-01-27 — 0db60c1 — Create GOSSIPSUB-TOR-PUSH.md + + Abstract This document extends the libp2p gossipsub specification specifying gossipsub Tor Push, @@ -5277,15 +5422,24 @@ For the best protection, these contexts should run on separate physical machines Bitcoin over Tor isn't a Good Idea 17/WAKU2-RLN-RELAY - -title: LOGOS-CAPABILITY-DISCOVERY -name: Logos Capability Discovery Protocol -status: raw -category: Standards Track -tags: -editor: Arunima Chaudhuri arunima@status.im -contributors: Ugur Sen ugur@status.im - +LOGOS-CAPABILITY-DISCOVERY + + +NameLogos Capability Discovery Protocol +Statusraw +CategoryStandards Track +EditorArunima Chaudhuri [arunima@status.im](mailto:arunima@status.im) +ContributorsUgur Sen [ugur@status.im](mailto:ugur@status.im) + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-12-09 — aaf158a — VAC/RAW/LOGOS-DISCOVERY-CAPABILITY RFC (#212) + + Note: This specification is currently a WIP and undergoing a high rate of changes. @@ -6390,14 +6544,33 @@ without keeping any per-request state before the ad is admitted to Because waiting times are recalculated and tickets are stored only on the advertiser’s side, the registrar is protected from memory exhaustion and DoS attacks caused by inactive or malicious advertisers. - -title: LIBP2P-MIX -name: Libp2p Mix Protocol -status: raw -category: Standards Track -tags: -editor: Prem Prathi premprathi@proton.me -contributors: Akshaya Mani akshaya@status.im, Daniel Kaiser danielkaiser@status.im +LIBP2P-MIX + + +NameLibp2p Mix Protocol +Statusraw +CategoryStandards Track +EditorPrem Prathi <premprathi@proton.me> +ContributorsAkshaya Mani <akshaya@status.im>, Daniel Kaiser <danielkaiser@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-12-15 — dabc317 — fixing format errors in mix rfc (#229) +2025-12-12 — 4f54254 — fix format errors in math sections for mix rfc (#225) +2025-12-11 — 7f1df32 — chore: use sembreaks for easy review and edits (#223) +2025-12-10 — e742cd5 — RFC Addition: Section 9 Security Considerations (#194) +2025-12-10 — 9d11a22 — docs: finalize Section 8 Sphinx Packet Construction and Handling (#202) +2025-10-05 — 36be428 — RFC Refactor: Sphinx Packet Format (#173) +2025-06-27 — 5e3b478 — RFC Refactor PR: Modular Rewrite of Mix Protocol Specification (#158) +2025-06-02 — db90adc — Fix LaTeX errors (#163) +2024-11-08 — 38fce27 — typo fix +2024-09-16 — 7f5276e — libp2p Mix Protocol Spec Draft (#97) + + Abstract The Mix Protocol defines a decentralized anonymous message routing layer for libp2p networks. It enables sender anonymity by routing each message through a decentralized mix overlay network composed of participating libp2p nodes, known as mix nodes. @@ -7466,14 +7639,24 @@ However, these protections do not prevent adversaries from injecting large volum DoS protection—such as admission control, rate-limiting, or resource-bound access—MUST be implemented outside the core protocol. Any such mechanism MUST preserve sender unlinkability and SHOULD be evaluated carefully to avoid introducing correlation risks. Defending against large-scale DoS attacks is considered a deployment-level responsibility and is out of scope for this specification. - -title: NOISE-X3DH-DOUBLE-RATCHET -name: Secure 1-to-1 channel setup using X3DH and the double ratchet -status: raw -category: Standards Track -tags: -editor: Ramses Fernandez ramses@status.im -contributors: +NOISE-X3DH-DOUBLE-RATCHET + + +NameSecure 1-to-1 channel setup using X3DH and the double ratchet +Statusraw +CategoryStandards Track +EditorRamses Fernandez <ramses@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-04 — 517b639 — Update the RFCs: Vac Raw RFC (#143) +2024-10-03 — c655980 — Eth secpm splitted (#91) + + Motivation The need for secure communications has become paramount. This specification outlines a protocol describing a @@ -7748,14 +7931,27 @@ communication. The Double Ratchet Algorithm The X3DH Key Agreement Protocol - -title: RLN-INTEREP-SPEC -name: Interep as group management for RLN -status: raw -category: -tags: rln -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors: +RLN-INTEREP-SPEC + + +NameInterep as group management for RLN +Statusraw +EditorAaryamann Challani <p1ge0nh8er@proton.me> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-05 — eb25cd0 — chore: replace email addresses (#86) +2024-05-27 — 99be3b9 — Move Raw Specs (#37) +2024-02-01 — 860bae2 — Update rln-interep-spec.md +2024-02-01 — 3f722d9 — Update and rename README.md to rln-interep-spec.md +2024-01-30 — ea62398 — Create README.md + + Abstract This spec integrates Interep into the RLN spec. @@ -7861,16 +8057,25 @@ previously in proof verification. RLN contract RLNP2P - -title: RLN-STEALTH-COMMITMENTS -name: RLN Stealth Commitment Usage -category: Standards Track -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors: +RLN-STEALTH-COMMITMENTS + + +NameRLN Stealth Commitment Usage +CategoryStandards Track +EditorAaryamann Challani <p1ge0nh8er@proton.me> +ContributorsJimmy Debe <jimmy@status.im> + + + +Timeline -Jimmy Debe jimmy@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-05 — eb25cd0 — chore: replace email addresses (#86) +2024-04-15 — 0b0e00f — feat(rln-stealth-commitments): add initial tech writeup (#23) - + Abstract This specification describes the usage of stealth commitments to add prospective users to a network-governed @@ -7965,16 +8170,26 @@ which also includes a test to generate a stealth commitment for a given user.32/RLN-V1 ERC-5564 - -title: RLN-V2 -name: Rate Limit Nullifier V2 -status: raw -editor: Rasul Ibragimov curryrasul@gmail.com -contributors: +RLN-V2 + + +NameRate Limit Nullifier V2 +Statusraw +EditorRasul Ibragimov <curryrasul@gmail.com> +ContributorsLev Soukhanov <0xdeadfae@gmail.com> + + + +Timeline -Lev Soukhanov 0xdeadfae@gmail.com +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-05-27 — 99be3b9 — Move Raw Specs (#37) +2024-02-01 — 8342636 — Update and rename RLN-V2.md to rln-v2.md +2024-01-27 — d7e84b4 — Create RLN-V2.md - + Abstract The protocol specified in this document is an improvement of 32/RLN-V1, being more general construct, that allows to set various limits for an epoch @@ -8155,16 +8370,34 @@ this spec inherits all the security considerations of 2 3 - -title: SDS -name: Scalable Data Sync protocol for distributed logs -status: raw -editor: Hanno Cornelius hanno@status.im -contributors: +SDS + + +NameScalable Data Sync protocol for distributed logs +Statusraw +EditorHanno Cornelius <hanno@status.im> +ContributorsAkhil Peddireddy <akhil@status.im> + + + +Timeline -Akhil Peddireddy akhil@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-10-24 — 6980237 — Fix Linting Errors (#204) +2025-10-13 — 171e934 — docs: add SDS-Repair extension (#176) +2025-10-02 — 6672c5b — docs: update lamport timestamps to uint64, pegged to current time (#196) +2025-09-15 — b1da703 — fix: use milliseconds for Lamport timestamp initialization (#179) +2025-08-22 — 3505da6 — sds lint fix (#177) +2025-08-19 — 536d31b — docs: re-add sender ID to messages (#170) +2025-03-07 — 8ee2a6d — docs: add optional retrieval hint to causal history in sds (#130) +2025-02-20 — 235c1d5 — docs: clarify receiving sync messages (#131) +2025-02-18 — 7182459 — docs: update sds sync message requirements (#129) +2025-01-28 — 7a01711 — fix(sds): remove optional from causal history field in Message protobuf (#123) +2024-12-17 — 08b363d — Update SDS.md: Remove Errors (#115) +2024-11-28 — bee78c4 — docs: add SDS protocol for scalable e2e reliability (#108) - + Abstract This specification introduces the Scalable Data Sync (SDS) protocol to achieve end-to-end reliability @@ -8590,16 +8823,17 @@ if there are any eligible items in the outgoing repair request buffer, regardless of whether other participants have also recently broadcast a Periodic Sync message. Copyright Copyright and related rights waived via CC0. - -slug: XX -title: TEMPLATE -name: RFC Template -status: raw/draft/stable/deprecated -category: Standards Track/Informational/Best Current Practice -tags: an optional list of tags, not standard -editor: Daniel Kaiser danielkaiser@status.im -contributors: -(Info, remove this section) +TEMPLATE + + +NameRFC Template +SlugXX +Statusraw/draft/stable/deprecated +CategoryStandards Track/Informational/Best Current Practice +EditorDaniel Kaiser <danielkaiser@status.im> + + +## (Info, remove this section) This section contains meta info about writing RFCs. This section (including its subsections) MUST be removed. COSS explains the Vac RFC process. @@ -8661,21 +8895,40 @@ See RFC3967 censorship-resistant communication protocols for web3 applications. Contributors can visit Waku RFCs for new Waku specifications under discussion. - -slug: 10 -title: 10/WAKU2 -name: Waku v2 -status: draft -editor: Hanno Cornelius hanno@status.im -contributors: +Waku Standards - Core +Core Waku protocol specifications, including messaging, peer discovery, and network primitives. +10/WAKU2 + + +NameWaku v2 +Slug10 +Statusdraft +EditorHanno Cornelius <hanno@status.im> +ContributorsSanaz Taheri <sanaz@status.im>Hanno Cornelius <hanno@status.im>Reeshav Khan <reeshav@status.im>Daniel Kaiser <danielkaiser@status.im>Oskar Thorén <oskarth@titanproxy.com> + + + +Timeline -Sanaz Taheri sanaz@status.im -Hanno Cornelius hanno@status.im -Reeshav Khan reeshav@status.im -Daniel Kaiser danielkaiser@status.im -Oskar Thorén oskarth@titanproxy.com +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-15 — 34aa3f3 — Fix links 10/WAKU2 (#153) +2025-04-09 — cafa04f — 10/WAKU2: Update (#125) +2024-11-20 — ff87c84 — Update Waku Links (#104) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-01 — 8e14d58 — Update waku2.md +2024-02-01 — 6cf68fd — Update waku2.md +2024-02-01 — 6734b16 — Update waku2.md +2024-01-31 — 356649a — Update and rename WAKU2.md to waku2.md +2024-01-27 — 550238c — Rename README.md to WAKU2.md +2024-01-27 — eef961b — remove rfs folder +2024-01-26 — d6651b7 — Update README.md +2024-01-25 — 6e98666 — Rename README.md to README.md +2024-01-25 — 9b740d8 — Rename waku/10/README.md to waku/specs/standards/core/10-WAKU2/README.md +2024-01-24 — 330c35b — Create README.md - + Abstract Waku is a family of modular peer-to-peer protocols for secure communication. The protocols are designed to be secure, privacy-preserving, censorship-resistant @@ -9223,581 +9476,30 @@ for more details on this piece of work. 21/WAKU2-FAULT-TOLERANT-STORE - -slug: 10 -title: 10/WAKU2 -name: Waku v2 -status: draft -editor: Hanno Cornelius hanno@status.im -contributors: - -Sanaz Taheri sanaz@status.im -Hanno Cornelius hanno@status.im -Reeshav Khan reeshav@status.im -Daniel Kaiser danielkaiser@status.im -Oskar Thorén oskarth@titanproxy.com - - -Abstract -Waku is a family of modular peer-to-peer protocols for secure communication. -The protocols are designed to be secure, privacy-preserving, censorship-resistant -and being able to run in resource-restricted environments. -At a high level, it implements Pub/Sub over libp2p -and adds a set of capabilities to it. -These capabilities are things such as: -(i) retrieving historical messages for mostly-offline devices -(ii) adaptive nodes, allowing for heterogeneous nodes to contribute to the network -(iii) preserving bandwidth usage for resource-restriced devices -This makes Waku ideal for running a p2p protocol on mobile devices and -other similar restricted environments. -Historically, it has its roots in 6/WAKU1, -which stems from Whisper, -originally part of the Ethereum stack. -However, Waku acts more as a thin wrapper for Pub/Sub and has a different API. -It is implemented in an iterative manner where initial focus -is on porting essential functionality to libp2p. -See rough road map (2020) for more historical context. -Motivation and Goals -Waku, as a family of protocols, is designed to have a set of properties -that are useful for many applications: -1.Useful for generalized messaging. -Many applications require some form of messaging protocol to communicate -between different subsystems or different nodes. -This messaging can be human-to-human, machine-to-machine or a mix. -Waku is designed to work for all these scenarios. -2.Peer-to-peer. -Applications sometimes have requirements that make them suitable -for peer-to-peer solutions: - -Censorship-resistant with no single point of failure -Adaptive and scalable network -Shared infrastructure - -3.Runs anywhere. -Applications often run in restricted environments, -where resources or the environment is restricted in some fashion. -For example: - -Limited bandwidth, CPU, memory, disk, battery, etc. -Not being publicly connectable -Only being intermittently connected; mostly-offline - -4.Privacy-preserving. -Applications often have a desire for some privacy guarantees, such as: - -Pseudonymity and not being tied to any personally identifiable information (PII) -Metadata protection in transit -Various forms of unlinkability, etc. - -5.Modular design. -Applications often have different trade-offs when it comes to what properties they -and their users value. -Waku is designed in a modular fashion where an application protocol or -node can choose what protocols they run. -We call this concept adaptive nodes. -For example: - -Resource usage vs metadata protection -Providing useful services to the network vs mostly using it -Stronger guarantees for spam protection vs economic registration cost - -For more on the concept of adaptive nodes and what this means in practice, -please see the 30/ADAPTIVE-NODES spec. -Specification -The keywords “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, -“SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and -“OPTIONAL” in this document are to be interpreted as described in 2119. -Network Interaction Domains -While Waku is best thought of as a single cohesive thing, -there are three network interaction domains: -(a) gossip domain -(b) discovery domain -(c) request/response domain -Protocols and Identifiers -Since Waku is built on top of libp2p, many protocols have a libp2p protocol identifier. -The current main protocol identifiers -are: - -/vac/waku/relay/2.0.0 -/vac/waku/store-query/3.0.0 -/vac/waku/filter/2.0.0-beta1 -/vac/waku/lightpush/2.0.0-beta1 - -This is in addition to protocols that specify messages, payloads, and -recommended usages. -Since these aren't negotiated libp2p protocols, -they are referred to by their RFC ID. -For example: - -14/WAKU2-MESSAGE and -26/WAKU-PAYLOAD for message payloads -23/WAKU2-TOPICS and -27/WAKU2-PEERS for recommendations around usage - -There are also more experimental libp2p protocols such as: - -/vac/waku/waku-rln-relay/2.0.0-alpha1 -/vac/waku/peer-exchange/2.0.0-alpha1 - -The semantics of these protocols are referred to by RFC ID 17/WAKU2-RLN-RELAY and 34/WAKU2-PEER-EXCHANGE. -Use of libp2p and Protobuf -Unless otherwise specified, -all protocols are implemented over libp2p and use Protobuf by default. -Since messages are exchanged over a bi-directional binary stream, -as a convention, -libp2p protocols prefix binary message payloads with -the length of the message in bytes. -This length integer is encoded as a protobuf varint. -Gossip Domain -Waku is using gossiping to disseminate messages throughout the network. -Protocol identifier: /vac/waku/relay/2.0.0 -See 11/WAKU2-RELAY specification for more details. -For an experimental privacy-preserving economic spam protection mechanism, -see 17/WAKU2-RLN-RELAY. -See 23/WAKU2-TOPICS -for more information about the recommended topic usage. -Direct use of libp2p protocols -In addition to /vac/waku/* protocols, -Waku MAY directly use the following libp2p protocols: - -libp2p ping protocol -with protocol id - -/ipfs/ping/1.0.0 - -for liveness checks between peers, or -to keep peer-to-peer connections alive. - -libp2p identity and identity/push -with protocol IDs - -/ipfs/id/1.0.0 - -and -/ipfs/id/push/1.0.0 - -respectively, as basic means for capability discovery. -These protocols are anyway used by the libp2p connection -establishment layer Waku is built on. -We plan to introduce a new Vac capability discovery protocol -with better anonymity properties and more functionality. -Transports -Waku is built in top of libp2p, and like libp2p it strives to be transport agnostic. -We define a set of recommended transports in order to achieve a baseline of -interoperability between clients. -This section describes these recommended transports. -Waku client implementations SHOULD support the TCP transport. -Where TCP is supported it MUST be enabled for both dialing and listening, -even if other transports are available. -Waku nodes running in environments that do not allow the use of TCP directly, -MAY use other transports. -A Waku node SHOULD support secure websockets for bidirectional communication streams, -for example in a web browser context. -A node MAY support unsecure websockets if required by the application or -running environment. -Discovery Domain -Discovery Methods -Waku can retrieve a list of nodes to connect to using DNS-based discovery -as per EIP-1459. -While this is a useful way of bootstrapping connection to a set of peers, -it MAY be used in conjunction with an ambient peer discovery -procedure to find other nodes to connect to, -such as Node Discovery v5. -It is possible to bypass the discovery domain by specifying static nodes. -Use of ENR -WAKU2-ENR -describes the usage of EIP-778 ENR (Ethereum Node Records) -for Waku discovery purposes. -It introduces two new ENR fields, multiaddrs and -waku2, that a Waku node MAY use for discovery purposes. -These fields MUST be used under certain conditions, as set out in the specification. -Both EIP-1459 DNS-based discovery and Node Discovery v5 operate on ENR, -and it's reasonable to expect even wider utility for ENR in Waku networks in the future. -Request/Response Domain -In addition to the Gossip domain, -Waku provides a set of request/response protocols. -They are primarily used in order to get Waku to run in resource restricted environments, -such as low bandwidth or being mostly offline. -Historical Message Support -Protocol identifier*: /vac/waku/store-query/3.0.0 -This is used to fetch historical messages for mostly offline devices. -See 13/WAKU2-STORE spec specification for more details. -There is also an experimental fault-tolerant addition to the store protocol -that relaxes the high availability requirement. -See 21/WAKU2-FAULT-TOLERANT-STORE -Content Filtering -Protocol identifier*: /vac/waku/filter/2.0.0-beta1 -This is used to preserve more bandwidth when fetching a subset of messages. -See 12/WAKU2-FILTER specification for more details. -LightPush -Protocol identifier*: /vac/waku/lightpush/2.0.0-beta1 -This is used for nodes with short connection windows and -limited bandwidth to publish messages into the Waku network. -See 19/WAKU2-LIGHTPUSH specification for more details. -Other Protocols -The above is a non-exhaustive list, -and due to the modular design of Waku, -there may be other protocols here that provide a useful service to the Waku network. -Overview of Protocol Interaction -See the sequence diagram below for an overview of how different protocols interact. - - - -We have six nodes, A-F. -The protocols initially mounted are indicated as such. -The PubSub topics pubtopic1 and -pubtopic2 is used for routing and -indicates that it is subscribed to messages on that topic for relay, -see 11/WAKU2-RELAY for details. -Ditto for 13/WAKU2-STORE -where it indicates that these messages are persisted on that node. - - -Node A creates a WakuMessage msg1 with a ContentTopic contentTopic1. -See 14/WAKU2-MESSAGE for more details. -If WakuMessage version is set to 1, -we use the 6/WAKU1 compatible data field with encryption. -See 7/WAKU-DATA for more details. - - -Node F requests to get messages filtered by PubSub topic pubtopic1 and -ContentTopic contentTopic1. -Node D subscribes F to this filter and -will in the future forward messages that match that filter. -See 12/WAKU2-FILTER for more details. - - -Node A publishes msg1 on pubtopic1 and -subscribes to that relay topic. -It then gets relayed further from B to D, but -not C since it doesn't subscribe to that topic. -See 11/WAKU2-RELAY. - - -Node D saves msg1 for possible later retrieval by other nodes. -See 13/WAKU2-STORE. - - -Node D also pushes msg1 to F, -as it has previously subscribed F to this filter. -See 12/WAKU2-FILTER. - - -At a later time, Node E comes online. -It then requests messages matching pubtopic1 and -contentTopic1 from Node D. -Node D responds with messages meeting this (and possibly other) criteria. -See 13/WAKU2-STORE. - - -Appendix A: Upgradability and Compatibility -Compatibility with Waku Legacy -6/WAKU1 and Waku are different protocols all together. -They use a different transport protocol underneath; -6/WAKU1 is devp2p RLPx based while Waku uses libp2p. -The protocols themselves also differ as does their data format. -Compatibility can be achieved only by using a bridge -that not only talks both devp2p RLPx and libp2p, -but that also transfers (partially) the content of a packet from one version -to the other. -See 15/WAKU-BRIDGE for details on a bidirectional bridge mode. -Appendix B: Security -Each protocol layer of Waku provides a distinct service and -is associated with a separate set of security features and concerns. -Therefore, the overall security of Waku -depends on how the different layers are utilized. -In this section, -we overview the security properties of Waku protocols -against a static adversarial model which is described below. -Note that a more detailed security analysis of each Waku protocol -is supplied in its respective specification as well. -Primary Adversarial Model -In the primary adversarial model, -we consider adversary as a passive entity that attempts to collect information -from others to conduct an attack, -but it does so without violating protocol definitions and instructions. -The following are not considered as part of the adversarial model: - -An adversary with a global view of all the peers and their connections. -An adversary that can eavesdrop on communication links -between arbitrary pairs of peers -(unless the adversary is one end of the communication). -Specifically, the communication channels are assumed to be secure. - -Security Features -Pseudonymity -Waku by default guarantees pseudonymity for all of the protocol layers -since parties do not have to disclose their true identity -and instead they utilize libp2p PeerID as their identifiers. -While pseudonymity is an appealing security feature, -it does not guarantee full anonymity since the actions taken under the same pseudonym -i.e., PeerID can be linked together and -potentially result in the re-identification of the true actor. -Anonymity / Unlinkability -At a high level, -anonymity is the inability of an adversary in linking an actor -to its data/performed action (the actor and action are context-dependent). -To be precise about linkability, -we use the term Personally Identifiable Information (PII) -to refer to any piece of data that could potentially -be used to uniquely identify a party. -For example, the signature verification key, and -the hash of one's static IP address are unique for each user and -hence count as PII. -Notice that users' actions can be traced through their PIIs -(e.g., signatures) and hence result in their re-identification risk. -As such, we seek anonymity by avoiding linkability between actions and -the actors / actors' PII. Concerning anonymity, Waku provides the following features: -Publisher-Message Unlinkability: -This feature signifies the unlinkability of a publisher -to its published messages in the 11/WAKU2-RELAY protocol. -The Publisher-Message Unlinkability -is enforced through the StrictNoSign policy due to which the data fields -of pubsub messages that count as PII for the publisher must be left unspecified. -Subscriber-Topic Unlinkability: -This feature stands for the unlinkability of the subscriber -to its subscribed topics in the 11/WAKU2-RELAY protocol. -The Subscriber-Topic Unlinkability -is achieved through the utilization of a single PubSub topic. -As such, subscribers are not re-identifiable from their subscribed topic IDs -as the entire network is linked to the same topic ID. -This level of unlinkability / anonymity is known as k-anonymity -where k is proportional to the system size (number of subscribers). -Note that there is no hard limit on the number of the pubsub topics, however, -the use of one topic is recommended for the sake of anonymity. -Spam protection -This property indicates that no adversary can flood the system -(i.e., publishing a large number of messages in a short amount of time), -either accidentally or deliberately, with any kind of message -i.e. even if the message content is valid or useful. -Spam protection is partly provided in 11/WAKU2-RELAY -through the scoring mechanism -provided for by GossipSub v1.1. -At a high level, -peers utilize a scoring function to locally score the behavior -of their connections and remove peers with a low score. -Data confidentiality, Integrity, and Authenticity -Confidentiality can be addressed through data encryption whereas integrity and -authenticity are achievable through digital signatures. -These features are provided for in 14/WAKU2-MESSAGE (version 1)` -through payload encryption as well as encrypted signatures. -Security Considerations -Lack of anonymity/unlinkability in the protocols involving direct connections -including 13/WAKU2-STORE and 12/WAKU2-FILTER protocols: -The anonymity/unlinkability is not guaranteed in the protocols like 13/WAKU2-STORE -and 12/WAKU2-FILTER where peers need to have direct connections -to benefit from the designated service. -This is because during the direct connections peers utilize PeerID -to identify each other, -therefore the service obtained in the protocol is linkable -to the beneficiary's PeerID (which counts as PII). -For 13/WAKU2-STORE, -the queried node would be able to link the querying node's PeerID -to its queried topics. -Likewise, in the 12/WAKU2-FILTER, -a full node can link the light node's PeerIDs to its content filter. - - -Appendix C: Implementation Notes -Implementation Matrix -There are multiple implementations of Waku and its protocols: - -nim-waku (Nim) -go-waku (Go) -js-waku (NodeJS and Browser) - -Below you can find an overview of the specifications that they implement -as they relate to Waku. -This includes Waku legacy specifications, as they are used for bridging between the two networks. -Specnim-waku (Nim)go-waku (Go)js-waku (Node JS)js-waku (Browser JS) -6/WAKU1✔ -7/WAKU-DATA✔✔ -8/WAKU-MAIL✔ -9/WAKU-RPC✔ -10/WAKU2✔🚧🚧✔ -11/WAKU2-RELAY✔✔✔✔ -12/WAKU2-FILTER✔✔ -13/WAKU2-STORE✔✔✔*✔* -14/WAKU2-MESSAGE)✔✔✔✔ -15/WAKU2-BRIDGE✔ -16/WAKU2-RPC✔ -17/WAKU2-RLN-RELAY🚧 -18/WAKU2-SWAP🚧 -19/WAKU2-LIGHTPUSH✔✔✔**✔** -21/WAKU2-FAULT-TOLERANT-STORE✔✔ - +11/WAKU2-RELAY + + +NameWaku v2 Relay +Slug11 +Statusstable +EditorHanno Cornelius <hanno@status.im> +ContributorsOskar Thorén <oskarth@titanproxy.com>Sanaz Taheri <sanaz@status.im> + -*js-waku implements 13/WAKU2-STORE as a querying node only. -**js-waku only implements 19/WAKU2-LIGHTPUSH requests. -Recommendations for Clients -To implement a minimal Waku client, -we recommend implementing the following subset in the following order: + +Timeline -10/WAKU2 - this specification -11/WAKU2-RELAY - for basic operation -14/WAKU2-MESSAGE - version 0 (unencrypted) -13/WAKU2-STORE - for historical messaging (query mode only) +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-02-01 — b346ad2 — Update relay.md +2024-02-01 — 0904a8b — Update and rename RELAY.md to relay.md +2024-01-27 — 8ff46fa — Rename WAKU2-RELAY.md to RELAY.md +2024-01-27 — 4c4591c — Rename README.md to WAKU2-RELAY.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 6874961 — Create README.md -To get compatibility with Waku Legacy: - -7/WAKU-DATA -14/WAKU2-MESSAGE - version 1 (encrypted with 7/WAKU-DATA) - -For an interoperable keep-alive mechanism: - -libp2p ping protocol, -with periodic pings to connected peers - -Appendix D: Future work -The following features are currently experimental, -under research and initial implementations: -Economic Spam Resistance: -We aim to enable an incentivized spam protection technique -to enhance 11/WAKU2-RELAY by using rate limiting nullifiers. -More details on this can be found in 17/WAKU2-RLN-RELAY. -In this advanced method, -peers are limited to a certain rate of messaging per epoch and -an immediate financial penalty is enforced for spammers who break this rate. -Prevention of Denial of Service (DoS) and Node Incentivization: -Denial of service signifies the case where an adversarial node -exhausts another node's service capacity (e.g., by making a large number of requests) -and makes it unavailable to the rest of the system. -DoS attack is to be mitigated through the accounting model as described in 18/WAKU2-SWAP. -In a nutshell, peers have to pay for the service they obtain from each other. -In addition to incentivizing the service provider, -accounting also makes DoS attacks costly for malicious peers. -The accounting model can be used in 13/WAKU2-STORE and -12/WAKU2-FILTER to protect against DoS attacks. -Additionally, this gives node operators who provide a useful service to the network -an incentive to perform that service. -See 18/WAKU2-SWAP -for more details on this piece of work. -Copyright -Copyright and related rights waived via CC0. -References - - -libp2p specs - - -6/WAKU1 - - -Whisper spec (EIP627) - - -Waku v2 plan - - -30/ADAPTIVE-NODES - - -Protocol Identifiers - - -14/WAKU2-MESSAGE - - -26/WAKU-PAYLOAD - - -23/WAKU2-TOPICS - - -27/WAKU2-PEERS - - -bi-directional binary stream - - -Protobuf varint encoding - - -11/WAKU2-RELAY spec - - -17/WAKU2-RLN-RELAY - - -EIP-1459 - - -Ambient peer discovery - - -Node Discovery v5 - - -WAKU2-ENR - - -EIP-778 ENR (Ethereum Node Records) - - -13/WAKU2-STORE spec - - -21/WAKU2-FT-STORE - - -12/WAKU2-FILTER - - -19/WAKU2-LIGHTPUSH - - -7/WAKU-DATA - - -15/WAKU-BRIDGE - - -k-anonymity - - -GossipSub v1.1 - - -nim-waku (Nim) - - -go-waku (Go) - - -js-waku (NodeJS and Browser) - - -8/WAKU-MAIL - - -9/WAKU-RPC - - -16/WAKU2-RPC - - -18/WAKU2-SWAP spec - - -21/WAKU2-FAULT-TOLERANT-STORE - - - -slug: 11 -title: 11/WAKU2-RELAY -name: Waku v2 Relay -status: stable -tags: waku-core -editor: Hanno Cornelius hanno@status.im -contributors: - -Oskar Thorén oskarth@titanproxy.com -Sanaz Taheri sanaz@status.im - - + 11/WAKU2-RELAY specifies a Publish/Subscribe approach to peer-to-peer messaging with a strong focus on privacy, censorship-resistance, security and scalability. @@ -10040,10 +9742,10 @@ on behalf of the group as such the true signer is indistinguishable from other group members. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 10/WAKU2 @@ -10085,22 +9787,31 @@ is indistinguishable from other group members. Whisper spec (EIP627) - -slug: 12 -title: 12/WAKU2-FILTER -name: Waku v2 Filter -status: draft -tags: waku-core -version: 01 -editor: Hanno Cornelius hanno@status.im -contributors: +12/WAKU2-FILTER + + +NameWaku v2 Filter +Slug12 +Statusdraft +EditorHanno Cornelius <hanno@status.im> +ContributorsDean Eigenmann <dean@status.im>Oskar Thorén <oskar@status.im>Sanaz Taheri <sanaz@status.im>Ebube Ud <ebube@status.im> + + + +Timeline -Dean Eigenmann dean@status.im -Oskar Thorén oskar@status.im -Sanaz Taheri sanaz@status.im -Ebube Ud ebube@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-03-25 — e8a3f8a — 12/WAKU2-FILTER: Update (#119) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-02-01 — e4d8f27 — Update and rename FILTER.md to filter.md +2024-01-27 — 046a3b7 — Rename WAKU2-FILTER.md to FILTER.md +2024-01-27 — 57124a7 — Rename README.md to WAKU2-FILTER.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 940d795 — Rename waku/12/README.md to waku/rfcs/standards/core/12/README.md +2024-01-22 — 420adf1 — Vac RFC index initial structure - + previous versions: 00 Protocol identifiers: @@ -10108,7 +9819,7 @@ contributors: filter-push: /vac/waku/filter-push/2.0.0-beta1 -Abstract +Abstract This specification describes the 12/WAKU2-FILTER protocol, which enables a client to subscribe to a subset of real-time messages from a Waku peer. This is a more lightweight version of 11/WAKU2-RELAY, @@ -10134,7 +9845,7 @@ query for a recent time window, provided it is acceptable to do frequent polling The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in 2119. -Content filtering +Content filtering Content filtering is a way to do message-based filtering. Currently the only content filter being applied is on contentTopic. @@ -10317,7 +10028,7 @@ as it is against the description of the WakuFilter protocol. between arbitrary pairs of nodes (unless the adversary is one end of the communication). In specific, the communication channels are assumed to be secure. -Security Considerations +Security Considerations Note that while using WakuFilter allows light nodes to save bandwidth, it comes with a privacy cost in the sense that they need to disclose their liking topics to the full nodes to retrieve the relevant messages. @@ -10360,10 +10071,10 @@ Examples of such 2PC protocols are Oblivious Transfers and one-way Private Set Intersections (PSI). -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 11/WAKU2-RELAY message-based filtering @@ -10377,24 +10088,34 @@ and one-way Private Set Intersections (PSI). Message Filtering (Wikipedia) Libp2p PubSub spec - topic validation - -slug: 13 -title: 13/WAKU2-STORE -name: Waku Store Query -status: draft -tags: waku-core -version: 01 -editor: Hanno Cornelius hanno@status.im -contributors: +13/WAKU2-STORE + + +NameWaku Store Query +Slug13 +Statusdraft +EditorHanno Cornelius <hanno@status.im> +ContributorsDean Eigenmann <dean@status.im>Oskar Thorén <oskarth@titanproxy.com>Aaryamann Challani <p1ge0nh8er@proton.me>Sanaz Taheri <sanaz@status.im> + + + +Timeline -Dean Eigenmann dean@status.im -Oskar Thorén oskarth@titanproxy.com -Aaryamann Challani p1ge0nh8er@proton.me -Sanaz Taheri sanaz@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-15 — 1b8b2ac — Add missing status to 13/WAKU-STORE (#149) +2025-02-03 — a60a2c4 — 13/WAKU-STORE: Update (#124) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-05 — eb25cd0 — chore: replace email addresses (#86) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-01 — 755be94 — Update and rename STORE.md to store.md +2024-01-27 — 3baed07 — Rename README.md to STORE.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 51e2879 — Create README.md - + Previous version: 00 -Abstract +Abstract This specification explains the WAKU2-STORE protocol, which enables querying of 14/WAKU2-MESSAGEs. Protocol identifier*: /vac/waku/store-query/3.0.0 @@ -10751,33 +10472,43 @@ That is, messages contain the most recent block height perceived by their sender at the time of message generation. This proves accuracy within a range of minutes (e.g., in Bitcoin blockchain) or seconds (e.g., in Ethereum 2.0) from the time of origination. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 14/WAKU2-MESSAGE protocol buffers v3 Open timestamps - -slug: 14 -title: 14/WAKU2-MESSAGE -name: Waku v2 Message -status: stable -category: Standards Track -tags: waku/core-protocol -editor: Hanno Cornelius hanno@status.im -contributors: +14/WAKU2-MESSAGE + + +NameWaku v2 Message +Slug14 +Statusstable +CategoryStandards Track +EditorHanno Cornelius <hanno@status.im> +ContributorsSanaz Taheri <sanaz@status.im>Aaryamann Challani <p1ge0nh8er@proton.me>Lorenzo Delgado <lorenzo@status.im>Abhimanyu Rawat <abhi@status.im>Oskar Thorén <oskarth@titanproxy.com> + + + +Timeline -Sanaz Taheri sanaz@status.im -Aaryamann Challani p1ge0nh8er@proton.me -Lorenzo Delgado lorenzo@status.im -Abhimanyu Rawat abhi@status.im -Oskar Thorén oskarth@titanproxy.com +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-09 — 8052808 — 14/WAKU2-MESSAGE: Move to Stable (#120) +2024-11-20 — ff87c84 — Update Waku Links (#104) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-05 — eb25cd0 — chore: replace email addresses (#86) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-01 — 8e70159 — Update and rename MESSAGE.md to message.md +2024-01-27 — 88df5d8 — Rename README.md to MESSAGE.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 9cd48a8 — Create README.md - -Abstract + +Abstract 10/WAKU2 is a family of modular peer-to-peer protocols for secure communication. These protocols are designed to be secure, privacy-preserving, @@ -10958,7 +10689,7 @@ message.timestamp = 0x175789bfa23f8400 message_hash = 0x483ea950cb63f9b9d6926b262bb36194d3f40a0463ce8446228350bd44e96de4 -Security Considerations +Security Considerations Confidentiality, integrity, and authenticity The level of confidentiality, integrity, and authenticity of the WakuMessage payload is discretionary. @@ -10985,9 +10716,9 @@ for network participants to behave correctly, this attribute is inherently insecure. A malicious actor can tamper with the value of a Waku message’s ephemeral attribute, and the receiver would not be able to verify the integrity of the message. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 10/WAKU2 6/WAKU1 @@ -10999,14 +10730,29 @@ and the receiver would not be able to verify the integrity of the message. WAKU2-NOISE 62/STATUS-PAYLOADS - -slug: 15 -title: 15/WAKU-BRIDGE -name: Waku Bridge -status: draft -tags: waku-core -editor: Hanno Cornelius hanno@status.im -Abstract +15/WAKU-BRIDGE + + +NameWaku Bridge +Slug15 +Statusdraft +EditorHanno Cornelius <hanno@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-01-28 — c3d5fe6 — 15/WAKU2-BRIDGE: Update (#113) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-02-01 — d637b10 — Update and rename BRIDGE.md to bridge.md +2024-01-27 — 4bf2f6e — Rename README.md to BRIDGE.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — f883f26 — Create README.md + + +Abstract This specification describes how 6/WAKU1 traffic can be used with 10/WAKU2 networks. Wire Format @@ -11053,7 +10799,7 @@ copy over the payload and contentFilter fields to the data and topic fields. Next, before posting on the network, the bridge MUST set a new expiry, ttl and do the PoW nonce calculation. -Security Considerations +Security Considerations As mentioned above, a bridge will be posting new 6/WAKU1 envelopes, which requires doing the PoW nonce calculation. @@ -11070,10 +10816,10 @@ not bounce back and forth between the 6/WAKU1 networks. The bridge SHOULD properly track messages with a seen filter, so that no amplification occurs. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 6/WAKU1 10/WAKU2 @@ -11081,22 +10827,35 @@ so that no amplification occurs. 14/WAKU2-MESSAGE 12/WAKU2-FILTER - -slug: 17 -title: 17/WAKU2-RLN-RELAY -name: Waku v2 RLN Relay -status: draft -tags: waku-core -editor: Alvaro Revuelta alvaro@status.im -contributors: +17/WAKU2-RLN-RELAY + + +NameWaku v2 RLN Relay +Slug17 +Statusdraft +EditorAlvaro Revuelta <alvaro@status.im> +ContributorsOskar Thorén <oskarth@titanproxy.com>Aaryamann Challani <p1ge0nh8er@proton.me>Sanaz Taheri <sanaz@status.im>Hanno Cornelius <hanno@status.im> + + + +Timeline -Oskar Thorén oskarth@titanproxy.com -Aaryamann Challani p1ge0nh8er@proton.me -Sanaz Taheri sanaz@status.im -Hanno Cornelius hanno@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-11-20 — 776c1b7 — rfc-index: Update (#110) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-05 — eb25cd0 — chore: replace email addresses (#86) +2024-06-06 — 5064ded — Update 17/WAKU2-RLN-RELAY: Proof Size (#44) +2024-05-28 — 7b443c1 — 17/WAKU2-RLN-RELAY: Update (#32) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-01 — 244ea55 — Update and rename RLN-RELAY.md to rln-relay.md +2024-01-27 — 7bcefac — Rename README.md to RLN-RELAY.md +2024-01-27 — eef961b — remove rfs folder +2024-01-26 — 1ed5919 — Update README.md +2024-01-25 — 4b3b4e3 — Create README.md - -Abstract + +Abstract This specification describes the 17/WAKU2-RLN-RELAY protocol, which is an extension of 11/WAKU2-RELAY to provide spam protection using Rate Limiting Nullifiers (RLN). @@ -11116,7 +10875,7 @@ due to issues around arbitrary exclusion and privacy. with a novel construct of RLN to enable an efficient economic spam prevention mechanism that can be run in resource-constrained environments. -Specification +Specification The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in 2119. @@ -11405,9 +11164,9 @@ of how many roots can be acceptable by a routing peer. The acceptable_root_window_size should indicate how many blocks may have been mined during the time it takes for a peer to receive a message. This formula represents a lower bound of the number of acceptable roots. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 11/WAKU2-RELAY 64/WAKU-NETWORK @@ -11418,20 +11177,32 @@ This formula represents a lower bound of the number of acceptable roots. Shamir secret sharing scheme used in RLN RLN internal nullifier - -slug: 19 -title: 19/WAKU2-LIGHTPUSH -name: Waku v2 Light Push -status: draft -editor: Hanno Cornelius hanno@status.im -contributors: +19/WAKU2-LIGHTPUSH + + +NameWaku v2 Light Push +Slug19 +Statusdraft +EditorHanno Cornelius <hanno@status.im> +ContributorsDaniel Kaiser <danielkaiser@status.im>Oskar Thorén <oskarth@titanproxy.com> + + + +Timeline -Daniel Kaiser danielkaiser@status.im -Oskar Thorén oskarth@titanproxy.com +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-11-20 — ff87c84 — Update Waku Links (#104) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-01 — c88680a — Update and rename LIGHTPUSH.md to lightpush.md +2024-01-27 — f9efd29 — Rename README.md to LIGHTPUSH.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — c90013b — Create README.md - + Protocol identifier: /vac/waku/lightpush/2.0.0-beta1 -Motivation and Goals +Motivation and Goals Light nodes with short connection windows and limited bandwidth wish to publish messages into the Waku network. Additionally, @@ -11467,29 +11238,38 @@ or forward the PushRequest via 19/LIGHTPUSH on a Security Considerations +Security Considerations Since this can introduce an amplification factor, it is RECOMMENDED for the node relaying to the rest of the network to take extra precautions. This can be done by rate limiting via 17/WAKU2-RLN-RELAY. Note that the above is currently not fully implemented. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 11/WAKU2-RELAY WAKU2-DANDELION 17/WAKU2-RLN-RELAY - -slug: 31 -title: 31/WAKU2-ENR -name: Waku v2 usage of ENR -status: draft -tags: [waku/core-protocol] -editor: Franck Royer franck@status.im -contributors: -Abstract +31/WAKU2-ENR + + +NameWaku v2 usage of ENR +Slug31 +Statusdraft +EditorFranck Royer <franck@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-10-16 — e4f5f28 — Update WAKU-ENR: Move to Draft (#180) + + +Abstract This specification describes the usage of the ENR (Ethereum Node Records) format for 10/WAKU2 purposes. The ENR format is defined in EIP-778 [3]. @@ -11636,9 +11416,9 @@ do not have at least one flag set to true. (such as supported protocols), or further interpret the waku2 field as required by the application. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 1 2 @@ -11646,18 +11426,35 @@ or further interpret the waku2 field as required by the application 4 5 - -slug: 33 -title: 33/WAKU2-DISCV5 -name: Waku v2 Discv5 Ambient Peer Discovery -status: draft -editor: Daniel Kaiser danielkaiser@status.im -contributors: +33/WAKU2-DISCV5 + + +NameWaku v2 Discv5 Ambient Peer Discovery +Slug33 +Statusdraft +EditorDaniel Kaiser <danielkaiser@status.im> +ContributorsFilip Dimitrijevic <filip@status.im> + + + +Timeline -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 5971166 — Update discv5.md (#139) +2024-11-20 — 87d4ff7 — Workflow Fix: markdown-lint (#111) +2024-11-20 — dcc579c — Update WAKU2-PEER-EXCHANGE: Move to draft (#7) +2024-11-20 — ff87c84 — Update Waku Links (#104) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-01 — 38d68ce — Update discv5.md +2024-02-01 — b8f8d20 — Update and rename DISCV5.md to discv5.md +2024-01-27 — c6ef447 — Rename README.md to DISCV5.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 037474d — Create README.md - -Abstract + +Abstract 33/WAKU2-DISCV5 specifies a modified version of Ethereum's Node Discovery Protocol v5 as a means for ambient node discovery. @@ -11784,7 +11581,7 @@ as in go-waku. -Security Considerations +Security Considerations Sybil attack Implementations should limit the number of bucket entries that have the same network parameters (IP address / port) to mitigate Sybil attacks. @@ -11815,7 +11612,7 @@ So, this mitigation would come at the cost of giving up overlay routing efficien The efficiency loss is especially severe with a relatively small number of Waku nodes. Properly protecting against eclipse attacks is challenging and raises research questions that we will address in future stages of our discv5 roadmap. -References +References 10/WAKU2 34/WAKU2-PEER-EXCHANGE @@ -11833,22 +11630,30 @@ raises research questions that we will address in future stages of our discv5 ro implementation: Nim implementation: Go -Copyright +Copyright Copyright and related rights waived via CC0. - -slug: 34 -title: 34/WAKU2-PEER-EXCHANGE -name: Waku2 Peer Exchange -status: draft -category: Standards Track -tags: waku/core-protocol -editor: Hanno Cornelius hanno@status.im -contributors: +34/WAKU2-PEER-EXCHANGE + + +NameWaku2 Peer Exchange +Slug34 +Statusdraft +CategoryStandards Track +EditorHanno Cornelius <hanno@status.im> +ContributorsDaniel Kaiser <danielkaiser@status.im> + + + +Timeline -Daniel Kaiser danielkaiser@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-12-07 — 2b297d5 — Update peer-exchange.md to fix a build error (#114) +2024-11-20 — 87d4ff7 — Workflow Fix: markdown-lint (#111) +2024-11-20 — dcc579c — Update WAKU2-PEER-EXCHANGE: Move to draft (#7) - -Abstract + +Abstract This document specifies a simple request-response peer exchange protocol. Responders send information about a requested number of peers. The main purpose of this protocol is providing resource restricted devices with peers. @@ -11965,7 +11770,7 @@ are expected to be replaced. If the number of requests expected per refresh cycle exceeds 600 (10 times the above recommended 60), it is RECOMMENDED to increase the cache size to at least a tenth of that number. -Security Considerations +Security Considerations Privacy and Anonymity The peer exchange protocol specified in this document comes with anonymity and security implications. @@ -12015,9 +11820,9 @@ are not propagated in the relay domain. However, there might still be some form of leakage: ENRs could be used to track peers and facilitate linking attacks. We will investigate this further in our Waku anonymity analysis. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 33/WAKU2-DISCV5 EIP-1459: Node Discovery via DNS @@ -12030,18 +11835,30 @@ We will investigate this further in our Waku anonymity analysis. Waku Relay Anonymity Waku relay no-sign policy - -slug: 36 -title: 36/WAKU2-BINDINGS-API -name: Waku v2 C Bindings API -status: draft -tags: waku-core -editor: Richard Ramos richard@status.im -contributors: +36/WAKU2-BINDINGS-API + + +NameWaku v2 C Bindings API +Slug36 +Statusdraft +EditorRichard Ramos <richard@status.im> +ContributorsFranck Royer <franck@status.im> + + + +Timeline -Franck Royer franck@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-28 — cb56103 — Update bindings-api.md +2024-02-01 — e9469d0 — Update and rename BINDINGS-API.md to bindings-api.md +2024-01-27 — 76e514a — Rename README.md to BINDINGS-API.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 6bd686d — Create README.md - + Introduction Native applications that wish to integrate Waku may not be able to use nwaku and its JSON RPC API due to constraints @@ -13408,19 +13225,31 @@ enr and peerID each node found. onErrCb will be executed with the reason the function execution failed. 2 - The function is missing the onErrCb callback -Copyright +Copyright Copyright and related rights waived via CC0. - -slug: 64 -title: 64/WAKU2-NETWORK -name: Waku v2 Network -status: draft -category: Best Current Practice -tags: waku/application -editor: Hanno Cornelius hanno@status.im -contributors: -Abstract +64/WAKU2-NETWORK + + +NameWaku v2 Network +Slug64 +Statusdraft +CategoryBest Current Practice +EditorHanno Cornelius <hanno@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-02-25 — 0277fd0 — docs: update dead links in 64/Network (#133) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-07-09 — 77029a2 — Add RLNv2 to TheWakuNetwork (#82) +2024-05-10 — e5b859a — Update WAKU2-NETWORK: Move to draft (#5) + + +Abstract This specification describes an opinionated deployment of 10/WAKU2 protocols to form a coherent and shared decentralized messaging network that is open-access, @@ -13503,7 +13332,7 @@ as described in Transports +Transports Relay nodes MUST follow 10/WAKU2 specifications with regards to supporting different transports. If TCP transport is available, @@ -13717,9 +13546,9 @@ and SHOULD use the short length format: the underlying node MUST determine the target pubsub topic(s) from the content topics provided by the application using the hashing mechanism defined in WAKU2-RELAY-SHARDING. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 10/WAKU2 17/WAKU2-RLN-RELAY @@ -13739,19 +13568,28 @@ using the hashing mechanism defined in WAKU2-RELAY-SHARDING The Waku Network Config - -slug: 66 -title: 66/WAKU2-METADATA -name: Waku Metadata Protocol -status: draft -editor: Franck Royer franck@status.im -contributors: +66/WAKU2-METADATA + + +NameWaku Metadata Protocol +Slug66 +Statusdraft +EditorFranck Royer <franck@status.im> +ContributorsFilip Dimitrijevic <filip@status.im>Alvaro Revuelta <alrevuelta@status.im> + + + +Timeline -Filip Dimitrijevic filip@status.im -Alvaro Revuelta alrevuelta@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-07-31 — 4361e29 — Add implementation recommendation for metadata (#168) +2025-05-13 — f829b12 — waku/standards/core/66/metadata.md update (#148) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-04-17 — d82eacc — Update WAKU2-METADATA: Move to draft (#6) - -Abstract + +Abstract This specification describes the metadata that can be associated with a 10/WAKU2 node. Metadata Protocol @@ -13814,27 +13652,44 @@ but not Copyright +Copyright Copyright and related rights waived via CC0. -References +References 10/WAKU2 - -slug: 20 -title: 20/TOY-ETH-PM -name: Toy Ethereum Private Message -status: draft -tags: waku/application -editor: Franck Royer franck@status.im -contributors: +Waku Standards - Application +Application-layer specifications built on top of Waku core protocols. +20/TOY-ETH-PM + + +NameToy Ethereum Private Message +Slug20 +Statusdraft +EditorFranck Royer <franck@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-09 — 3b152e4 — 20/TOY-ETH-PM: Update (#141) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-01-31 — 89a94a5 — Update toy-eth-pm.md +2024-01-30 — c4ff509 — Create toy-eth-pm.md +2024-01-30 — 8841f49 — Update toy-eth-pm.md +2024-01-29 — a16a2b4 — Create toy-eth-pm.md + + Content Topics: Public Key Broadcast: /eth-pm/1/public-key/proto Private Message: /eth-pm/1/private-message/proto -Abstract +Abstract This specification explains the Toy Ethereum Private Message protocol which enables a peer to send an encrypted message to another peer over the Waku network using the peer's Ethereum address. @@ -14024,9 +13879,9 @@ Alice MAY now send an encrypted message to Bob. Alice MUST encrypt her message M using Bob's Encryption Public Key B', as per 26/WAKU-PAYLOAD Asymmetric Encryption specs. Alice SHOULD now publish this message on the Private Message content topic. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 10/WAKU2 Waku Message Version 1 @@ -14037,234 +13892,31 @@ as per 13/WAKU2-STORE The Graph - -slug: 20 -title: 20/TOY-ETH-PM -name: Toy Ethereum Private Message -status: draft -tags: waku/application -editor: Franck Royer franck@status.im -contributors: -Content Topics: +26/WAKU2-PAYLOAD + + +NameWaku Message Payload Encryption +Slug26 +Statusdraft +EditorOskar Thoren <oskarth@titanproxy.com> +ContributorsOskar Thoren <oskarth@titanproxy.com> + + + +Timeline -Public Key Broadcast: /eth-pm/1/public-key/proto -Private Message: /eth-pm/1/private-message/proto +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-03-31 — f08de10 — 26/WAKU2-PAYLOADS: Update (#136) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-01-31 — 33cf551 — Update payload.md +2024-01-31 — 29acb80 — Rename README.md to payload.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 7bd0712 — Create README.md -Abstract -This specification explains the Toy Ethereum Private Message protocol -which enables a peer to send an encrypted message to another peer -over the Waku network using the peer's Ethereum address. -Goal -Alice wants to send an encrypted message to Bob, -where only Bob can decrypt the message. -Alice only knows Bob's Ethereum Address. -The goal of this specification -is to demonstrate how Waku can be used for encrypted messaging purposes, -using Ethereum accounts for identity. -This protocol caters to Web3 wallet restrictions, -allowing it to be implemented using standard Web3 API. -In the current state, -Toy Ethereum Private Message, ETH-PM, has privacy and features limitations, -has not been audited and hence is not fit for production usage. -We hope this can be an inspiration for developers -wishing to build on top of Waku. -Design Requirements -The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, -“SHOULD NOT”, “RECOMMENDED”, “MAY”, and -“OPTIONAL” in this document are to be interpreted as described in 2119. -Variables -Here are the variables used in the protocol and their definition: - -B is Bob's Ethereum address (or account), -b is the private key of B, and is only known by Bob. -B' is Bob's Encryption Public Key, for which b' is the private key. -M is the private message that Alice sends to Bob. - -The proposed protocol MUST adhere to the following design requirements: - -Alice knows Bob's Ethereum address -Bob is willing to participate to Eth-PM, and publishes B' -Bob's ownership of B' MUST be verifiable -Alice wants to send message M to Bob -Bob SHOULD be able to get M using 10/WAKU2 -Participants only have access to their Ethereum Wallet via the Web3 API -Carole MUST NOT be able to read M's content, -even if she is storing it or relaying it -Waku Message Version 1 Asymmetric Encryption -is used for encryption purposes. - -Limitations -Alice's details are not included in the message's structure, -meaning that there is no programmatic way for Bob to reply to Alice -or verify her identity. -Private messages are sent on the same content topic for all users. -As the recipient data is encrypted, -all participants must decrypt all messages which can lead to scalability issues. -This protocol does not guarantee Perfect Forward Secrecy nor Future Secrecy: -If Bob's private key is compromised, past and future messages could be decrypted. -A solution combining regular X3DH -bundle broadcast with Double Ratchet -encryption would remove these limitations; -See the Status secure transport specification -for an example of a protocol that achieves this in a peer-to-peer setting. -Bob MUST decide to participate in the protocol before Alice can send him a message. -This is discussed in more detail in -Consideration for a non-interactive/uncoordinated protocol -The Protocol -Generate Encryption KeyPair -First, Bob needs to generate a keypair for Encryption purposes. -Bob SHOULD get 32 bytes from a secure random source as Encryption Private Key, b'. -Then Bob can compute the corresponding SECP-256k1 Public Key, B'. -Broadcast Encryption Public Key -For Alice to encrypt messages for Bob, -Bob SHOULD broadcast his Encryption Public Key B'. -To prove that the Encryption Public Key B' -is indeed owned by the owner of Bob's Ethereum Account B, -Bob MUST sign B' using B. -Sign Encryption Public Key -To prove ownership of the Encryption Public Key, -Bob must sign it using EIP-712 v3, -meaning calling eth_signTypedData_v3 on his wallet's API. -Note: While v4 also exists, it is not available on all wallets and -the features brought by v4 is not needed for the current use case. -The TypedData to be passed to eth_signTypedData_v3 MUST be as follows, where: - -encryptionPublicKey is Bob's Encryption Public Key, B', -in hex format, without 0x prefix. -bobAddress is Bob's Ethereum address, corresponding to B, -in hex format, with 0x prefix. - -const typedData = { - domain: { - chainId: 1, - name: 'Ethereum Private Message over Waku', - version: '1', - }, - message: { - encryptionPublicKey: encryptionPublicKey, - ownerAddress: bobAddress, - }, - primaryType: 'PublishEncryptionPublicKey', - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - ], - PublishEncryptionPublicKey: [ - { name: 'encryptionPublicKey', type: 'string' }, - { name: 'ownerAddress', type: 'string' }, - ], - }, - } - -Public Key Message -The resulting signature is then included in a PublicKeyMessage, where - -encryption_public_key is Bob's Encryption Public Key B', not compressed, -eth_address is Bob's Ethereum Address B, -signature is the EIP-712 as described above. - -syntax = "proto3"; - -message PublicKeyMessage { - bytes encryption_public_key = 1; - bytes eth_address = 2; - bytes signature = 3; -} - -This MUST be wrapped in a 14/WAKU-MESSAGE version 0, -with the Public Key Broadcast content topic. -Finally, Bob SHOULD publish the message on Waku. -Consideration for a non-interactive/uncoordinated protocol -Alice has to get Bob's public Key to send a message to Bob. -Because an Ethereum Address is part of the hash of the public key's account, -it is not enough in itself to deduce Bob's Public Key. -This is why the protocol dictates that Bob MUST send his Public Key first, -and Alice MUST receive it before she can send him a message. -Moreover, nwaku, the reference implementation of 13/WAKU2-STORE, -stores messages for a maximum period of 30 days. -This means that Bob would need to broadcast his public key -at least every 30 days to be reachable. -Below we are reviewing possible solutions to mitigate this "sign up" step. -Retrieve the public key from the blockchain -If Bob has signed at least one transaction with his account -then his Public Key can be extracted from the transaction's ECDSA signature. -The challenge with this method is that standard Web3 Wallet API -does not allow Alice to specifically retrieve all/any transaction sent by Bob. -Alice would instead need to use the eth.getBlock API -to retrieve Ethereum blocks one by one. -For each block, she would need to check the from value of each transaction -until she finds a transaction sent by Bob. -This process is resource intensive and -can be slow when using services such as Infura due to rate limits in place, -which makes it inappropriate for a browser or mobile phone environment. -An alternative would be to either run a backend -that can connect directly to an Ethereum node, -use a centralized blockchain explorer -or use a decentralized indexing service such as The Graph. -Note that these would resolve a UX issue -only if a sender wants to proceed with air drops. -Indeed, if Bob does not publish his Public Key in the first place -then it MAY be an indication that he does not participate in this protocol -and hence will not receive messages. -However, these solutions would be helpful -if the sender wants to proceed with an air drop of messages: -Send messages over Waku for users to retrieve later, -once they decide to participate in this protocol. -Bob may not want to participate first but may decide to participate at a later stage -and would like to access previous messages. -This could make sense in an NFT offer scenario: -Users send offers to any NFT owner, -NFT owner may decide at some point to participate in the protocol and -retrieve previous offers. -Publishing the public in long term storage -Another improvement would be for Bob not having to re-publish his public key -every 30 days or less. -Similarly to above, -if Bob stops publishing his public key -then it MAY be an indication that he does not participate in the protocol anymore. -In any case, -the protocol could be modified to store the Public Key in a more permanent storage, -such as a dedicated smart contract on the blockchain. -Send Private Message -Alice MAY monitor the Waku network to collect Ethereum Address and -Encryption Public Key tuples. -Alice SHOULD verify that the signatures of PublicKeyMessages she receives -are valid as per EIP-712. -She SHOULD drop any message without a signature or with an invalid signature. -Using Bob's Encryption Public Key, -retrieved via 10/WAKU2, -Alice MAY now send an encrypted message to Bob. -If she wishes to do so, -Alice MUST encrypt her message M using Bob's Encryption Public Key B', -as per 26/WAKU-PAYLOAD Asymmetric Encryption specs. -Alice SHOULD now publish this message on the Private Message content topic. -Copyright -Copyright and related rights waived via CC0. -References - -10/WAKU2 -Waku Message Version 1 -X3DH -Double Ratchet -Status secure transport specification -EIP-712 -13/WAKU2-STORE -The Graph - - -slug: 26 -title: 26/WAKU2-PAYLOAD -name: Waku Message Payload Encryption -status: draft -editor: Oskar Thoren oskarth@titanproxy.com -contributors: - -Oskar Thoren oskarth@titanproxy.com - - -Abstract + +Abstract This specification describes how Waku provides confidentiality, authenticity, and integrity, as well as some form of unlinkability. Specifically, it describes how encryption, decryption and @@ -14277,7 +13929,7 @@ but written in a way that is agnostic and self-contained for EIP-627: Whisper spec as well from RLPx Transport Protocol spec (ECIES encryption) with some modifications. -Specification +Specification The keywords “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in 2119. @@ -14297,7 +13949,7 @@ encrypted as part of the data (Waku legacy) or padding signature -Design requirements +Design requirements Confidentiality: The adversary SHOULD NOT be able to learn what data is being sent from one Waku node @@ -14422,9 +14074,9 @@ SHOULD be a multiple of 256 bytes. In order to decode a message, a node SHOULD try to apply both symmetric and asymmetric decryption operations. This is because the type of encryption is not included in the message. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 6/WAKU1 10/WAKU2 spec @@ -14437,25 +14089,34 @@ This is because the type of encryption is not included in the message. Ethereum "Yellow paper": Appendix F Signing transactions authenticated encryption - -slug: 53 -title: 53/WAKU2-X3DH -name: X3DH usage for Waku payload encryption -status: draft -category: Standards Track -tags: waku-application -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors: +53/WAKU2-X3DH + + +NameX3DH usage for Waku payload encryption +Slug53 +Statusdraft +CategoryStandards Track +EditorAaryamann Challani <p1ge0nh8er@proton.me> +ContributorsAndrea Piana <andreap@status.im>Pedro Pombeiro <pedro@status.im>Corey Petty <corey@status.im>Oskar Thorén <oskarth@titanproxy.com>Dean Eigenmann <dean@status.im>Filip Dimitrijevic <filip@status.im> + + + +Timeline -Andrea Piana andreap@status.im -Pedro Pombeiro pedro@status.im -Corey Petty corey@status.im -Oskar Thorén oskarth@titanproxy.com -Dean Eigenmann dean@status.im -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-07-01 — b60abdb — update waku/standards/application/53/x3dh.md (#150) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-05 — eb25cd0 — chore: replace email addresses (#86) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-01 — 51567b1 — Rename X3DH.md to x3dh.md +2024-01-31 — 9fd3266 — Update and rename README.md to X3DH.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 5e95a1a — Rename README.md to README.md +2024-01-25 — 555eb20 — Create README.md - -Abstract + +Abstract This document describes a method that can be used to provide a secure channel between two peers, and thus provide confidentiality, integrity, authenticity and forward secrecy. @@ -14466,7 +14127,7 @@ with some adaptations to operate in a decentralized environment. Motivation Nodes on a network may want to communicate with each other in a secure manner, without other nodes network being able to read their messages. -Specification +Specification Definitions @@ -14481,7 +14142,7 @@ who manages to obtain those private key. where a Double Ratchet algorithm is in use. -Design Requirements +Design Requirements Confidentiality: The adversary should not be able to learn what data is being exchanged @@ -14698,7 +14359,7 @@ described in The message key MUST be derived from a single ratchet step in the symmetric-key ratchet as described in Symmetric key ratchet The message key MUST be used to encrypt the next message to be sent. -Security Considerations +Security Considerations Inherits the security considerations of X3DH @@ -14718,10 +14379,10 @@ In this case, the server is trusted. This protocol does not provide message unlinkability. It is possible to link messages signed by the same keypair. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References X3DH Double Ratchet @@ -14734,25 +14395,34 @@ It is possible to link messages signed by the same keypair. reference wire format Symmetric key ratchet - -slug: 54 -title: 54/WAKU2-X3DH-SESSIONS -name: Session management for Waku X3DH -status: draft -category: Standards Track -tags: waku-application -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors: +54/WAKU2-X3DH-SESSIONS + + +NameSession management for Waku X3DH +Slug54 +Statusdraft +CategoryStandards Track +EditorAaryamann Challani <p1ge0nh8er@proton.me> +ContributorsAndrea Piana <andreap@status.im>Pedro Pombeiro <pedro@status.im>Corey Petty <corey@status.im>Oskar Thorén <oskarth@titanproxy.com>Dean Eigenmann <dean@status.im>Filip Dimitrijevic <filip@status.im> + + + +Timeline -Andrea Piana andreap@status.im -Pedro Pombeiro pedro@status.im -Corey Petty corey@status.im -Oskar Thorén oskarth@titanproxy.com -Dean Eigenmann dean@status.im -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-24 — db365cb — update waku/standards/application/54/x3dh-sessions.md (#151) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-05 — eb25cd0 — chore: replace email addresses (#86) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-01 — 0e490d4 — Rename X3DH-sessions.md to x3dh-sessions.md +2024-01-31 — 7f8b187 — Update and rename README.md to X3DH-sessions.md +2024-01-27 — a22c2a0 — Rename README.md to README.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 484df92 — Create README.md - -Abstract + +Abstract This document specifies how to manage sessions based on an X3DH key exchange. This includes how to establish new sessions, how to re-establish them, how to maintain them, and how to close them. @@ -14880,7 +14550,7 @@ it is possible that a device will receive a message that is not targeted to its own installation-id. In this case an empty message containing bundle information MUST be sent back, which will notify the receiving end not to include the device in any further communication. -Security Considerations +Security Considerations Inherits all security considerations from 53/WAKU2-X3DH. @@ -14894,28 +14564,40 @@ which may not be desirable in a peer-to-peer network. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 53/WAKU2-X3DH Signal's Sesame Algorithm - -slug: 6 -title: 6/WAKU1 -name: Waku v1 -status: stable -editor: Oskar Thorén oskarth@titanproxy.com -contributors: +Waku Standards - Legacy +Legacy Waku standards retained for reference and historical compatibility. +6/WAKU1 + + +NameWaku v1 +Slug6 +Statusstable +EditorOskar Thorén <oskarth@titanproxy.com> +ContributorsAdam Babik <adam@status.im>Andrea Maria Piana <andreap@status.im>Dean Eigenmann <dean@status.im>Kim De Mey <kimdemey@status.im> + + + +Timeline -Adam Babik adam@status.im -Andrea Maria Piana andreap@status.im -Dean Eigenmann dean@status.im -Kim De Mey kimdemey@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-12 — be052c8 — Rename waku/standards/core/waku_legacy/6/waku1.md to waku/standards/legacy/6/waku1.md +2024-02-12 — 7d83b3d — Rename waku/standards/core/6/waku1.md to waku/standards/core/waku_legacy/6/waku1.md +2024-02-01 — 161b35a — Update and rename WAKU1.md to waku1.md +2024-01-27 — 4c666c6 — Create WAKU1.md +2024-01-27 — 61f7641 — Create WAKU0.md - + This specification describes the format of Waku packets within the ÐΞVp2p Wire Protocol. This spec substitutes EIP-627. Waku is a fork of the original Whisper protocol @@ -15483,13 +15165,13 @@ This can be mitigated somewhat by running on e.g. port 80 or but there are still outstanding issues. See libp2p and Tor's Pluggable Transport for how this can be improved. Appendix B: Implementation Notes -Implementation Matrix +Implementation Matrix ClientSpec supportedDetails Status-go0.5details Nim-waku1.0details -Recommendations for clients +Recommendations for clients Notes useful for implementing Waku mode. 1.Avoid duplicate envelopes To avoid duplicate envelopes, @@ -15592,723 +15274,39 @@ confirmations-enabled and rate-limits Mail Server and Mail Client functionality is now part of the specification. P2P Message packet contains a list of envelopes instead of a single envelope. -Copyright +Copyright Copyright and related rights waived via CC0. Footnotes 1 Felix Lange et al. The RLPx Transport Protocol. Ethereum. - -slug: 6 -title: 6/WAKU1 -name: Waku v1 -status: stable -editor: Oskar Thorén oskarth@titanproxy.com -contributors: - -Adam Babik adam@status.im -Andrea Maria Piana andreap@status.im -Dean Eigenmann dean@status.im -Kim De Mey kimdemey@status.im - - -This specification describes the format of Waku packets within the ÐΞVp2p Wire Protocol. -This spec substitutes EIP-627. -Waku is a fork of the original Whisper protocol -that enables better usability for resource restricted devices, -such as mostly-offline bandwidth-constrained smartphones. -It does this through (a) light node support, (b) historic envelopes -(with a mailserver) (c) expressing topic interest for better bandwidth usage -and (d) basic rate limiting. -Motivation -Waku was created to incrementally improve in areas that Whisper is lacking in, -with special attention to resource restricted devices. -We specify the standard for Waku packets in order to ensure forward compatibility -of different Waku clients, backwards compatibility with Whisper clients, -as well as to allow multiple implementations of Waku and its capabilities. -We also modify the language to be more unambiguous, concise and consistent. -Definitions -TermDefinition -Batch AckAn abbreviated term for Batch Acknowledgment -Light nodeA Waku node that does not forward any envelopes through the Messages packet. -EnvelopeMessages sent and received by Waku nodes. Described in ABNF spec waku-envelope -NodeSome process that is able to communicate for Waku. - +7/WAKU-DATA + + +NameWaku Envelope data field +Slug7 +Statusstable +EditorOskar Thorén <oskarth@titanproxy.com> +ContributorsDean Eigenmann <dean@status.im>Kim De Mey <kimdemey@status.im> + -Underlying Transports and Prerequisites -Use of DevP2P -For nodes to communicate, they MUST implement devp2p and run RLPx. -They MUST have some way of connecting to other nodes. -Node discovery is largely out of scope for this spec, -but see the appendix for some suggestions on how to do this. -This protocol needs to advertise the waku/1 capability. -Gossip based routing -In Whisper, envelopes are gossiped between peers. -Whisper is a form of rumor-mongering protocol -that works by flooding to its connected peers based on some factors. -Envelopes are eligible for retransmission until their TTL expires. -A node SHOULD relay envelopes to all connected nodes -if an envelope matches their PoW and bloom filter settings. -If a node works in light mode, it MAY choose not to forward envelopes. -A node MUST NOT send expired envelopes, -unless the envelopes are sent as a 8/WAKU-MAIL response. -A node SHOULD NOT send an envelope to a peer that it has already sent before. -Maximum Packet Size -Nodes SHOULD limit the maximum size of both packets and envelopes. -If a packet or envelope exceeds its limit, it MUST be dropped. + +Timeline -RLPx Packet Size - This size MUST be checked before a message is decoded. -Waku Envelope Size - Each envelope contained in an RLPx packet -MUST then separately be checked against the maximum envelope size. +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-12 — a57d7b4 — Rename data.md to data.md +2024-01-31 — 900a3e9 — Update and rename DATA.md to data.md +2024-01-27 — 662eb12 — Rename README.md to DATA.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 93c3896 — Create README.md -Clients MAY use their own maximum packet and envelope sizes. -The default values are 1.5mb for the RLPx Packet and 1mb for a Waku envelope. -Wire Specification -Use of RLPx transport protocol -All Waku packets are sent as devp2p RLPx transport protocol, version 51 packets. -These packets MUST be RLP-encoded arrays of data containing two objects: -packet code followed by another object (whose type depends on the packet code). -See informal RLP spec and -the Ethereum Yellow Paper, appendix B -for more details on RLP. -Waku is a RLPx subprotocol called waku with version 0. -The version number corresponds to the major version in the header spec. -Minor versions should not break compatibility of waku, -this would result in a new major. -(Some exceptions to this apply in the Draft stage -of where client implementation is rapidly change). -ABNF specification -Using Augmented Backus-Naur form (ABNF) -we have the following format: -; Packet codes 0 - 127 are reserved for Waku protocol -packet-code = 1*3DIGIT - -; rate limits per packet -packet-limit-ip = 1*DIGIT -packet-limit-peerid = 1*DIGIT -packet-limit-topic = 1*DIGIT - -; rate limits by size in bytes -bytes-limit-ip = 1*DIGIT -bytes-limit-peerid = 1*DIGIT -bytes-limit-topic = 1*DIGIT - -packet-rate-limits = "[" packet-limit-ip packet-limit-peerid packet-limit-topic "]" -bytes-rate-limits = "[" bytes-limit-ip bytes-limit-peerid bytes-limit-topic "]" - -pow-requirement-key = 0 -bloom-filter-key = 1 -light-node-key = 2 -confirmations-enabled-key = 3 -packet-rate-limits-key = 4 -topic-interest-key = 5 -bytes-rate-limits-key = 6 - -status-options = "[" - [ pow-requirement-key pow-requirement ] - [ bloom-filter-key bloom-filter ] - [ light-node-key light-node ] - [ confirmations-enabled-key confirmations-enabled ] - [ packet-rate-limits-key packet-rate-limits ] - [ topic-interest-key topic-interest ] - [ bytes-limits-key bytes-rate-limits ] -"]" - -status = status-options - -status-update = status-options - -confirmations-enabled = BIT - -light-node = BIT - -; pow is "a single floating point value of PoW. -; This value is the IEEE 754 binary representation -; of a 64-bit floating point number packed as a uint64. -; Values of qNAN, sNAN, INF and -INF are not allowed. -; Negative values are also not allowed." -pow = 1*DIGIT "." 1*DIGIT -pow-requirement = pow - -; bloom filter is "a byte array" -bloom-filter = *OCTET - -waku-envelope = "[" expiry ttl topic data nonce "]" - -; List of topics interested in -topic-interest = "[" *10000topic "]" - -; 4 bytes (UNIX time in seconds) -expiry = 4OCTET - -; 4 bytes (time-to-live in seconds) -ttl = 4OCTET - -; 4 bytes of arbitrary data -topic = 4OCTET - -; byte array of arbitrary size -; (contains encrypted payload) -data = *OCTET - -; 8 bytes of arbitrary data -; (used for PoW calculation) -nonce = 8OCTET - -messages = 1*waku-envelope - -; version of the confirmation packet -version = 1*DIGIT - -; keccak256 hash of the envelopes batch data (raw bytes) -; for which the confirmation is sent -hash = *OCTET - -hasherror = *OCTET - -; error code -code = 1*DIGIT - -; a descriptive error message -description = *ALPHA - -error = "[" hasherror code description "]" -errors = *error - -response = "[" hash errors "]" - -confirmation = "[" version response "]" - -; message confirmation packet types -batch-ack = confirmation -message-response = confirmation - -; mail server / client specific -p2p-request = waku-envelope -p2p-message = 1*waku-envelope -p2p-request-complete = *OCTET - -; packet-format needs to be paired with its -; corresponding packet-format -packet-format = "[" packet-code packet-format "]" - -required-packet = 0 status / - 1 messages / - 22 status-update / - -optional-packet = 11 batch-ack / - 12 message-response / - 126 p2p-request-complete / - 126 p2p-request / - 127 p2p-message - -packet = "[" required-packet [ optional-packet ] "]" - -All primitive types are RLP encoded. Note that, per RLP specification, -integers are encoded starting from 0x00. -Packet Codes -The packet codes reserved for Waku protocol: 0 - 127. -Packets with unknown codes MUST be ignored without generating any error, -for forward compatibility of future versions. -The Waku sub-protocol MUST support the following packet codes: -NameInt Value -Status0 -Messages1 -Status Update22 - - -The following message codes are optional, but they are reserved for specific purpose. -NameInt ValueComment -Batch Ack11 -Message Response12 -P2P Request Complete125 -P2P Request126 -P2P Message127 - - -Packet usage -Status -The Status packet serves as a Waku handshake and peers MUST exchange this -packet upon connection. It MUST be sent after the RLPx handshake and prior to -any other Waku packets. -A Waku node MUST await the Status packet from a peer -before engaging in other Waku protocol activity with that peer. -When a node does not receive the Status packet from a peer, -before a configurable timeout, it SHOULD disconnect from that peer. -Upon retrieval of the Status packet, the node SHOULD validate the packet -received and validated the Status packet. Note that its peer might not be in -the same state. -When a node is receiving other Waku packets from a peer before a Status -packet is received, the node MUST ignore these packets and -SHOULD disconnect from that peer. -Status packets received after the handshake is completed MUST also be ignored. -The Status packet MUST contain an association list containing various options. -All options within this association list are OPTIONAL, -ordering of the key-value pairs is not guaranteed and -therefore MUST NOT be relied on. -Unknown keys in the association list SHOULD be ignored. -Messages -This packet is used for sending the standard Waku envelopes. -Status Update -The Status Update packet is used to communicate an update -of the settings of the node. -The format is the same as the Status packet, all fields are optional. -If none of the options are specified the packet MUST be ignored and -considered a noop. -Fields that are omitted are considered unchanged, -fields that haven't changed SHOULD not be transmitted. -PoW Requirement Field -When PoW Requirement is updated, -peers MUST NOT deliver envelopes with PoW lower than the PoW Requirement specified. -PoW is defined as average number of iterations, -required to find the current BestBit -(the number of leading zero bits in the hash), divided by envelope size and TTL: -PoW = (2**BestBit) / (size * TTL) -PoW calculation: -fn short_rlp(envelope) = rlp of envelope, excluding env_nonce field. -fn pow_hash(envelope, env_nonce) = sha3(short_rlp(envelope) ++ env_nonce) -fn pow(pow_hash, size, ttl) = 2**leading_zeros(pow_hash) / (size * ttl) -where size is the size of the RLP-encoded envelope, -excluding env_nonce field (size of short_rlp(envelope)). -Bloom Filter Field -The bloom filter is used to identify a number of topics to a peer without compromising -(too much) privacy over precisely what topics are of interest. -Precise control over the information content (and thus efficiency of the filter) -may be maintained through the addition of bits. -Blooms are formed by the bitwise OR operation on a number of bloomed topics. -The bloom function takes the topic and projects them onto a 512-bit slice. -At most, three bits are marked for each bloomed topic. -The projection function is defined as a mapping -from a 4-byte slice S to a 512-bit slice D; for ease of explanation, -S will dereference to bytes, whereas D will dereference to bits. -LET D[*] = 0 -FOREACH i IN { 0, 1, 2 } DO -LET n = S[i] -IF S[3] & (2 ** i) THEN n += 256 -D[n] = 1 -END FOR -A full bloom filter (all the bits set to 1) -means that the node is to be considered a Full Node and it will accept any topic. -If both topic interest and bloom filter are specified, -topic interest always takes precedence and bloom filter MUST be ignored. -If only bloom filter is specified, -the current topic interest MUST be discarded and -only the updated bloom filter MUST be used when forwarding or posting envelopes. -A bloom filter with all bits set to 0 signals that the node is not currently -interested in receiving any envelope. -Topic Interest Field -Topic interest is used to share a node's interest in envelopes with specific topics. -It does this in a more bandwidth considerate way, -at the expense of some metadata protection. -Peers MUST only send envelopes with specified topics. -It is currently bounded to a maximum of 10000 topics. -If you are interested in more topics than that, this is currently underspecified -and likely requires updating it. The constant is subject to change. -If only topic interest is specified, the current bloom filter MUST be discarded and -only the updated topic interest MUST be used when forwarding or posting envelopes. -An empty array signals that the node is not currently interested in receiving -any envelope. -Rate Limits Field -Rate limits is used to inform other nodes of their self defined rate limits. -In order to provide basic Denial-of-Service attack protection, -each node SHOULD define its own rate limits. -The rate limits SHOULD be applied on IPs, peer IDs, and envelope topics. -Each node MAY decide to whitelist, i.e. do not rate limit, selected IPs or peer IDs. -If a peer exceeds node's rate limits, the connection between them MAY be dropped. -Each node SHOULD broadcast its rate limits to its peers -using the status-update packet. -The rate limits MAY also be sent as an optional parameter in the handshake. -Each node SHOULD respect rate limits advertised by its peers. -The number of packets SHOULD be throttled in order not to exceed peer's rate limits. -If the limit gets exceeded, the connection MAY be dropped by the peer. -Two rate limits strategies are applied: - -Number of packets per second -Size of packets (in bytes) per second - -Both strategies SHOULD be applied per IP address, peer id and topic. -The size limit SHOULD be greater or equal than the maximum packet size. -Light Node Field -When the node's light-node field is set to true, -the node SHOULD NOT forward Envelopes from its peers. -A node connected to a peer with the light-node field set to true -MUST NOT depend on the peer for forwarding Envelopes. -Confirmations Enabled Field -When the node's confirmations-enabled field is set to true, -the node SHOULD send message confirmations -to its peers. -Batch Ack and Message Response -Message confirmations tell a node that an envelope -originating from it has been received by its peers, -allowing a node to know whether an envelope has or has not been received. -A node MAY send a message confirmation for any batch of envelopes -received with a Messages packet (0x01). -A message confirmation is sent using Batch Ack packet (0x0B) or -Message Response packet (0x0C). -The message confirmation is specified in the ABNF specification. -The current version in the confirmation is 1. -The supported error codes: - -1: time sync error which happens when an envelope is too old or -was created in the future (typically because of an unsynchronized clock of a node). - -The drawback of sending message confirmations is that it increases the noise -in the network because for each sent envelope, -a corresponding confirmation is broadcast by one or more peers. -P2P Request -This packet is used for sending Dapp-level peer-to-peer requests, -e.g. Waku Mail Client requesting historic (expired) -envelopes from the Waku Mail Server. -P2P Message -This packet is used for sending the peer-to-peer envelopes, -which are not supposed to be forwarded any further. -E.g. it might be used by the Waku Mail Server for delivery of historic (expired) -envelopes, which is otherwise not allowed. -P2P Request Complete -This packet is used to indicate that all envelopes, -requested earlier with a P2P Request packet (0x7E), -have been sent via one or more P2P Message packets (0x7F). -The content of the packet is explained in the Waku Mail Server specification. -Payload Encryption -Asymmetric encryption uses the standard Elliptic Curve Integrated Encryption Scheme -with SECP-256k1 public key. -Symmetric encryption uses AES GCM algorithm with random 96-bit nonce. -Packet code Rationale -Packet codes 0x00 and 0x01 are already used in all Waku / Whisper versions. -Packet code 0x02 and 0x03 were previously used in Whisper but -are deprecated as of Waku v0.4 -Packet code 0x22 is used to dynamically change the settings of a node. -Packet codes 0x7E and 0x7F may be used to implement Waku Mail Server and -Client. -Without the P2P Message packet it would be impossible to deliver the historic envelopes, -since they will be recognized as expired, and -the peer will be disconnected for violating the Waku protocol. -They might be useful for other purposes -when it is not possible to spend time on PoW, -e.g. if a stock exchange will want to provide live feed about the latest trades. -Additional capabilities -Waku supports multiple capabilities. -These include light node, rate limiting and bridging of traffic. -Here we list these capabilities, how they are identified, -what properties they have and what invariants they must maintain. -Additionally, -there is the capability of a mailserver which is documented in its on specification. -Light node -The rationale for light nodes is to allow for interaction with waku -on resource restricted devices as bandwidth can often be an issue. -Light nodes MUST NOT forward any incoming envelopes, -they MUST only send their own envelopes. -When light nodes happen to connect to each other, they SHOULD disconnect. -As this would result in envelopes being dropped between the two. -Light nodes are identified by the light_node value in the Status packet. -Accounting for resources (experimental) -Nodes MAY implement accounting, keeping track of resource usage. -It is heavily inspired by Swarm's SWAP protocol, -and works by doing pairwise accounting for resources. -Each node keeps track of resource usage with all other nodes. -Whenever an envelope is received from a node that is expected -(fits bloom filter or topic interest, is legal, etc) this is tracked. -Every epoch (say, every minute or every time an event happens) -statistics SHOULD be aggregated and saved by the client: -peersentreceived -peer10123 -peer21040 - - -In later versions this will be amended by nodes communication thresholds, -settlements and disconnect logic. -Upgradability and Compatibility -General principles and policy -The currently advertised capability is waku/1. -This needs to be advertised in the hello ÐΞVp2p packet. -If a node supports multiple versions of waku, those needs to be explicitly advertised. -For example if both waku/0 and waku/1 are supported, -both waku/0 and waku/1 MUST be advertised. -These are policies that guide how we make decisions when it comes to upgradability, -compatibility, and extensibility: - - -Waku aims to be compatible with previous and future versions. - - -In cases where we want to break this compatibility, -we do so gracefully and as a single decision point. - - -To achieve this, we employ the following two general strategies: - - - -a) Accretion (including protocol negotiation) over changing data -b) When we want to change things, we give it a new name -(for example, a version number). - -Examples: - -We enable bridging between shh/6 and -waku/1 until such a time as when we are ready to gracefully drop support -for shh/6 (1, 2, 3). -When we add parameter fields, -we (currently) do so by accreting them in a list, -so old clients can ignore new fields (dynamic list) and -new clients can use new capabilities (1, 3). -To better support (2) and (3) in the future, -we will likely release a new version that gives better support for open, -growable maps (association lists or native map type) (3) -When we we want to provide a new set of packets that have different requirements, -we do so under a new protocol version and employ protocol versioning. -This is a form of accretion at a level above - -it ensures a client can support both protocols at once and -drop support for legacy versions gracefully. (1,2,3) - -Backwards Compatibility -Waku is a different subprotocol from Whisper so it isn't directly compatible. -However, the data format is the same, -so compatibility can be achieved by the use of a bridging mode as described below. -Any client which does not implement certain packet codes -should gracefully ignore the packets with those codes. -This will ensure the forward compatibility. -Waku-Whisper bridging -waku/1 and shh/6 are different DevP2P subprotocols, -however they share the same data format making their envelopes compatible. -This means we can bridge the protocols naively, this works as follows. -Roles: - -Waku client A, only Waku capability -Whisper client B, only Whisper capability -WakuWhisper bridge C, both Waku and Whisper capability - -Flow: - -A posts envelope; B posts envelope. -C picks up envelope from A and B and relays them both to Waku and Whisper. -A receives envelope on Waku; B on Whisper. - -Note: This flow means if another bridge C1 is active, -we might get duplicate relaying for a envelope between C1 and C2. -I.e. Whisper(<>Waku<>Whisper)<>Waku, A-C1-C2-B. -Theoretically this bridging chain can get as long as TTL permits. -Forward Compatibility -It is desirable to have a strategy for maintaining forward compatibility -between waku/1 and future version of waku. -Here we outline some concerns and strategy for this. - -Connecting to nodes with multiple versions: -The way this SHOULD be accomplished is by negotiating the versions of subprotocols, -within the hello packet nodes transmit their capabilities along with a version. -The highest common version should then be used. -Adding new packet codes: -New packet codes can be added easily due to the available packet codes. -Unknown packet codes SHOULD be ignored. -Upgrades that add new packet codes SHOULD implement some fallback mechanism -if no response was received for nodes that do not yet understand this packet. -Adding new options in status-options: -New options can be added to the status-options association list in the status -and status-update packet as options are OPTIONAL and -unknown option keys SHOULD be ignored. -A node SHOULD NOT disconnect from a peer when receiving status-options -with unknown option keys. - -Appendix A: Security considerations -There are several security considerations to take into account when running Waku. -Chief among them are: scalability, DDoS-resistance and privacy. -These also vary depending on what capabilities are used. -The security considerations for extra capabilities, -such as mailservers -can be found in their respective specifications. -Scalability and UX -Bandwidth usage -In version 0 of Waku, bandwidth usage is likely to be an issue. -For more investigation into this, -see the theoretical scaling model described -here. -Gossip-based routing -Use of gossip-based routing doesn't necessarily scale. -It means each node can see an envelope multiple times, and -having too many light nodes can cause propagation probability that is too low. -See Whisper vs PSS -for more and a possible Kademlia based alternative. -Lack of incentives -Waku currently lacks incentives to run nodes, -which means node operators are more likely to create centralized choke points. -Privacy -Light node privacy -The main privacy concern with a light node -is that it has to reveal its topic interests -(in addition to its IP/ID) to its directed peers. -This is because when a light node publishes an envelope, -its directed peers will know that the light node owns that envelope -(as light nodes do not relay other envelopes). -Therefore, the directed peers of a light node can make assumptions about what envelopes -(topics) the light node is interested in. -Mailserver client privacy -A mailserver client fetches archival envelopes from a mailserver -through a direct connection. -In this direct connection, -the client discloses its IP/ID as well as the topics/ bloom filter -it is interested in to the mailserver. -The collection of such information allows the mailserver to link clients' IP/IDs -to their topic interests and build a profile for each client over time. -As such, the mailserver client has to trust the mailserver with this level of information. -Bloom filter privacy -By having a bloom filter where only the topics you are interested in are set, -you reveal which envelopes you are interested in. -This is a fundamental tradeoff between bandwidth usage and privacy, -though the tradeoff space is likely suboptimal in terms of the Anonymity -trilemma. -Privacy guarantees not rigorous -Privacy for Whisper / Waku haven't been studied rigorously for various threat models -like global passive adversary, local active attacker, etc. -This is unlike e.g. Tor and mixnets. -Topic hygiene -Similar to bloom filter privacy, -if you use a very specific topic you reveal more information. -See scalability model linked above. -Spam resistance -PoW bad for heterogeneous devices: -Proof of work is a poor spam prevention mechanism. -A mobile device can only have a very low PoW -in order not to use too much CPU / burn up its phone battery. -This means someone can spin up a powerful node and overwhelm the network. -Censorship resistance -Devp2p TCP port blockable: -By default Devp2p runs on port 30303, -which is not commonly used for any other service. -This means it is easy to censor, e.g. airport WiFi. -This can be mitigated somewhat by running on e.g. port 80 or 443, -but there are still outstanding issues. -See libp2p and Tor's Pluggable Transport for how this can be improved. -Appendix B: Implementation Notes -Implementation Matrix -ClientSpec supportedDetails -Status-go0.5details -Nim-waku1.0details - - -Recommendations for clients -Notes useful for implementing Waku mode. -1.Avoid duplicate envelopes -To avoid duplicate envelopes, -only connect to one Waku node. -Benign duplicate envelopes is an intrinsic property of Whisper -which often leads to a N factor increase in traffic, -where N is the number of peers you are connected to. -2.Topic specific recommendations -Consider partition topics based on some usage, -to avoid too much traffic on a single topic. -Node discovery -Resource restricted devices SHOULD use EIP-1459 -to discover nodes. -Known static nodes MAY also be used. -Changelog -Initial Release - -Add section on P2P Request Complete packet and update packet code table. -Correct the header hierarchy for the status-options fields. -Consistent use of the words packet, message and envelope. -Added section on max packet size -Complete the ABNF specification and minor ABNF fixes. - -Version 1.1 -Released June 09, 2020 - -Add rate limit per bytes - -Version 1.0 -Released April 21,2020 - -Removed version from handshake -Changed RLP keys from 48,49.. to 0,1.. -Upgraded to waku/1 - -Version 0.6 -Released April 21,2020 - -Mark spec as Deprecated mode in terms of its lifecycle. - -Version 0.5 -Released March 17,2020 - -Clarify the preferred way of handling unknown keys -in the status-options association list. -Correct spec/implementation mismatch: -Change RLP keys to be the their int values in order to reflect production behavior - -Version 0.4 -Released February 21, 2020. - -Simplify implementation matrix with latest state -Introduces a new required packet code Status Code (0x22) -for communicating option changes -Deprecates the following packet codes: PoW Requirement (0x02), -Bloom Filter (0x03), Rate limits (0x20), Topic interest (0x21) - -all superseded by the new Status Code (0x22) -Increased topic-interest capacity from 1000 to 10000 - -Version 0.3 -Released February 13, 2020. - -Recommend DNS based node discovery over other Discovery methods. -Mark spec as Draft mode in terms of its lifecycle. -Simplify Changelog and misc formatting. -Handshake/Status packet not compatible with shh/6 nodes; -specifying options as association list. -Include topic-interest in Status handshake. -Upgradability policy. -topic-interest packet code. - -Version 0.2 -Released December 10, 2019. - -General style improvements. -Fix ABNF grammar. -Mailserver requesting/receiving. -New packet codes: topic-interest (experimental), rate limits (experimental). -More details on handshake modifications. -Accounting for resources mode (experimental) -Appendix with security considerations: scalability and UX, privacy, and spam resistance. -Appendix with implementation notes and -implementation matrix across various clients with breakdown per capability. -More details on handshake and parameters. -Describe rate limits in more detail. -More details on mailserver and mail client API. -Accounting for resources mode (very experimental). -Clarify differences with Whisper. - -Version 0.1 -Initial version. Released November 21, 2019. -Differences between shh/6 and waku/1 -Summary of main differences between this spec and Whisper v6, as described in EIP-627: - -RLPx subprotocol is changed from shh/6 to waku/1. -Light node capability is added. -Optional rate limiting is added. -Status packet has following additional parameters: light-node, -confirmations-enabled and rate-limits -Mail Server and Mail Client functionality is now part of the specification. -P2P Message packet contains a list of envelopes instead of a single envelope. - -Copyright -Copyright and related rights waived via CC0. -Footnotes -1 -Felix Lange et al. The RLPx Transport Protocol. Ethereum. - - -slug: 7 -title: 7/WAKU-DATA -name: Waku Envelope data field -status: stable -editor: Oskar Thorén oskarth@titanproxy.com -contributors: - -Dean Eigenmann dean@status.im -Kim De Mey kimdemey@status.im - - + This specification describes the encryption, decryption and signing of the content in the data field used in Waku. -Specification +Specification The data field is used within the waku envelope, the field MUST contain the encrypted payload of the envelope. The fields that are concatenated and encrypted as part of the data field are: @@ -16361,26 +15359,37 @@ since data size alone might reveal important metainformation. Padding can be arbitrary size. However, it is recommended that the size of Data Field (excluding the Salt) before encryption (i.e. plain text) SHOULD be factor of 256 bytes. -Copyright +Copyright Copyright and related rights waived via CC0. - -slug: 8 -title: 8/WAKU-MAIL -name: Waku Mailserver -status: stable -editor: Andrea Maria Piana andreap@status.im -contributors: +8/WAKU-MAIL + + +NameWaku Mailserver +Slug8 +Statusstable +EditorAndrea Maria Piana <andreap@status.im> +ContributorsAdam Babik <adam@status.im>Dean Eigenmann <dean@status.im>Oskar Thorén <oskarth@titanproxy.com> + + + +Timeline -Adam Babik adam@status.im -Dean Eigenmann dean@status.im -Oskar Thorén oskarth@titanproxy.com +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-12 — fa77279 — Rename mail.md to mail.md +2024-01-31 — 0c8e39b — Rename MAIL.md to mail.md +2024-01-27 — de5cfa2 — Rename README.md to MAIL.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 28e7862 — Create README.md - -Abstract + +Abstract In this specification, we describe Mailservers. These are nodes responsible for archiving envelopes and delivering them to peers on-demand. -Specification +Specification A node which wants to provide mailserver functionality MUST store envelopes from incoming Messages packets (Waku packet-code 0x01). The envelopes can be stored in any format, @@ -16468,7 +15477,7 @@ payload = "[" request-id last-envelope-hash [ cursor ] "]" it means that not all envelopes were sent due to the set Limit in the request. One or more consecutive requests MAY be sent with Cursor field filled in order to receive the rest of the envelopes. -Security considerations +Security considerations There are several security considerations to take into account when running or interacting with Mailservers. Chief among them are: scalability, DDoS-resistance and privacy. @@ -16489,7 +15498,7 @@ their direct peers which is discussed in the security considerations of Mailserver trusted connection: A mailserver has a direct TCP connection, which means they are trusted to send traffic. This means a malicious or malfunctioning mailserver can overwhelm an individual node. -Changelog +Changelog VersionComment 1.0.0marked stable as it is in use. 0.2.0Add topic interest to reduce bandwidth usage @@ -16500,20 +15509,31 @@ This means a malicious or malfunctioning mailserver can overwhelm an individual topics option -Copyright +Copyright Copyright and related rights waived via CC0. - -slug: 9 -title: 9/WAKU-RPC -name: Waku RPC API -status: stable -editor: Andrea Maria Piana andreap@status.im -contributors: +9/WAKU-RPC + + +NameWaku RPC API +Slug9 +Statusstable +EditorAndrea Maria Piana <andreap@status.im> +ContributorsDean Eigenmann <dean@status.im>Oskar Thorén <oskarth@titanproxy.com> + + + +Timeline -Dean Eigenmann dean@status.im -Oskar Thorén oskarth@titanproxy.com +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-12 — 5eb393f — Rename waku/legacy/9/rpc.md to waku/standards/legacy/9/rpc.md +2024-02-12 — 9617146 — Rename waku/standards/core/waku_legacy/9/waku2-rpc.md to waku/legacy/9/rpc.md +2024-02-12 — 75705cd — Rename waku/standards/core/9/waku2-rpc.md to waku/standards/core/waku_legacy/9/waku2-rpc.md +2024-02-01 — e808e36 — Create waku2-rpc.md - + This specification describes the RPC API that Waku nodes MAY adhere to. The unified API allows clients to easily be able to connect to any node implementation. @@ -16870,25 +15890,36 @@ It can not be both. true on success or an error on failure. -Changelog +Changelog VersionComment 1.0.0Initial release. -Copyright +Copyright Copyright and related rights waived via CC0. - -slug: 22 -title: 22/TOY-CHAT -name: Waku v2 Toy Chat -status: draft -tags: waku/application -editor: Franck Royer franck@status.im -contributors: +Waku Informational RFCs +Informational Waku documents covering guidance, examples, and supporting material. +22/TOY-CHAT + + +NameWaku v2 Toy Chat +Slug22 +Statusdraft +EditorFranck Royer <franck@status.im> +ContributorsHanno Cornelius <hanno@status.im> + + + +Timeline -Hanno Cornelius hanno@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-01-31 — 722c3d2 — Rename TOY-CHAT.md to toy-chat.md +2024-01-29 — 5c5ea36 — Update TOY-CHAT.md +2024-01-27 — 411e135 — Create TOY-CHAT.md - + Content Topic: /toy-chat/2/huilong/proto. This specification explains a toy chat example using Waku v2. This protocol is mainly used to: @@ -16922,69 +15953,37 @@ message Chat2Message { nick: The nickname of the user sending the message, payload: The text of the messages, UTF-8 encoded. -Copyright +Copyright Copyright and related rights waived via CC0. - -slug: 22 -title: 22/TOY-CHAT -name: Waku v2 Toy Chat -status: draft -tags: waku/application -editor: Franck Royer franck@status.im -contributors: +23/WAKU2-TOPICS + + +NameWaku v2 Topic Usage Recommendations +Slug23 +Statusdraft +CategoryInformational +EditorOskar Thoren <oskarth@titanproxy.com> +ContributorsHanno Cornelius <hanno@status.im>Daniel Kaiser <danielkaiser@status.im>Filip Dimitrijevic <filip@status.im> + + + +Timeline -Hanno Cornelius hanno@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-22 — 4df2d5f — update waku/informational/23/topics.md (#144) +2025-01-02 — dc7497a — add usage guidelines for waku content topics (#117) +2024-11-20 — ff87c84 — Update Waku Links (#104) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-07 — e63d8a0 — Update topics.md +2024-01-31 — b8f088c — Update and rename README.md to topics.md +2024-01-31 — 2b693e8 — Update README.md +2024-01-29 — 055c525 — Update README.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — a11dfed — Create README.md - -Content Topic: /toy-chat/2/huilong/proto. -This specification explains a toy chat example using Waku v2. -This protocol is mainly used to: - -Dogfood Waku v2, -Show an example of how to use Waku v2. - -Currently, all main Waku v2 implementations support the toy chat protocol: -nim-waku, -js-waku (NodeJS -and web) -and go-waku. -Note that this is completely separate from the protocol the Status app -is using for its chat functionality. -Design -The chat protocol enables sending and receiving messages in a chat room. -There is currently only one chat room, which is tied to the content topic. -The messages SHOULD NOT be encrypted. -The contentTopic MUST be set to /toy-chat/2/huilong/proto. -Payloads -syntax = "proto3"; - -message Chat2Message { - uint64 timestamp = 1; - string nick = 2; - bytes payload = 3; -} - - -timestamp: The time at which the message was sent, in Unix Epoch seconds, -nick: The nickname of the user sending the message, -payload: The text of the messages, UTF-8 encoded. - -Copyright -Copyright and related rights waived via CC0. - -slug: 23 -title: 23/WAKU2-TOPICS -name: Waku v2 Topic Usage Recommendations -status: draft -category: Informational -editor: Oskar Thoren oskarth@titanproxy.com -contributors: - -Hanno Cornelius hanno@status.im -Daniel Kaiser danielkaiser@status.im -Filip Dimitrijevic filip@status.im - - + This document outlines recommended usage of topic names in Waku v2. In 10/WAKU2 spec there are two types of topics: @@ -17115,10 +16114,10 @@ for a description of the bridged fields. For example: /waku/1/0x007f80ff/rfc26 -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 10/WAKU2 spec 11/WAKU2-RELAY @@ -17131,17 +16130,31 @@ For example: 15/WAKU-BRIDGE 26/WAKU-PAYLOAD - -slug: 27 -title: 27/WAKU2-PEERS -name: Waku v2 Client Peer Management Recommendations -status: draft -editor: Hanno Cornelius hanno@status.im -contributors: +27/WAKU2-PEERS + + +NameWaku v2 Client Peer Management Recommendations +Slug27 +Statusdraft +EditorHanno Cornelius <hanno@status.im> +ContributorsFilip Dimitrijevic <filip@status.im> + + + +Timeline -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-22 — af7c413 — update waku/informational/27/peers.md (#145) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-01-31 — 4b77d10 — Update and rename README.md to peers.md +2024-01-31 — e65c359 — Update README.md +2024-01-31 — 4a78cac — Update README.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 7daec2f — Create README.md - + 27/WAKU2-PEERS describes a recommended minimal set of peer storage and peer management features to be implemented by Waku v2 clients. In this context, peer storage refers to a client's ability to keep track of discovered @@ -17222,10 +16235,10 @@ For example, idle TCP connections often times out after 10 to 15 minutes. the nim-waku client currently implements a keep-alive mechanism every 5 minutes, in response to a TCP connection timeout of 10 minutes. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References Peer ID multiaddrs @@ -17237,17 +16250,29 @@ in response to a TCP connection timeout of 10 minutes. libp2p pings 10/WAKU2 client recommendations - -slug: 29 -title: 29/WAKU2-CONFIG -name: Waku v2 Client Parameter Configuration Recommendations -status: draft -editor: Hanno Cornelius hanno@status.im -contributors: +29/WAKU2-CONFIG + + +NameWaku v2 Client Parameter Configuration Recommendations +Slug29 +Statusdraft +EditorHanno Cornelius <hanno@status.im> +ContributorsFilip Dimitrijevic <filip@status.im> + + + +Timeline -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-22 — 7408956 — update waku/informational/29/config.md (#146) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-01-31 — c506eac — Update and rename CONFIG.md to config.md +2024-01-31 — 930f84d — Update and rename README.md to CONFIG.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — e6396b9 — Create README.md - + 29/WAKU2-CONFIG describes the RECOMMENDED values to assign to configurable parameters for Waku v2 clients. Since Waku v2 is built on libp2p, @@ -17298,10 +16323,10 @@ MAY choose to implement. IHaveMaxLengthMaximum number of messages to include in an IHAVE message5000 -Copyright +Copyright Copyright and related rights waived via CC0. -References +References libp2p 11/WAKU2-RELAY @@ -17309,17 +16334,28 @@ MAY choose to implement. corresponding libp2p specification several new parameters - -slug: 30 -title: 30/ADAPTIVE-NODES -name: Adaptive nodes -status: draft -editor: Oskar Thorén oskarth@titanproxy.com -contributors: +30/ADAPTIVE-NODES + + +NameAdaptive nodes +Slug30 +Statusdraft +EditorOskar Thorén <oskarth@titanproxy.com> +ContributorsFilip Dimitrijevic <filip@status.im> + + + +Timeline -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 91c9679 — update waku/informational/30/adaptive-nodes.md (#147) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-01-31 — b35846a — Update and rename README.md to adaptive-nodes.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 04036ad — Create README.md - + This is an informational spec that show cases the concept of adaptive nodes. Node types - a continuum We can look at node types as a continuum, @@ -17394,10 +16430,10 @@ and 15/WAKU- This one shows a cross-section of nodes in different dimensions and shows how the connections look different for different protocols. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 11/WAKU2-RELAY 25/LIBP2P-DNS-DISCOVERY @@ -17409,20 +16445,27 @@ This subdirectory is for achrive purpose and should not be used in production ready implementations. Visit Waku RFCs for new Waku specifications under discussion. - -slug: 5 -title: 5/WAKU0 -name: Waku v0 -status: deprecated -editor: Oskar Thorén oskarth@titanproxy.com -contributors: +5/WAKU0 + + +NameWaku v0 +Slug5 +Statusdeprecated +EditorOskar Thorén <oskarth@titanproxy.com> +ContributorsAdam Babik <adam@status.im>Andrea Maria Piana <andreap@status.im>Dean Eigenmann <dean@status.im>Kim De Mey <kimdemey@status.im> + + + +Timeline -Adam Babik adam@status.im -Andrea Maria Piana andreap@status.im -Dean Eigenmann dean@status.im -Kim De Mey kimdemey@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-01-31 — 9770963 — Rename WAKU0.md to waku0.md +2024-01-31 — ac8fe6d — Rename waku/rfc/deprecated/5/WAKU0.md to waku/deprecated/5/WAKU0.md +2024-01-27 — 61f7641 — Create WAKU0.md - + This specification describes the format of Waku messages within the ÐΞVp2p Wire Protocol. This spec substitutes EIP-627. Waku is a fork of the original Whisper protocol that enables better usability @@ -17432,7 +16475,7 @@ It does this through (a) light node support, (b) historic messages (with a mailserver) (c) expressing topic interest for better bandwidth usage and (d) basic rate limiting. -Motivation +Motivation Waku was created to incrementally improve in areas that Whisper is lacking in, with special attention to resource restricted devices. We specify the standard for Waku messages @@ -17440,20 +16483,20 @@ in order to ensure forward compatibility of different Waku clients, backwards compatibility with Whisper clients, as well as to allow multiple implementations of Waku and its capabilities. We also modify the language to be more unambiguous, concise and consistent. -Definitions +Definitions TermDefinition Light nodeA Waku node that does not forward any messages. EnvelopeMessages sent and received by Waku nodes. NodeSome process that is able to communicate for Waku. -Underlying Transports and Prerequisites -Use of DevP2P +Underlying Transports and Prerequisites +Use of DevP2P For nodes to communicate, they MUST implement devp2p and run RLPx. They MUST have some way of connecting to other nodes. Node discovery is largely out of scope for this spec, but see the appendix for some suggestions on how to do this. -Gossip based routing +Gossip based routing In Whisper, messages are gossiped between peers. Whisper is a form of rumor-mongering protocol that works by flooding to its connected peers based on some factors. @@ -17464,8 +16507,8 @@ If a node works in light mode, it MAY choose not to forward envelopes. A node MUST NOT send expired envelopes, unless the envelopes are sent as a mailserver response. A node SHOULD NOT send a message to a peer that it has already sent before. -Wire Specification -Use of RLPx transport protocol +Wire Specification +Use of RLPx transport protocol All Waku messages are sent as devp2p RLPx transport protocol, version 51 packets. These packets MUST be RLP-encoded arrays of data containing two objects: @@ -17479,7 +16522,7 @@ Minor versions should not break compatibility of waku, this would result in a new major. (Some exceptions to this apply in the Draft stage of where client implementation is rapidly change). -ABNF specification +ABNF specification Using Augmented Backus-Naur form (ABNF) we have the following format: ; Packet codes 0 - 127 are reserved for Waku protocol @@ -17572,7 +16615,7 @@ packet = "[" required-packet [ optional-packet ] "]" All primitive types are RLP encoded. Note that, per RLP specification, integers are encoded starting from 0x00. -Packet Codes +Packet Codes The message codes reserved for Waku protocol: 0 - 127. Messages with unknown codes MUST be ignored without generating any error, for forward compatibility of future versions. @@ -17591,8 +16634,8 @@ for forward compatibility of future versions. P2P Message127 -Packet usage -Status +Packet usage +Status The Status message serves as a Waku handshake and peers MUST exchange this message upon connection. It MUST be sent after the RLPx handshake and prior to any other Waku messages. @@ -17612,9 +16655,9 @@ All options within this association list are OPTIONAL, ordering of the key-value pairs is not guaranteed and therefore MUST NOT be relied on. Unknown keys in the association list SHOULD be ignored. -Messages +Messages This packet is used for sending the standard Waku envelopes. -Status Update +Status Update The Status Update message is used to communicate an update of the settings of the node. The format is the same as the Status message, all fields are optional. @@ -17734,19 +16777,19 @@ created in the future (the root cause is no time sync between nodes). The drawback of sending message confirmations is that it increases the noise in the network because for each sent message, a corresponding confirmation is broadcast by one or more peers. -P2P Request +P2P Request This packet is used for sending Dapp-level peer-to-peer requests, e.g. Waku Mail Client requesting old messages from the Waku Mail Server. -P2P Message +P2P Message This packet is used for sending the peer-to-peer messages, which are not supposed to be forwarded any further. E.g. it might be used by the Waku Mail Server for delivery of old (expired) messages, which is otherwise not allowed. -Payload Encryption +Payload Encryption Asymmetric encryption uses the standard Elliptic Curve Integrated Encryption Scheme with SECP-256k1 public key. Symmetric encryption uses AES GCM algorithm with random 96-bit nonce. -Packet code Rationale +Packet code Rationale Packet codes 0x00 and 0x01 are already used in all Waku / Whisper versions. Packet code 0x02 and 0x03 were previously used in Whisper but are deprecated as of Waku v0.4 @@ -17758,14 +16801,14 @@ and the peer will be disconnected for violating the Whisper protocol. They might be useful for other purposes when it is not possible to spend time on PoW, e.g. if a stock exchange will want to provide live feed about the latest trades. -Additional capabilities +Additional capabilities Waku supports multiple capabilities. These include light node, rate limiting and bridging of traffic. Here we list these capabilities, how they are identified, what properties they have and what invariants they must maintain. Additionally there is the capability of a mailserver which is documented in its on specification. -Light node +Light node The rationale for light nodes is to allow for interaction with waku on resource restricted devices as bandwidth can often be an issue. Light nodes MUST NOT forward any incoming messages, @@ -17774,7 +16817,7 @@ When light nodes happen to connect to each other, they SHOULD disconnect. As this would result in messages being dropped between the two. Light nodes are identified by the light_node value in the status message. -Accounting for resources (experimental) +Accounting for resources (experimental) Nodes MAY implement accounting, keeping track of resource usage. It is heavily inspired by Swarm's SWAP protocol, @@ -17791,8 +16834,8 @@ statistics SHOULD be aggregated and saved by the client: In later versions this will be amended by nodes communication thresholds, settlements and disconnect logic. -Upgradability and Compatibility -General principles and policy +Upgradability and Compatibility +General principles and policy These are policies that guide how we make decisions when it comes to upgradability, compatibility, and extensibility: @@ -17830,14 +16873,14 @@ This is a form of accretion at a level above - it ensures a client can support both protocols at once and drop support for legacy versions gracefully. (1,2,3) -Backwards Compatibility +Backwards Compatibility Waku is a different subprotocol from Whisper so it isn't directly compatible. However, the data format is the same, so compatibility can be achieved by the use of a bridging mode as described below. Any client which does not implement certain packet codes should gracefully ignore the packets with those codes. This will ensure the forward compatibility. -Waku-Whisper bridging +Waku-Whisper bridging waku/0 and shh/6 are different DevP2P subprotocols, however they share the same data format making their envelopes compatible. This means we can bridge the protocols naively, this works as follows. @@ -17857,7 +16900,7 @@ This means we can bridge the protocols naively, this works as follows. we might get duplicate relaying for a message between C1 and C2. I.e. Whisper(<>Waku<>Whisper)<>Waku, A-C1-C2-B. Theoretically this bridging chain can get as long as TTL permits. -Forward Compatibility +Forward Compatibility It is desirable to have a strategy for maintaining forward compatibility between waku/0 and future version of waku. Here we outline some concerns and strategy for this. @@ -17890,13 +16933,13 @@ A node SHOULD NOT disconnect from a peer when receiving status-options with unknown option keys. -Appendix A: Security considerations +Appendix A: Security considerations There are several security considerations to take into account when running Waku. Chief among them are: scalability, DDoS-resistance and privacy. These also vary depending on what capabilities are used. The security considerations for extra capabilities such as mailservers can be found in their respective specifications. -Scalability and UX +Scalability and UX Bandwidth usage: In version 0 of Waku, bandwidth usage is likely to be an issue. For more investigation into this, @@ -17910,7 +16953,7 @@ for more and a possible Kademlia based alternative. Lack of incentives: Waku currently lacks incentives to run nodes, which means node operators are more likely to create centralized choke points. -Privacy +Privacy Light node privacy: The main privacy concern with light nodes is that directly connected peers will know that a message originates from them @@ -17931,13 +16974,13 @@ This is unlike e.g. Tor and mixnets. Similar to bloom filter privacy, if you use a very specific topic you reveal more information. See scalability model linked above. -Spam resistance +Spam resistance PoW bad for heterogeneous devices: Proof of work is a poor spam prevention mechanism. A mobile device can only have a very low PoW in order not to use too much CPU / burn up its phone battery. This means someone can spin up a powerful node and overwhelm the network. -Censorship resistance +Censorship resistance Devp2p TCP port blockable: By default Devp2p runs on port 30303, which is not commonly used for any other service. @@ -17945,14 +16988,14 @@ This means it is easy to censor, e.g. airport WiFi. This can be mitigated somewhat by running on e.g. port 80 or 443, but there are still outstanding issues. See libp2p and Tor's Pluggable Transport for how this can be improved. -Appendix B: Implementation Notes -Implementation Matrix +Appendix B: Implementation Notes +Implementation Matrix ClientSpec supportedDetails Status-go0.5details Nimbus0.4details -Recommendations for clients +Recommendations for clients Notes useful for implementing Waku mode. Avoid duplicate envelopes: @@ -17966,17 +17009,17 @@ where N is the number of peers you are connected to. Consider partition topics based on some usage, to avoid too much traffic on a single topic. -Node discovery +Node discovery Resource restricted devices SHOULD use EIP-1459 to discover nodes. Known static nodes MAY also be used. -Changelog -Version 0.6 +Changelog +Version 0.6 Released April 21,2020 Mark spec as Deprecated mode in terms of its lifecycle. -Version 0.5 +Version 0.5 Released March 17,2020 Clarify the preferred way of handling unknown keys @@ -17984,7 +17027,7 @@ in the status-options association list. Correct spec/implementation mismatch: Change RLP keys to be the their int values in order to reflect production behavior -Version 0.4 +Version 0.4 Released February 21, 2020. Simplify implementation matrix with latest state @@ -17995,7 +17038,7 @@ PoW Requirement (0x02), Bloom Filter (0x03), Rate limi Topic interest (0x21) - all superseded by the new Status Code (0x22) Increased topic-interest capacity from 1000 to 10000 -Version 0.3 +Version 0.3 Released February 13, 2020. Recommend DNS based node discovery over other Discovery methods. @@ -18007,7 +17050,7 @@ specifying options as association list. Upgradability policy. topic-interest packet code. -Version 0.2 +Version 0.2 Released December 10, 2019. General style improvements. @@ -18025,7 +17068,7 @@ implementation matrix across various clients with breakdown per capability. Accounting for resources mode (very experimental). Clarify differences with Whisper. -Version 0.1 +Version 0.1 Initial version. Released November 21, 2019. Differences between shh/6 and waku/0 Summary of main differences between this spec and Whisper v6, as described in EIP-627: @@ -18038,19 +17081,35 @@ confirmations-enabled and rate-limits Mail Server and Mail Client functionality is now part of the specification. P2P Message packet contains a list of envelopes instead of a single envelope. -Copyright +Copyright Copyright and related rights waived via CC0. -Footnotes +Footnotes 1 Felix Lange et al. The RLPx Transport Protocol. Ethereum. - -slug: 16 -title: 16/WAKU2-RPC -name: Waku v2 RPC API -status: deprecated -tags: waku-core -editor: Hanno Cornelius hanno@status.im +16/WAKU2-RPC + + +NameWaku v2 RPC API +Slug16 +Statusdeprecated +EditorHanno Cornelius <hanno@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-04-16 — 8b552ba — chore: mark 16/WAKU2-RPC as deprecated (#30) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-01 — 87b56de — Update and rename RPC.md to rpc.md +2024-01-27 — 9042acf — Rename README.md to RPC.md +2024-01-27 — eef961b — remove rfs folder +2024-01-25 — 8a53f24 — Create README.md + + Introduction This specification describes the JSON-RPC API that Waku v2 nodes MAY adhere to. Refer to the Waku v2 specification @@ -18640,9 +17699,9 @@ using the cursor received above; 2 messages per page, backward direction. "error": null } -Copyright +Copyright Copyright and related rights waived via CC0. -References +References JSON-RPC specification LibP2P Addressing @@ -18650,14 +17709,28 @@ using the cursor received above; 2 messages per page, backward direction. Waku v2 specification IETF RFC 4648 - The Base16, Base32, and Base64 Data Encodings - -slug: 18 -title: 18/WAKU2-SWAP -name: Waku SWAP Accounting -status: deprecated -editor: Oskar Thorén oskarth@titanproxy.com -contributor: Ebube Ud ebube@status.im -Abstract +18/WAKU2-SWAP + + +NameWaku SWAP Accounting +Slug18 +Statusdeprecated +EditorOskar Thorén <oskarth@titanproxy.com> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-04-18 — 8f94e97 — docs: deprecate swap protocol (#31) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-01-31 — 0d8ad08 — Update and rename SWAP.md to swap.md +2024-01-31 — 3c8410c — Create SWAP.md + + +Abstract This specification outlines how we do accounting and settlement based on the provision and usage of resources, most immediately bandwidth usage and/or storing and retrieving of Waku message. @@ -18665,7 +17738,7 @@ This enables nodes to cooperate and efficiently share resources, and in the case of unequal nodes to settle the difference through a relaxed payment mechanism in the form of sending cheques. Protocol identifier*: /vac/waku/swap/2.0.0-beta1 -Motivation +Motivation The Waku network makes up a service network, and some nodes provide a useful service to other nodes. We want to account for that, and when imbalances arise, settle this. @@ -18851,9 +17924,9 @@ pick another node. In the hard phase, in addition to sending cheques and activating policy, this is done with blockchain integration on a public testnet. More details TBD. This also includes settlements where cheques can be redeemed. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References Prisoner's Dilemma Axelrod - Evolution of Cooperation (book) @@ -18871,13 +17944,27 @@ General TODOs: - Specify chequeboo --> - -slug: 21 -title: 21/WAKU2-FAULT-TOLERANT-STORE -name: Waku v2 Fault-Tolerant Store -status: deleted -editor: Sanaz Taheri sanaz@status.im -contributors: +21/WAKU2-FAULT-TOLERANT-STORE + + +NameWaku v2 Fault-Tolerant Store +Slug21 +Statusdeleted +EditorSanaz Taheri <sanaz@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-11-04 — cb4d0de — Update 21/WAKU2-FAULT-TOLERANT-STORE: Deleted (#181) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-01-31 — 5da8a11 — Update and rename FAULT-TOLERANT-STORE.md to fault-tolerant-store.md +2024-01-27 — 206133e — Create FAULT-TOLERANT-STORE.md + + The reliability of 13/WAKU2-STORE protocol heavily relies on the fact that full nodes i.e., those who persist messages have high availability and @@ -18908,10 +17995,10 @@ while using this method is that a querying node has to reveal its offline time to the queried node. This will gradually result in the extraction of the node's activity pattern which can lead to inference attacks. -Wire Specification +Wire Specification We extend the HistoryQuery protobuf message with two fields of start_time and end_time to signify the time range to be queried. -Payloads +Payloads syntax = "proto3"; message HistoryQuery { @@ -18961,10 +18048,10 @@ As such, the messages field of the corresponding HistoryResponse MUST contain historical waku messages that satisfy the indicated pubsubtopic AND contentFilters AND the time range [start_time, end_time]. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 13/WAKU2-STORE timestamp @@ -18974,22 +18061,25 @@ MUST contain historical waku messages that satisfy the indicated pubsubto scalable infrastructure for developers creating applications for the network state. Published Specifications are currently available here, Nomos Specifications. - -title: NOMOSDA-ENCODING -name: NomosDA Encoding Protocol -status: raw -category: -tags: data-availability -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors: +Nomos Raw Specifications +Early-stage Nomos specifications that have not yet progressed beyond raw status. +NOMOSDA-ENCODING + + +NameNomosDA Encoding Protocol +Statusraw +EditorDaniel Sanchez-Quiros <danielsq@status.im> +ContributorsDaniel Kashepava <danielkashepava@status.im>Álvaro Castro-Castilla <alvaro@status.im>Filip Dimitrijevic <filip@status.im>Thomas Lavaur <thomaslavaur@status.im>Mehmet Gonen <mehmet@status.im> + + + +Timeline -Daniel Kashepava danielkashepava@status.im -Álvaro Castro-Castilla alvaro@status.im -Filip Dimitrijevic filip@status.im -Thomas Lavaur thomaslavaur@status.im -Mehmet Gonen mehmet@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — 39d6f07 — added nomos/raw/nomosda-encoding.md draft (#156) - + Introduction This document describes the encoding and verification processes of NomosDA, which is the data availability (DA) solution used by the Nomos blockchain. NomosDA provides an assurance that all data from Nomos blobs are accessible and verifiable by every network participant. This document presents an implementation specification describing how: @@ -18997,7 +18087,7 @@ contributors: Encoders encode blobs they want to upload to the Data Availability layer. Other nodes implement the verification of blobs that were already uploaded to DA. -Definitions +Definitions Encoder: An encoder is any actor who performs the encoding process described in this document. This involves committing to the data, generating proofs, and submitting the result to the DA layer. @@ -19119,183 +18209,32 @@ b. The amount of rows depends on the size of the data. Details The encoder and verifier processes described above make use of a variety of cryptographic functions to facilitate the correct verification of column data by verifiers. These functions rely on primitives such as polynomial commitments and Reed-Solomon erasure codes, the details of which are outside the scope of this document. These details, as well as introductions to the cryptographic primitives being used, can be found in the NomosDA Cryptographic Protocol: NomosDA Cryptographic Protocol -References +References Encoder Specification: GitHub/encoder.py Verifier Specification: GitHub/verifier.py Cryptographic protocol: NomosDA Cryptographic Protocol -Copyright +Copyright Copyright and related rights waived via CC0. - -title: NOMOSDA-ENCODING -name: NomosDA Encoding Protocol -status: raw -category: -tags: data-availability -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors: +NOMOS-DA-NETWORK + + +NameNomosDA Network +Statusraw +EditorDaniel Sanchez Quiros <danielsq@status.im> +ContributorsÁlvaro Castro-Castilla <alvaro@status.im>Daniel Kashepava <danielkashepava@status.im>Gusto Bacvinka <augustinas@status.im>Filip Dimitrijevic <filip@status.im> + + + +Timeline -Daniel Kashepava danielkashepava@status.im -Álvaro Castro-Castilla alvaro@status.im -Filip Dimitrijevic filip@status.im -Thomas Lavaur thomaslavaur@status.im -Mehmet Gonen mehmet@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — 51ef4cd — added nomos/raw/nomosda-network.md (#160) - + Introduction -This document describes the encoding and verification processes of NomosDA, which is the data availability (DA) solution used by the Nomos blockchain. NomosDA provides an assurance that all data from Nomos blobs are accessible and verifiable by every network participant. -This document presents an implementation specification describing how: - -Encoders encode blobs they want to upload to the Data Availability layer. -Other nodes implement the verification of blobs that were already uploaded to DA. - -Definitions - - -Encoder: An encoder is any actor who performs the encoding process described in this document. This involves committing to the data, generating proofs, and submitting the result to the DA layer. -In the Nomos architecture, the rollup sequencer typically acts as the encoder, but the role is not exclusive and any actor in the DA layer can also act as encoders. - - -Verifier: Verifies its portion of the distributed blob data as per the verification protocol. In the Nomos architecture, the DA nodes act as the verifiers. - - -Overview -In the encoding stage, the encoder takes the DA parameters and the padded blob data and creates an initial matrix of data chunks. This matrix is expanded using Reed-Solomon coding and various commitments and proofs are created for the data. -When a verifier receives a sample, it verifies the data it receives from the encoder and broadcasts the information if the data is verified. Finally, the verifier stores the sample data for the required length of time. -Construction -The encoder and verifier use the NomosDA cryptographic protocol to carry out their respective functions. These functions are implemented as abstracted and configurable software entities that allow the original data to be encoded and verified via high-level operations. -Glossary -NameDescriptionRepresentation -CommitmentCommitment as per the NomosDA Cryptographic Protocolbytes -ProofProof as per the NomosDA Cryptographic Protocolbytes -ChunksMatrixMatrix of chunked data. Each chunk is 31 bytes. Row and Column sizes depend on the encoding necessities.List[List[bytes]] - - -Encoder -An encoder takes a set of parameters and the blob data, and creates a matrix of chunks that it uses to compute the necessary cryptographic data. It produces the set of Reed-Solomon (RS) encoded data, the commitments, and the proofs that are needed prior to dispersal. -flowchart LR - A[DaEncoderParams] -->|Input| B(Encoder) - I[31bytes-padded-input] -->|Input| B - B -->|Creates| D[Chunks matrix] - D --> |Input| C[NomosDA encoding] - C --> E{Encoded data📄} - -Encoding Process -The encoder executes the encoding process as follows: - - -The encoder takes the following input parameters: -class DAEncoderParams: - column_count: usize - bytes_per_field_element: usize - -NameDescriptionRepresentation -column_countThe number of subnets available for dispersal in the systemusize, int in Python -bytes_per_field_elementThe amount of bytes per data chunk. This is set to 31 bytes. Each chunk has 31 bytes rather than 32 to ensure that the chunk value does not exceed the maximum value on the BLS12-381 elliptic curve.usize, int in Python - - - -The encoder also includes the blob data to be encoded, which must be of a size that is a multiple of bytes_per_field_element bytes. Clients are responsible for padding the data so it fits this constraint. - - -The encoder splits the data into bytes_per_field_element-sized chunks. It also arranges these chunks into rows and columns, creating a matrix. -a. The amount of columns of the matrix needs to fit with the column_count parameter, taking into account the rs_expansion_factor (currently fixed to 2). -i. This means that the size of each row in this matrix is (bytes_per_field_element*column_count)/rs_expansion_factor. -b. The amount of rows depends on the size of the data. - - -The data is encoded as per the cryptographic details. - - -The encoder provides the encoded data set: -NameDescriptionRepresentation -dataOriginal databytes -chunked_dataMatrix before RS expansionChunksMatrix -extended_matrixMatrix after RS expansionChunksMatrix -row_commitmentsCommitments for each matrix rowList[Commitment] -combined_column_proofsProofs for each matrix columnList[Proof] - - -class EncodedData: - data: bytes - chunked_data: ChunksMatrix - extended_matrix: ChunksMatrix - row_commitments: List[Commitment] - combined_column_proofs: List[Proof] - - - -Encoder Limits -NomosDA does not impose a fixed limit on blob size at the encoding level. However, protocols that involve resource-intensive operations must include upper bounds to prevent abuse. In the case of NomosDA, blob size limits are expected to be enforced, as part of the protocol's broader responsibility for resource management and fairness. -Larger blobs naturally result in higher computational and bandwidth costs, particularly for the encoder, who must compute a proof for each column. Without size limits, malicious clients could exploit the system by attempting to stream unbounded data to DA nodes. Since payment is provided before blob dispersal, DA nodes are protected from performing unnecessary work. This enables the protocol to safely accept very large blobs, as the primary computational cost falls on the encoder. The protocol can accommodate generous blob sizes in practice, while rejecting only absurdly large blobs, such as those exceeding 1 GB, to prevent denial-of-service attacks and ensure network stability. -To mitigate this, the protocol define acceptable blob size limits, and DA implementations enforce local mitigation strategies, such as flagging or blacklisting clients that violate these constraints. -Verifier -A verifier checks the proper encoding of data blobs it receives. A verifier executes the verification process as follows: - - -The verifier receives a DAShare with the required verification data: -NameDescriptionRepresentation -columnColumn chunks (31 bytes) from the encoded matrixList[bytes] -column_idxColumn id (0..2047). It is directly related to the subnetworks in the network specification.u16, unsigned int of 16 bits. int in Python -combined_column_proofProof of the random linear combination of the column elements.Proof -row_commitmentsCommitments for each matrix rowList[Commitment] -blob_idThis is computed as the hash (blake2b) of row_commitmentsbytes - - - -Upon receiving the above data it verifies the column data as per the cryptographic details. If the verification is successful, the node triggers the replication protocol and stores the blob. -class DAShare: - column: Column - column_idx: u16 - combined_column_proof: Proof - row_commitments: List[Commitment] - - def blob_id(self) -> BlobId: - hasher = blake2b(digest_size=32) - for c in self.row_commitments: - hasher.update(bytes(c)) - return hasher.digest() - - - -Verification Logic -sequenceDiagram - participant N as Node - participant S as Subnetwork Column N - loop For each incoming blob column - N-->>N: If blob is valid - N-->>S: Replication - N->>N: Stores blob - end - -Details -The encoder and verifier processes described above make use of a variety of cryptographic functions to facilitate the correct verification of column data by verifiers. These functions rely on primitives such as polynomial commitments and Reed-Solomon erasure codes, the details of which are outside the scope of this document. These details, as well as introductions to the cryptographic primitives being used, can be found in the NomosDA Cryptographic Protocol: -NomosDA Cryptographic Protocol -References - -Encoder Specification: GitHub/encoder.py -Verifier Specification: GitHub/verifier.py -Cryptographic protocol: NomosDA Cryptographic Protocol - -Copyright -Copyright and related rights waived via CC0. - -title: NOMOS-DA-NETWORK -name: NomosDA Network -status: raw -category: -tags: network, data-availability, da-nodes, executors, sampling -editor: Daniel Sanchez Quiros danielsq@status.im -contributors: - -Álvaro Castro-Castilla alvaro@status.im -Daniel Kashepava danielkashepava@status.im -Gusto Bacvinka augustinas@status.im -Filip Dimitrijevic filip@status.im - - -Introduction NomosDA is the scalability solution protocol for data availability within the Nomos network. This document delineates the protocol's structure at the network level, identifies participants, @@ -19338,7 +18277,7 @@ and the data is split into a fixed number of portions (see the Overview +Overview Network Participants The NomosDA network includes three categories of participants: @@ -19368,7 +18307,7 @@ and replicated data. Indexing: Tracks and exposes blob metadata on-chain. NomosDA Indexing -Construction +Construction NomosDA Network Registration Entities wishing to participate in NomosDA must declare their role via SDP (Service Declaration Protocol). Once declared, they're accounted for in the subnetwork construction. @@ -19466,7 +18405,7 @@ subgraph Dispersal Executor -->|Disperse| N10 end -Details +Details Network specifics The NomosDA network is engineered for connection efficiency. Executors manage numerous open connections, @@ -19485,7 +18424,7 @@ triggering the specific protocol once established: DA nodes can utilize the same connection for all sub-protocols. This, combined with virtual subnetworks (membership sets), ensures the overlay node distribution is scalable for networks of any size. -References +References Encoding Specification Encoding & Verification Specification @@ -19501,23 +18440,29 @@ ensures the overlay node distribution is scalable for networks of any size. multiplexed QUIC -Copyright +Copyright Copyright and related rights waived via CC0. - -title: P2P-HARDWARE-REQUIREMENTS -name: Nomos p2p Network Hardware Requirements Specification -status: raw -category: infrastructure -tags: [hardware, requirements, nodes, validators, services] -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors: +P2P-HARDWARE-REQUIREMENTS + + +NameNomos p2p Network Hardware Requirements Specification +Statusraw +Categoryinfrastructure +EditorDaniel Sanchez-Quiros <danielsq@status.im> +ContributorsFilip Dimitrijevic <filip@status.im> + + + +Timeline -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — 34bbd7a — Created nomos/raw/hardware-requirements.md file (#172) - -Abstract + +Abstract This specification defines the hardware requirements for running various types of Nomos blockchain nodes. Hardware needs vary significantly based on the node's role, from lightweight verification nodes to high-performance Zone Executors. The requirements are designed to support diverse participation levels while ensuring network security and performance. -Motivation +Motivation The Nomos network is designed to be inclusive and accessible across a wide range of hardware configurations. By defining clear hardware requirements for different node types, we enable: Inclusive Participation: Allow users with limited resources to participate as Light Nodes @@ -19527,7 +18472,7 @@ contributors: Service Quality: Define requirements for optional services that enhance network functionality Important Notice: These hardware requirements are preliminary and subject to revision based on implementation testing and real-world network performance data. -Specification +Specification Node Types Overview Hardware requirements vary based on the node's role and services: @@ -19535,7 +18480,7 @@ contributors: Basic Bedrock Node: Standard validation participation Service Nodes: Enhanced capabilities for optional network services -Light Node +Light Node Light Nodes provide network verification with minimal resource requirements, suitable for resource-constrained environments. Target Use Cases: @@ -19672,7 +18617,7 @@ contributors: Service Combinations: Running multiple services simultaneously increases requirements Geographic Location: Network latency affects optimal performance requirements -Security Considerations +Security Considerations Hardware Security Secure Storage: Use encrypted storage for sensitive node data @@ -19701,33 +18646,34 @@ contributors: Storage Usage: Configurable retention policies and compression Network Usage: Adaptive bandwidth utilization based on libp2p capacity and QUIC connection efficiency -References +References libp2p protocol QUIC protocol -Copyright +Copyright Copyright and related rights waived via CC0. - -title: P2P-NAT-SOLUTION -name: Nomos P2P Network NAT Solution Specification -status: raw -category: networking -tags: [nat, traversal, autonat, upnp, pcp, nat-pmp] -editor: Antonio Antonino antonio@status.im -contributors: +P2P-NAT-SOLUTION + + +NameNomos P2P Network NAT Solution Specification +Statusraw +Categorynetworking +EditorAntonio Antonino <antonio@status.im> +ContributorsÁlvaro Castro-Castilla <alvaro@status.im>Daniel Sanchez-Quiros <danielsq@status.im>Petar Radovic <petar@status.im>Gusto Bacvinka <augustinas@status.im>Youngjoon Lee <youngjoon@status.im>Filip Dimitrijevic <filip@status.im> + + + +Timeline -Álvaro Castro-Castilla alvaro@status.im -Daniel Sanchez-Quiros danielsq@status.im -Petar Radovic petar@status.im -Gusto Bacvinka augustinas@status.im -Youngjoon Lee youngjoon@status.im -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — cfb3b78 — Created nomos/raw/p2p-nat-solution.md draft (#174) - -Abstract + +Abstract This specification defines a comprehensive NAT (Network Address Translation) traversal solution for the Nomos P2P network. The solution enables nodes to automatically determine their NAT status and establish both outbound and inbound connections regardless of network configuration. The strategy combines AutoNAT, dynamic port mapping protocols, and continuous verification to maximize public reachability while maintaining decentralized operation. -Motivation +Motivation Network Address Translation presents a critical challenge for Nomos participants, particularly those operating on consumer hardware without technical expertise. The Nomos network requires a NAT traversal solution that: Automatic Operation: Works out-of-the-box without user configuration @@ -19737,7 +18683,7 @@ contributors: Dynamic Adaptation: Handles changing network environments and configurations The solution must ensure that nodes can both establish outbound connections and accept inbound connections from other peers, maintaining network connectivity across diverse NAT configurations. -Specification +Specification Terminology Public Node: A node that is publicly reachable via a public IP address or valid port mapping @@ -19990,7 +18936,7 @@ contributors: lease_duration: 7200s retry_interval: 300s -Security Considerations +Security Considerations NAT Traversal Security Port Mapping Validation: Verify that requested port mappings are actually created @@ -20023,7 +18969,7 @@ contributors: Continuous Monitoring: Automatic recovery from connectivity loss Protocol Redundancy: Multiple port mapping protocols increase reliability -References +References Multiaddress spec Identify protocol spec @@ -20033,33 +18979,34 @@ contributors: NAT-PMP - RFC 6886 UPnP IGD - RFC 6970 -Copyright +Copyright Copyright and related rights waived via CC0. - -title: P2P-NETWORK-BOOTSTRAPPING -name: Nomos P2P Network Bootstrapping Specification -status: raw -category: networking -tags: [p2p, networking, bootstrapping, peer-discovery, libp2p] -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors: +P2P-NETWORK-BOOTSTRAPPING + + +NameNomos P2P Network Bootstrapping Specification +Statusraw +Categorynetworking +EditorDaniel Sanchez-Quiros <danielsq@status.im> +ContributorsÁlvaro Castro-Castilla <alvaro@status.im>Petar Radovic <petar@status.im>Gusto Bacvinka <augustinas@status.im>Antonio Antonino <antonio@status.im>Youngjoon Lee <youngjoon@status.im>Filip Dimitrijevic <filip@status.im> + + + +Timeline -Álvaro Castro-Castilla alvaro@status.im -Petar Radovic petar@status.im -Gusto Bacvinka augustinas@status.im -Antonio Antonino antonio@status.im -Youngjoon Lee youngjoon@status.im -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — aa8a3b0 — Created nomos/raw/p2p-network-bootstrapping.md draft (#175) - -Introduction + +Introduction Nomos network bootstrapping is the process by which a new node discovers peers and synchronizes with the existing decentralized network. It ensures that a node can: Discover Peers – Find other active nodes in the network. Establish Connections – Securely connect to trusted peers. Negotiate (libp2p) Protocols - Ensure that other peers operate in the same protocols as the node needs. -Overview +Overview The Nomos P2P network bootstrapping strategy relies on a designated subset of bootstrap nodes to facilitate secure and efficient node onboarding. These nodes serve as the initial entry points for new network participants. Key Design Principles Trusted Bootstrap Nodes @@ -20148,7 +19095,7 @@ contributors: DNS seeds for dynamic address resolution Community-maintained lists with cryptographic verification -Security Considerations +Security Considerations Trust Model Bootstrap nodes operate under a minimal trust model: @@ -20180,7 +19127,7 @@ contributors: Bandwidth: 10 Mbps during initial sync Storage: Minimal requirements -References +References P2P Network Specification (internal document) libp2p QUIC Transport @@ -20190,23 +19137,29 @@ contributors: Cardano nodes connectivity Cardano peer sharing -Copyright +Copyright Copyright and related rights waived via CC0. - -title: NOMOS-P2P-NETWORK -name: Nomos P2P Network Specification -status: draft -category: networking -tags: [p2p, networking, libp2p, kademlia, gossipsub, quic] -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors: +NOMOS-P2P-NETWORK + + +NameNomos P2P Network Specification +Statusdraft +Categorynetworking +EditorDaniel Sanchez-Quiros <danielsq@status.im> +ContributorsFilip Dimitrijevic <filip@status.im> + + + +Timeline -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — a3a5b91 — Created nomos/raw/p2p-network.md file (#169) - -Abstract + +Abstract This specification defines the peer-to-peer (P2P) network layer for Nomos blockchain nodes. The network serves as the comprehensive communication infrastructure enabling transaction dissemination through mempool and block propagation. The specification leverages established libp2p protocols to ensure robust, scalable performance with low bandwidth requirements and minimal latency while maintaining accessibility for diverse hardware configurations and network environments. -Motivation +Motivation The Nomos blockchain requires a reliable, scalable P2P network that can: Support diverse hardware: From laptops to dedicated servers across various operating systems and geographic locations @@ -20215,7 +19168,7 @@ contributors: Scale efficiently: Support large-scale networks (+10k nodes) with eventual consistency Provide low-latency communication: Enable efficient transaction and block propagation -Specification +Specification Network Architecture Overview The Nomos P2P network addresses three critical challenges: @@ -20403,7 +19356,7 @@ contributors: Security: Reduces attack surface by limiting configurable network parameters Simplicity: Eliminates need for operators to understand complex P2P tuning -Security Considerations +Security Considerations Network-Level Security Peer Authentication: Utilize libp2p's built-in peer identity verification @@ -20438,7 +19391,7 @@ contributors: CPU Usage: Efficient cryptographic operations Network Bandwidth: Adaptive based on node role and capacity -References +References Original working document, from Nomos Notion: P2P Network Specification. libp2p Specifications @@ -20449,27 +19402,26 @@ contributors: Nomos Implementation - Reference implementation and source code Nomos Node Configuration - Example node configuration -Copyright +Copyright Copyright and related rights waived via CC0. - -title: NOMOS-SDP -name: Nomos Service Declaration Protocol Specification -status: raw -category: -tags: participation, validators, declarations -editor: Marcin Pawlowski marcin@status.im -contributors: +NOMOS-SDP + + +NameNomos Service Declaration Protocol Specification +Statusraw +EditorMarcin Pawlowski <marcin@status.im> +ContributorsMehmet <mehmet@status.im>Daniel Sanchez Quiros <danielsq@status.im>Álvaro Castro-Castilla <alvaro@status.im>Thomas Lavaur <thomaslavaur@status.im>Filip Dimitrijevic <filip@status.im>Gusto Bacvinka <augustinas@status.im>David Rusu <davidrusu@status.im> + + + +Timeline -Mehmet mehmet@status.im -Daniel Sanchez Quiros danielsq@status.im -Álvaro Castro-Castilla alvaro@status.im -Thomas Lavaur thomaslavaur@status.im -Filip Dimitrijevic filip@status.im -Gusto Bacvinka augustinas@status.im -David Rusu davidrusu@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — 53dfb97 — Created nomos/raw/sdp.md draft (#157) - -Introduction + +Introduction This document defines a mechanism enabling validators to declare their participation in specific protocols that require a known and agreed-upon list of participants. Some examples of this are Data Availability and the Blend Network. We create a single repository of identifiers which is used to establish secure communication between validators and provide services. Before being admitted to the repository, the validator proves that it locked at least a minimum stake. Requirements The requirements for the protocol are defined as follows: @@ -20477,7 +19429,7 @@ contributors: A declaration must be backed by a confirmation that the sender of the declaration owns a certain value of the stake. A declaration is valid until it is withdrawn or is not used for a service-specific amount of time. -Overview +Overview The SDP enables nodes to declare their eligibility to serve a specific service in the system, and withdraw their declarations. Protocol Actions The protocol defines the following actions: @@ -20495,7 +19447,7 @@ contributors: After the service-specific locking period, the node can send a withdrawal message, and its declaration is removed from the ledger, which means that the node will no longer provide the service. 💡 The protocol messages are subject to a finality that means messages become part of the immutable ledger after a delay. The delay at which it happens is defined by the consensus. -Construction +Construction In this section, we present the main constructions of the protocol. First, we start with data definitions. Second, we describe the protocol actions. Finally, we present part of the Bedrock Mantle design responsible for storing and processing SDP-related messages and data. Data In this section, we discuss and define data types, messages, and their storage. @@ -20694,7 +19646,7 @@ d. The nonce is increasing monotonically. Appendix Future Improvements Refer to the Mantle Specification for a list of potential improvements to the protocol. -References +References Mantle and ZK Proof: Mantle Specification Ed25519 Digital Signatures: RFC 8032 @@ -20702,26 +19654,32 @@ d. The nonce is increasing monotonically. libp2p Multiaddr: Addressing Specification Zero Knowledge Signatures: ZkSignature Scheme -Copyright +Copyright Copyright and related rights waived via CC0. - -title: CONSENSUS-CLARO -name: Claro Consensus Protocol -status: deprecated -category: Standards Track -tags: +Nomos Deprecated Specifications +Deprecated Nomos specifications kept for archival and reference purposes. +CONSENSUS-CLARO + + +NameClaro Consensus Protocol +Statusdeprecated +CategoryStandards Track +EditorCorey Petty <corey@status.im> +ContributorsÁlvaro Castro-CastillaMark Evenson + + + +Timeline -logos/consensus -editor: Corey Petty corey@status.im -created: 01-JUL-2022 -revised: <2022-08-26 Fri 13:11Z> -uri: <https://rdf.logos.co/protocol/Claro/1/0/0#<2022-08-26%20Fri$2013:11Z> -contributors: -Álvaro Castro-Castilla -Mark Evenson +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-02-15 — 1ddddc7 — update to tree structure (#128) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-02-02 — f52c54f — Update and rename CLARO.md to claro.md +2024-01-27 — 01e2781 — Create CLARO.md - -Abstract + +Abstract This document specifies Claro: a Byzantine, fault-tolerant, binary decision agreement algorithm that utilizes bounded memory for its execution. Claro is a novel variant of the Snow family providing a probabilistic @@ -20736,7 +19694,7 @@ in order to disambiguate from a previously released research endeavor by Amores-Sesar, Cachin, and Tedeschi. Their naming was coincidentally named the same as our work but is sufficiently differentiated from how ours works. -Motivation +Motivation This work is a part of a larger research endeavor to explore highly scalable Byzantine Fault Tolerant (BFT) consensus protocols. Consensus lies at the heart of many decentralized protocols, and @@ -21271,8 +20229,8 @@ three possible values of the opinion: the parity summations across network invariants often become easier to manipulate. -Security Considerations -Privacy +Security Considerations +Privacy In practice, each honest node gossips its current opinion which reduces the number of messages that need to be gossiped for a given proposal. The resulting impact on the privacy of the node's opinion @@ -21371,695 +20329,34 @@ Move: a Language for Writing DAG Abstractions json-ld -Copyright -Copyright and related rights waived via -CC0 - -title: CONSENSUS-CLARO -name: Claro Consensus Protocol -status: deprecated -category: Standards Track -tags: - -logos/consensus -editor: Corey Petty corey@status.im -created: 01-JUL-2022 -revised: <2022-08-26 Fri 13:11Z> -uri: <https://rdf.logos.co/protocol/Claro/1/0/0#<2022-08-26%20Fri$2013:11Z> -contributors: -Álvaro Castro-Castilla -Mark Evenson - - -Abstract -This document specifies Claro: a Byzantine, fault-tolerant, binary decision -agreement algorithm that utilizes bounded memory for its execution. -Claro is a novel variant of the Snow family providing a probabilistic -leaderless BFT consensus algorithm that achieves metastablity via -network sub-sampling. We present an application context of the use of -Claro in an efficient, leaderless, probabilistic permission-less -consensus mechanism. We outline a simple taxonomy of Byzantine -adversaries, leaving explicit explorations of to subsequent -publication. -NOTE: We have renamed this variant to Claro from Glacier -in order to disambiguate from a previously released research endeavor by -Amores-Sesar, Cachin, and Tedeschi. -Their naming was coincidentally named the same as our work but -is sufficiently differentiated from how ours works. -Motivation -This work is a part of a larger research endeavor to -explore highly scalable Byzantine Fault Tolerant (BFT) consensus protocols. -Consensus lies at the heart of many decentralized protocols, and -thus its characteristics and properties are inherited by applications built on top. -Thus, we seek to improve upon the current state of the art in two main directions: -base-layer scalability and censorship resistance. -Avalanche has shown to exibit the former in a production environment in a way -that is differentiated from Nakamoto consensus and -other Proof of Stake (PoS) protocols based in practical Byzantine Fault Tolerant -(pBFT) methodologies. -We aim to understand its limitations and improve upon them. -Background -Our starting point is Avalanche’s Binary Byzantine Agreement algorithm, -called Snowball. -As long as modifications allow a DAG to be constructed later on, -this simplifies the design significantly. -The DAG stays the same in principle: it supports confidence, -but the core algorithm can be modeled without. -The concept of the Snowball algorithm is relatively simple. -Following is a simplified description (lacking some details, but giving an overview). -For further details, please refer to the Avalanche paper. - -The objective is to vote yes/no on a decision -(this decision could be a single bit or, -in our DAG use case, whether a vertex should be included or not). -Every node has an eventually-consistent complete view of the network. -It will select at random k nodes, and -will ask their opinion on the decision (yes/no). -After this sampling is finished, -if there is a vote that has more than an alpha threshold, -it accumulates one count for this opinion, -as well as changes its opinion to this one. -But, if a different opinion is received, the counter is reset to 1. -If no threshold alpha is reached, the counter is reset to 0 instead. -After several iterations of this algorithm, -we will reach a threshold beta, and decide on that as final. - -Next, we will proceed to describe our new algorithm, based on Snowball. -We have identified a shortcoming of the Snowball algorithm -that was a perfect starting point for devising improvements. -The scenario is as follows: - -There is a powerful adversary in the network, -that controls a large percentage of the node population: 10% to ~50%. -This adversary follows a strategy that allows them to -rapidly change the decision bit -(possibly even in a coordinated way) so as to maximally confuse the honest nodes. -Under normal conditions, -honest nodes will accumulate supermajorities soon enough, and -reach the beta threshold. -However, when an honest node performs a query and does not reach the threshold -alpha of responses, the counter will be set to 0. -The highest threat to Snowball is an adversary -that keeps it from reaching the beta threshold, -managing to continuously reset the counter, and -steering Snowball away from making a decision. - -This document only outlines the specification to Claro. -Subsequent analysis work on Claro -(both on its performance and how it differentiates with Snowball) -will be published shortly and this document will be updated. -Claro Algorithm Specification -The Claro consensus algorithm computes a boolean decision on a -proposition via a set of distributed computational nodes. Claro is -a leaderless, probabilistic, binary consensus algorithm with fast -finality that provides good reliability for network and Byzantine -fault tolerance. -Algorithmic concept -Claro is an evolution of the Snowball Byzantine Binary Agreement (BBA) algorithm, -in which we tackle specifically the perceived weakness described above. -The main focus is going to be the counter and the triggering of the reset. -Following, we elaborate the different modifications and -features that have been added to the reference algorithm: - -Instead of allowing the latest evidence to change the opinion completely, -we take into account all accumulated evidence, -to reduce the impact of high variability when there is already a -large amount of evidence collected. -Eliminate the counter and threshold scheme, -and introduce instead two regimes of operation: - -One focused on grabbing opinions and reacting as soon as possible. -This part is somewhat closer conceptually to the reference algorithm. -Another one focused on interpreting the accumulated data -instead of reacting to the latest information gathered. - - -Finally, combine those two phases via a transition function. -This avoids the creation of a step function, or -a sudden change in behavior that could complicate analysis and -understanding of the dynamics. -Instead, we can have a single algorithm that transfers weight -from one operation to the other as more evidence is gathered. -Additionally, we introduce a function for weighted sampling. -This will allow the combination of different forms of weighting: - -Staking -Heuristic reputation -Manual reputation. - - - -It’s worth delving a bit into the way the data is interpreted -in order to reach a decision. -Our approach is based conceptually on the paper Confidence as Higher-Order Uncertainty, -which describes a frequentist approach to decision certainty. -The first-order certainty, measured by frequency, -is caused by known positive evidence, and -the higher-order certainty is caused by potential positive evidence. -Because confidence is a relative measurement defined on evidence, -it naturally follows comparing the amount of evidence the system knows -with the amount that it will know in the near future (defining “near” as a constant). -Intuitively, we are looking for a function of evidence, w, -call it c for confidence, that satisfies the following conditions: - -Confidence c is a continuous and monotonically increasing function of w. -(More evidence, higher confidence.) -When w = 0, c = 0. (Without any evidence, confidence is minimum.) -When w goes to infinity, c converges to 1. -(With infinite evidence, confidence is maximum.) - -The paper describes also a set of operations for the evidence/confidence pairs, -so that different sources of knowledge could be combined. -However, we leave here the suggestion of a possible research line in the future -combining an algebra of evidence/confidence pairs with -swarm-propagation algorithm like the one described in -this paper. -Initial opinion -A proposal is formulated to which consensus of truth or falsity is -desired. Each node that participates starts the protocol with an -opinion on the proposal, represented in the sequel as NO, NONE, -and YES. -A new proposition is discovered either by local creation or in -response to a query, a node checks its local opinion. If the node can -compute a justification of the proposal, it sets its opinion to one of -YES or NO. If it cannot form an opinion, it leaves its opinion as -NONE. -For now, we will ignore the proposal dissemination process and -assume all nodes participating have an initial opinion -to respond to within a given request. -Further research will relax this assumption and -analyze timing attacks on proposal propagation through the network. -The node then participates in a number of query rounds in which it -solicits other node's opinion in query rounds. Given a set of N -leaderless computational nodes, a gossip-based protocol is presumed to -exist which allows members to discover, join, and leave a weakly -transitory maximally connected graph. Joining this graph allows each -node to view a possibly incomplete node membership list of all other -nodes. This view may change as the protocol advances, as nodes join -and leave. Under generalized Internet conditions, the membership of -the graph would experience a churn rate varying across different -time-scales, as the protocol rounds progress. As such, a given node -may not have a view on the complete members participating in the -consensus on a proposal in a given round. -The algorithm is divided into 4 phases: - -Querying -Computing confidence, evidence, and accumulated evidence -Transition function -Opinion and Decision - - - -Setup Parameters -The node initializes the following integer ratios as constants: -# The following values are constants chosen with justification from experiments -# performed with the adversarial models - -# -confidence_threshold - <-- 1 - -# constant look ahead for number of rounds we expect to finalize a -# decision. Could be set dependent on number of nodes -# visible in the current gossip graph. -look_ahead - <-- 19 - -# the confidence weighting parameter (aka alpha_1) -certainty - <-- 4 / 5 -doubt ;; the lack of confidence weighting parameter (aka alpha_2) - <-- 2 / 5 - -k_multiplier ;; neighbor threshold multiplier - <-- 2 - -;;; maximal threshold multiplier, i.e. we will never exceed -;;; questioning k_initial * k_multiplier ^ max_k_multiplier_power peers -max_k_multiplier_power - <-- 4 - -;;; Initial number of nodes queried in a round -k_initial - <-- 7 - -;;; maximum query rounds before termination -max_rounds ;; placeholder for simulation work, no justification yet - <-- 100 - -The following variables are needed to keep the state of Claro: -;; current number of nodes to attempt to query in a round -k - <-- k_original - -;; total number of votes examined over all rounds -total_votes - <-- 0 -;; total number of YES (i.e. positive) votes for the truth of the proposal -total_positive - <-- 0 -;; the current query round, an integer starting from zero -round - <-- 0 - -Phase One: Query -A node selects k nodes randomly from the complete pool of peers in the -network. This query is can optionally be weighted, so the probability -of selecting nodes is proportional to their -Node Weighting -$$ -P(i) = \frac{w_i}{\sum_{j=0}^{j=N} w_j} -$$ -where w is evidence. -The list of nodes is maintained by a separate protocol (the network layer), -and eventual consistency of this knowledge in the network -suffices. Even if there are slight divergences in the network view -from different nodes, the algorithm is resilient to those. -A query is sent to each neighbor with the node's current opinion of -the proposal. -Each node replies with their current opinion on the proposal. -See the wire protocol Interoperability section for -details on the semantics and syntax of the "on the wire" -representation of this query. -Adaptive querying. An additional optimization in the query -consists of adaptively growing the k constant in the event of -high confusion. We define high confusion as the situation in -which neither opinion is strongly held in a query (i.e. a -threshold is not reached for either yes or no). For this, we will -use the alpha threshold defined below. This adaptive growth of -the query size is done as follows: -Every time the threshold is not reached, we multiply k by a -constant. In our experiments, we found that a constant of 2 works -well, but what really matters is that it stays within that order of -magnitude. -The growth is capped at 4 times the initial k value. Again, this -is an experimental value, and could potentially be increased. This -depends mainly on complex factors such as the size of the query -messages, which could saturate the node bandwidth if the number of -nodes queried is too high. -When the query finishes, the node now initializes the following two -values: - new_votes - <-- |total vote replies received in this round to the current query| - positive_votes - <-- |YES votes received from the query| - -Phase Two: Computation -When the query returns, three ratios are used later on to compute the -transition function and the opinion forming. Confidence encapsulates -the notion of how much we know (as a node) in relation to how much we -will know in the near future (this being encoded in the look-ahead -parameter l.) Evidence accumulated keeps the ratio of total positive -votes vs the total votes received (positive and negative), whereas the -evidence per round stores the ratio of the current round only. -Parameters -$$ -\begin{array}{lc} -\text{Look-ahead parameter} & l = 20 \newline -\text{First evidence parameter} & \alpha_1 = 0.8 \newline -\text{Second evidence parameter} & \alpha_2 = 0.5 \newline -\end{array} -$$ -Computation -$$ -\begin{array}{lc} -\text{Confidence} & c_{accum} \impliedby \frac{total\ votes} -{total\ votes + l} \newline -\text{Total accumulated evidence}& e_{accum} \impliedby \frac{total\ positive -votes}{total\ votes} \newline -\text{Evidence per round} & e_{round} \impliedby \frac{round\ positive -votes}{round\ votes} \newline -\end{array} -$$ -The node runs the new_votes and positive_votes parameters received -in the query round through the following algorithm: - - total_votes - +== new_votes - total_positive - +== positive_votes - confidence - <-- total_votes / (total_votes + look_ahead) - total_evidence - <-- total_positive / total_votes - new_evidence - <-- positive_votes / new_votes - evidence - <-- new_evidence * ( 1 - confidence ) + total_evidence * confidence - alpha - <-- doubt * ( 1 - confidence ) + certainty * confidence - -Phase Three: Computation -In order to eliminate the need for a step function (a conditional in -the code), we introduce a transition function from one regime to the -other. Our interest in removing the step function is twofold: - - -Simplify the algorithm. With this change the number of branches is -reduced, and everything is expressed as a set of equations. - - -The transition function makes the regime switch smooth, -making it harder to potentially exploit the sudden regime change in -some unforeseen manner. Such a swift change in operation mode could -potentially result in a more complex behavior than initially -understood, opening the door to elaborated attacks. The transition -function proposed is linear with respect to the confidence. - - -Transition Function -$$ -\begin{array}{cl} -evidence & \impliedby e_{round} (1 - c_{accum}) + e_{accum} c_{accum} \newline -\alpha & \impliedby \alpha_1 (1 - c_{accum}) + \alpha_2 c_{accum} \newline -\end{array} -$$ -Since the confidence is modeled as a ratio that depends on the -constant l, we can visualize the transition function at -different values of l. Recall that this constant encapsulates -the idea of “near future” in the frequentist certainty model: the -higher it is, the more distant in time we consider the next -valuable input of evidence to happen. -We have observed via experiment that for a transition function to be -useful, we need establish two requirements: - - -The change has to be balanced and smooth, giving an -opportunity to the first regime to operate and not jump directly -to the second regime. - - -The convergence to 1.0 (fully operating in the second regime) -should happen within a reasonable time-frame. We’ve set this -time-frame experimentally at 1000 votes, which is in the order of -~100 queries given a k of 9. - - -[[ Note: Avalanche uses k = 20, as an experimental result from their -deployment. Due to the fundamental similarities between the -algorithms, it’s a good start for us. ]] -The node updates its local opinion on the consensus proposal by -examining the relationship between the evidence accumulated for a -proposal with the confidence encoded in the alpha parameter: - IF - evidence > alpha - THEN - opinion <-- YES - ELSE IF - evidence < 1 - alpha - THEN - opinion <-- NO - -If the opinion of the node is NONE after evaluating the relation -between evidence and alpha, adjust the number of uniform randomly -queried nodes by multiplying the neighbors k by the k_multiplier -up to the limit of k_max_multiplier_power query size increases. - - ;; possibly increase number nodes to uniformly randomly query in next round - WHEN - opinion is NONE - AND - k < k_original * k_multiplier ^ max_k_multiplier_power - THEN - k <-- k * k_multiplier - -Decision -The next step is a simple one: change our opinion if the threshold -alpha is reached. This needs to be done separately for the YES/NO -decision, checking both boundaries. The last step is then to decide -on the current opinion. For that, a confidence threshold is -employed. This threshold is derived from the network size, and is -directly related to the number of total votes received. -Decision -$$ -\begin{array}{cl} -evidence > \alpha & \implies \text{opinion YES} \newline -evidence < 1 - \alpha & \implies \text{opinion NO} \newline -if\ \text{confidence} > c_{target} & THEN \ \text{finalize decision} \newline -\end{array} -$$ -After the OPINION phase is executed, the current value of confidence -is considered: if confidence exceeds a threshold derived from the -network size and directly related to the total votes received, an -honest node marks the decision as final, and always returns this -opinion is response to further queries from other nodes on the -network. - - IF - confidence > confidence_threshold - OR - round > max_rounds - THEN - finalized <-- T - QUERY LOOP TERMINATES - ELSE - round +== 1 - QUERY LOOP CONTINUES - -Thus, after the decision phase, either a decision has been finalized -and the local node becomes quiescent never initiating a new query, or -it initiates a new query. -Termination -A local round of Claro terminates in one of the following -execution model considerations: - - -No queries are received for any newly initiated round for temporal -periods observed via a locally computed passage of time. See the -following point on local time. - - -The confidence on the proposal exceeds our threshold for -finalization. - - -The number of rounds executed would be greater than -max_rounds. - - -Quiescence -After a local node has finalized an opinion into a decision, it enters a quiescent -state whereby it never solicits new votes on the proposal. The local -node MUST reply with the currently finalized decision. -Clock -The algorithm only requires that nodes have computed the drift of -observation of the passage of local time, not that that they have -coordinated an absolute time with their peers. For an implementation -of a phase locked-loop feedback to measure local clock drift see -NTP. -Further points -Node receives information during round -In the query step, the node is envisioned as packing information into -the query to cut down on the communication overhead a query to each of -this k nodes containing the node's own current opinion on the -proposal (YES, NO, or NONE). The algorithm does not currently -specify how a given node utilizes this incoming information. A -possible use may be to count unsolicited votes towards a currently -active round, and discard the information if the node is in a -quiescent state. -Problems with Weighting Node Value of Opinions -If the view of other nodes is incomplete, then the sum of the optional -weighting will not be a probability distribution normalized to 1. -The current algorithm doesn't describe how the initial opinions are formed. -Implementation status -The following implementations have been created for various testing and -simulation purposes: - -Rust -Python - FILL THIS IN WITH NEWLY CREATED REPO -Common Lisp - FILL THIS IN WITH NEWLY CREATED REPO - -Wire Protocol -For interoperability we present a wire protocol semantics by requiring -the validity of the following statements expressed in Notation3 (aka -n3) about any query performed by a query node: -@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . -@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . -@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . - -@prefix Claro <https://rdf.logos.co/protocol/Claro#> . - -Claro:query - :holds ( - :_0 [ rdfs:label "round"; - a xsd:postitiveInteger; ], - rdfs:comment """ -The current round of this query - -A value of zero corresponds to the initial round. -""" ; - - :_1 [ rdfs:label "uri"; - rdfs:comment """ -A unique URI for the proposal. - -It MAY be possible to examine the proposal by resolving this resource, -and its associated URIs. -""" ; - a xsd:anyURI ], - - :_2 [ rdfs:label "opinion"; - rdfs:comment """ -The opinion on the proposal - -One of the strings "YES" "NO" or "NONE". -""" ; - # TODO constrain as an enumeration on three values efficiently - a xsd:string ] - ) . - -Nodes are advised to use Waku messages to include their own -metadata in serializations as needed. -Syntax -The semantic description presented above can be reliably round-tripped -through a suitable serialization mechanism. JSON-LD provides a -canonical mapping to UTF-8 JSON. -At their core, the query messages are a simple enumeration of the -three possible values of the opinion: - -{ NO, NONE, YES } - -When represented via integers, such as choosing - -{ -1, 0, +1 } - -the parity summations across network invariants often become easier to -manipulate. -Security Considerations -Privacy -In practice, each honest node gossips its current opinion which -reduces the number of messages that need to be gossiped for a given -proposal. The resulting impact on the privacy of the node's opinion -is not currently analyzed. -Security with respect to various Adversarial Models -Adversarial models have been tested for which the values for current -parameters of Claro have been tuned. Exposition of the -justification of this tuning need to be completed. -Local Strategies -Random Adversaries -A random adversary optionally chooses to respond to all queries with a -random decision. Note that this adversary may be in some sense -Byzantine but not malicious. The random adversary also models some -software defects involved in not "understanding" how to derive a truth -value for a given proposition. -Infantile Adversary -Like a petulant child, an infantile adversary responds with the -opposite vote of the honest majority on an opinion. -Omniscient Adversaries -Omniscient adversaries have somehow gained an "unfair" participation in -consensus by being able to control f of N nodes with a out-of-band -"supra-liminal" coordination mechanism. Such adversaries use this -coordinated behavior to delay or sway honest majority consensus. -Passive Gossip Adversary -The passive network omniscient adversary is fully aware at all times -of the network state. Such an adversary can always chose to vote in -the most efficient way to block the distributed consensus from -finalizing. -Active Gossip Adversary -An omniscient gossip adversary somehow not only controls f of N -nodes, but has also has corrupted communications between nodes such -that she may inspect, delay, and drop arbitrary messages. Such an -adversary uses capability to corrupt consensus away from honest -decisions to ones favorable to itself. This adversary will, of -course, choose to participate in an honest manner until defecting is -most advantageous. -Future Directions -Although we have proposed a normative description of the -implementation of the underlying binary consensus algorithm (Claro), -we believe we have prepared for analysis its adversarial performance -in a manner that is amenable to replacement by another member of the -snow* family. -We have presumed the existence of a general family of algorithms that -can be counted on to vote on nodes in the DAG in a fair manner. -Avalanche provides an example of the construction of votes on UTXO -transactions. One can express all state machine, i.e. account-based -models as checkpoints anchored in UTXO trust, so we believe that this -presupposition has some justification. We can envision a need for -tooling abstraction that allow one to just program the DAG itself, as -they should be of stable interest no matter if Claro isn't. -Informative References - - -Logos - - -On BFT Consensus Evolution: From Monolithic to -DAG - - -snow-ipfs - - -snow* The Snow family of -algorithms - - -Move -Move: a Language for Writing DAG Abstractions - - -rdf - - -rdfs - - -xsd - - -n3-w3c-notes - - -ntp - - -Normative References - - -Claro - - -n3 - - -json-ld - - -Copyright +Copyright Copyright and related rights waived via CC0 Codex RFCs Specifications related the Codex decentralised data storage platform. Visit Codex specs to view the new Codex specifications currently under discussion. - -title: CODEX-BLOCK-EXCHANGE -name: Codex Block Exchange Protocol -status: raw -category: Standards Track -tags: codex, block-exchange, p2p, data-distribution -editor: Codex Team -contributors: +Codex Raw Specifications +Early-stage Codex specifications collected before reaching draft status. +CODEX-BLOCK-EXCHANGE + + +NameCodex Block Exchange Protocol +Statusraw +CategoryStandards Track +EditorCodex Team +ContributorsFilip Dimitrijevic <filip@status.im> + + + +Timeline -Filip Dimitrijevic filip@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-12-12 — b2f3564 — Improved codex/raw/codex-block-exchange.md file (#215) +2025-11-19 — 63107d3 — Created new codex/raw/codex-block-exchange.md file (#211) - + Specification Status This specification contains a mix of: @@ -22069,7 +20366,7 @@ contributors: Pending verification: Some technical details (e.g., multicodec 0xCD02) require further validation Sections marked with notes indicate areas where implementation details may differ from this specification. -Abstract +Abstract The Block Exchange (BE) is a core Codex component responsible for peer-to-peer content distribution across the network. It manages the sending and receiving of data blocks between nodes, @@ -22083,7 +20380,7 @@ fixed-length chunks of arbitrary data. "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119. -Definitions +Definitions TermDescription BlockFixed-length chunk of arbitrary data, uniquely identifiable Standalone BlockSelf-contained block addressed by SHA256 hash (CID) @@ -22101,7 +20398,7 @@ document are to be interpreted as described in MultihashSelf-describing hash format -Motivation +Motivation The Block Exchange module serves as the fundamental layer for content distribution in the Codex network. It provides primitives for requesting and delivering blocks of data @@ -23431,7 +21728,7 @@ to callers only after system-level retries are exhausted Network errors trigger automatic peer rotation before surfacing to caller Verification errors result in block rejection and peer reputation impact -Security Considerations +Security Considerations Block Verification All dataset blocks MUST include and verify Merkle proofs before acceptance @@ -23481,10 +21778,10 @@ verification. Protocol Buffers: Using Protocol Buffers provides efficient serialization, forward compatibility, and wide language support. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References Normative RFC 2119 - Key words for use @@ -23503,1484 +21800,31 @@ in RFCs to Indicate Requirement Levels Content Addressing: https://en.wikipedia.org/wiki/Content-addressable_storage - -title: CODEX-BLOCK-EXCHANGE -name: Codex Block Exchange Protocol -status: raw -category: Standards Track -tags: codex, block-exchange, p2p, data-distribution -editor: Codex Team -contributors: - -Filip Dimitrijevic filip@status.im - - -Specification Status -This specification contains a mix of: - -Verified protocol elements: Core message formats, protobuf structures, and addressing modes confirmed from implementation -Design specifications: Payment flows, state machines, and negotiation strategies representing intended behavior -Recommended values: Protocol limits and timeouts that serve as guidelines (actual implementations may vary) -Pending verification: Some technical details (e.g., multicodec 0xCD02) require further validation - -Sections marked with notes indicate areas where implementation details may differ from this specification. -Abstract -The Block Exchange (BE) is a core Codex component responsible for -peer-to-peer content distribution across the network. -It manages the sending and receiving of data blocks between nodes, -enabling efficient data sharing and retrieval. -This specification defines both an internal service interface and a -network protocol for referring to and providing data blocks. -Blocks are uniquely identifiable by means of an address and represent -fixed-length chunks of arbitrary data. -Semantics -The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", -"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this -document are to be interpreted as described in -RFC 2119. -Definitions -TermDescription -BlockFixed-length chunk of arbitrary data, uniquely identifiable -Standalone BlockSelf-contained block addressed by SHA256 hash (CID) -Dataset BlockBlock in ordered set, addressed by dataset CID + index -Block AddressUnique identifier for standalone/dataset addressing -WantListList of block requests sent by a peer -Block DeliveryTransmission of block data from one peer to another -Block PresenceIndicator of whether peer has requested block -Merkle ProofProof verifying dataset block position correctness -CodexProofCodex-specific Merkle proof format verifying a block's position within a dataset tree -StreamBidirectional libp2p communication channel between two peers for exchanging messages -Peer Context StoreInternal data structure tracking active peer connections, their WantLists, and exchange state -CIDContent Identifier - hash-based identifier for content -MulticodecSelf-describing format identifier for data encoding -MultihashSelf-describing hash format - +CODEX-MARKETPLACE + + +NameCodex Storage Marketplace +Slugcodex-marketplace +Statusraw +CategoryStandards Track +EditorCodex Team and Dmitriy Ryajov <dryajov@status.im> +ContributorsMark Spanbroek <mark@codex.storage>Adam Uhlíř <adam@codex.storage>Eric Mastro <eric@codex.storage>Jimmy Debe <jimmy@status.im>Filip Dimitrijevic <filip@status.im> + -Motivation -The Block Exchange module serves as the fundamental layer for content -distribution in the Codex network. -It provides primitives for requesting and delivering blocks of data -between peers, supporting both standalone blocks and blocks that are -part of larger datasets. -The protocol is designed to work over libp2p streams and integrates -with Codex's discovery, storage, and payment systems. -When a peer wishes to obtain a block, it registers its unique address -with the Block Exchange, and the Block Exchange will then be in charge -of procuring it by finding a peer that has the block, if any, and then -downloading it. -The Block Exchange will also accept requests from peers which might -want blocks that the node has, and provide them. -Discovery Separation: Throughout this specification we assume that -if a peer wants a block, then the peer has the means to locate and -connect to peers which either: (1) have the block; or (2) are -reasonably expected to obtain the block in the future. -In practical implementations, the Block Exchange will typically require -the support of an underlying discovery service, e.g., the Codex DHT, -to look up such peers, but this is beyond the scope of this document. -The protocol supports two distinct block types to accommodate different -use cases: standalone blocks for independent data chunks and dataset -blocks for ordered collections of data that form larger structures. -Block Format -The Block Exchange protocol supports two types of blocks: -Standalone Blocks -Standalone blocks are self-contained pieces of data addressed by their -SHA256 content identifier (CID). -These blocks are independent and do not reference any larger structure. -Properties: + +Timeline -Addressed by content hash (SHA256) -Default size: 64 KiB -Self-contained and independently verifiable +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-11-19 — d2df7e0 — Created codex/raw/codex-marketplace.md file, without integration of Sales a… (#208) -Dataset Blocks -Dataset blocks are part of ordered sets and are addressed by a -(datasetCID, index) tuple. -The datasetCID refers to the Merkle tree root of the entire dataset, -and the index indicates the block's position within that dataset. -Formally, we can define a block as a tuple consisting of raw data and -its content identifier: (data: seq[byte], cid: Cid), where standalone -blocks are addressed by cid, and dataset blocks can be addressed -either by cid or a (datasetCID, index) tuple. -Properties: - -Addressed by (treeCID, index) tuple -Part of a Merkle tree structure -Require Merkle proof for verification -Must be uniformly sized within a dataset -Final blocks MUST be zero-padded if incomplete - -Block Specifications -All blocks in the Codex Block Exchange protocol adhere to the -following specifications: -PropertyValueDescription -Default Block Size64 KiBStandard size for data blocks -Maximum Block Size100 MiBUpper limit for block data field -Multicodeccodex-block (0xCD02)*Format identifier -Multihashsha2-256 (0x12)Hash algorithm for addressing -Padding RequirementZero-paddingIncomplete final blocks padded - - -Note: *The multicodec value 0xCD02 is not currently registered in the official multiformats multicodec table. This may be a reserved/private code pending official registration. -Protocol Limits -To ensure network stability and prevent resource exhaustion, implementations -SHOULD enforce reasonable limits. The following are recommended values -(actual implementation limits may vary): -LimitRecommended ValueDescription -Maximum Block Size100 MiBMaximum size of block data in BlockDelivery -Maximum WantList Size1000 entriesMaximum entries per WantList message -Maximum Concurrent Requests256 per peerMaximum simultaneous block requests per peer -Stream Timeout60 secondsIdle stream closure timeout -Request Timeout300 secondsMaximum time to fulfill a block request -Maximum Message Size105 MiBMaximum total message size (protobuf) -Maximum Pending Bytes10 GiBMaximum pending data per peer connection - - -Note: These values are not verified from implementation and serve as -reasonable guidelines. Actual implementations MAY use different limits based -on their resource constraints and deployment requirements. -Enforcement: - -Implementations MUST reject messages exceeding their configured size limits -Implementations SHOULD track per-peer request counts -Implementations SHOULD close streams exceeding configured timeout limits -Implementations MAY implement stricter or more lenient limits based on local resources - -Service Interface -The Block Exchange module exposes two core primitives for -block management: -requestBlock -async def requestBlock(address: BlockAddress) -> Block - -Registers a block address for retrieval and returns the block data -when available. -This function can be awaited by the caller until the block is retrieved -from the network or local storage. -Parameters: - -address: BlockAddress - The unique address identifying the block -to retrieve - -Returns: - -Block - The retrieved block data - -cancelRequest -async def cancelRequest(address: BlockAddress) -> bool - -Cancels a previously registered block request. -Parameters: - -address: BlockAddress - The address of the block request to cancel - -Returns: - -bool - True if the cancellation was successful, False otherwise - -Dependencies -The Block Exchange module depends on and interacts with several other -Codex components: -ComponentPurpose -Discovery ModuleDHT-based peer discovery for locating nodes -Local Store (Repo)Persistent block storage for local blocks -AdvertiserAnnounces block availability to the network -Network Layerlibp2p connections and stream management - - -Protocol Specification -Protocol Identifier -The Block Exchange protocol uses the following libp2p protocol -identifier: -/codex/blockexc/1.0.0 - -Version Negotiation -The protocol version is negotiated through libp2p's multistream-select -protocol during connection establishment. The following describes standard -libp2p version negotiation behavior; actual Codex implementation details -may vary. -Protocol Versioning -Version Format: /codex/blockexc/<major>.<minor>.<patch> - -Major version: Incompatible protocol changes -Minor version: Backward-compatible feature additions -Patch version: Backward-compatible bug fixes - -Current Version: 1.0.0 -Version Negotiation Process -1. Initiator opens stream -2. Initiator proposes: "/codex/blockexc/1.0.0" -3. Responder checks supported versions -4. If supported: - Responder accepts: "/codex/blockexc/1.0.0" - → Connection established -5. If not supported: - Responder rejects with: "na" (not available) - → Try fallback version or close connection - -Compatibility Rules -Major Version Compatibility: - -Major version 1.x.x is incompatible with 2.x.x -Nodes MUST support only their major version -Cross-major-version communication requires protocol upgrade - -Minor Version Compatibility: - -Version 1.1.0 MUST be backward compatible with 1.0.0 -Newer minors MAY include optional features -Older nodes ignore unknown message fields (protobuf semantics) - -Patch Version Compatibility: - -All patches within same minor version are fully compatible -Patches fix bugs without changing protocol behavior - -Multi-Version Support -Implementations MAY support multiple protocol versions simultaneously: -Supported protocols (in preference order): - 1. /codex/blockexc/1.2.0 (preferred, latest features) - 2. /codex/blockexc/1.1.0 (fallback, stable) - 3. /codex/blockexc/1.0.0 (legacy support) - -Negotiation Strategy: - -Propose highest supported version first -If rejected, try next lower version -If all rejected, connection fails -Track peer's supported version for future connections - -Feature Detection -For optional features within same major.minor version: -Method 1: Message field presence - - Send message with optional field - - Peer ignores if not supported (protobuf default) - -Method 2: Capability exchange (future extension) - - Exchange capability bitmask in initial message - - Enable features only if both peers support - -Version Upgrade Path -Backward Compatibility: - -New versions MUST handle messages from older versions -Unknown message fields silently ignored -Unknown WantList flags ignored -Unknown BlockPresence types treated as DontHave - -Forward Compatibility: - -Older versions MAY ignore new message types -Critical features require major version bump -Optional features use minor version bump - -Connection Model -The protocol operates over libp2p streams. -When a node wants to communicate with a peer: - -The initiating node dials the peer using the protocol identifier -A bidirectional stream is established -Both sides can send and receive messages on this stream -Messages are encoded using Protocol Buffers -The stream remains open for the duration of the exchange session -Peers track active connections in a peer context store - -The protocol handles peer lifecycle events: - -Peer Joined: When a peer connects, it is added to the active -peer set -Peer Departed: When a peer disconnects gracefully, its context -is cleaned up -Peer Dropped: When a peer connection fails, it is removed from -the active set - -Message Flow Examples -This section illustrates typical message exchange sequences for common -block exchange scenarios. -Example 1: Standalone Block Request -Scenario: Node A requests a standalone block from Node B -Node A Node B - | | - |--- Message(wantlist) ------------------>| - | wantlist.entries[0]: | - | address.cid = QmABC123 | - | wantType = wantBlock | - | priority = 0 | - | | - |<-- Message(blockPresences, payload) ----| - | blockPresences[0]: | - | address.cid = QmABC123 | - | type = presenceHave | - | payload[0]: | - | cid = QmABC123 | - | data = <64 KiB block data> | - | address.cid = QmABC123 | - | | - -Steps: - -Node A sends WantList requesting block with wantType = wantBlock -Node B checks local storage, finds block -Node B responds with BlockPresence confirming availability -Node B includes BlockDelivery with actual block data -Node A verifies CID matches SHA256(data) -Node A stores block locally - -Example 2: Dataset Block Request with Merkle Proof -Scenario: Node A requests a dataset block from Node B -Node A Node B - | | - |--- Message(wantlist) ------------------>| - | wantlist.entries[0]: | - | address.leaf = true | - | address.treeCid = QmTree456 | - | address.index = 42 | - | wantType = wantBlock | - | | - |<-- Message(payload) ---------------------| - | payload[0]: | - | cid = QmBlock789 | - | data = <64 KiB zero-padded data> | - | address.leaf = true | - | address.treeCid = QmTree456 | - | address.index = 42 | - | proof = <CodexProof bytes> | - | | - -Steps: - -Node A sends WantList for dataset block at specific index -Node B locates block in dataset -Node B generates CodexProof for block position in Merkle tree -Node B delivers block with proof -Node A verifies proof against treeCid -Node A verifies block data integrity -Node A stores block with dataset association - -Example 3: Block Presence Check (wantHave) -Scenario: Node A checks if Node B has a block without requesting full data -Node A Node B - | | - |--- Message(wantlist) ------------------>| - | wantlist.entries[0]: | - | address.cid = QmCheck999 | - | wantType = wantHave | - | sendDontHave = true | - | | - |<-- Message(blockPresences) -------------| - | blockPresences[0]: | - | address.cid = QmCheck999 | - | type = presenceHave | - | price = 0x00 (free) | - | | - -Steps: - -Node A sends WantList with wantType = wantHave -Node B checks local storage without loading block data -Node B responds with BlockPresence only (no payload) -Node A updates peer availability map -If Node A decides to request, sends new WantList with wantType = wantBlock - -Example 4: Block Not Available -Scenario: Node A requests block Node B doesn't have -Node A Node B - | | - |--- Message(wantlist) ------------------>| - | wantlist.entries[0]: | - | address.cid = QmMissing111 | - | wantType = wantBlock | - | sendDontHave = true | - | | - |<-- Message(blockPresences) -------------| - | blockPresences[0]: | - | address.cid = QmMissing111 | - | type = presenceDontHave | - | | - -Steps: - -Node A requests block with sendDontHave = true -Node B checks storage, block not found -Node B sends BlockPresence with presenceDontHave -Node A removes Node B from candidates for this block -Node A queries discovery service for alternative peers - -Example 5: WantList Cancellation -Scenario: Node A cancels a previous block request -Node A Node B - | | - |--- Message(wantlist) ------------------>| - | wantlist.entries[0]: | - | address.cid = QmCancel222 | - | cancel = true | - | | - -Steps: - -Node A sends WantList entry with cancel = true -Node B removes block request from peer's want queue -Node B stops any pending block transfer for this address -No response message required for cancellation - -Example 6: Delta WantList Update -Scenario: Node A adds requests to existing WantList -Node A Node B - | | - |--- Message(wantlist) ------------------>| - | wantlist.full = false | - | wantlist.entries[0]: | - | address.cid = QmNew1 | - | wantType = wantBlock | - | wantlist.entries[1]: | - | address.cid = QmNew2 | - | wantType = wantBlock | - | | - -Steps: - -Node A sends WantList with full = false (delta update) -Node B merges entries with existing WantList for Node A -Node B begins processing new requests -Previous WantList entries remain active - -Sequence Diagrams -These diagrams illustrate the complete flow of block exchange operations -including service interface, peer discovery, and network protocol interactions. -Complete Block Request Flow -The protocol supports two strategies for WantBlock requests, -each with different trade-offs. -Implementations may choose the strategy based on network conditions, -peer availability, and resource constraints. -Strategy 1: Parallel Request (Low Latency) -In this strategy, the requester sends wantType = wantBlock to all -discovered peers simultaneously. -This minimizes latency as the first peer to respond with the block -data wins, but it wastes bandwidth since multiple peers may send -the same block data. -Trade-offs: - -Pro: Lowest latency - block arrives as soon as any peer can deliver it -Pro: More resilient to slow or unresponsive peers -Con: Bandwidth-wasteful - multiple peers may send duplicate data -Con: Higher network overhead for the requester -Best for: Time-critical data retrieval, unreliable networks - -sequenceDiagram - participant Client - participant BlockExchange - participant LocalStore - participant Discovery - participant PeerA - participant PeerB - participant PeerC - - Client->>BlockExchange: requestBlock(address) - BlockExchange->>LocalStore: checkBlock(address) - LocalStore-->>BlockExchange: Not found - - BlockExchange->>Discovery: findPeers(address) - Discovery-->>BlockExchange: [PeerA, PeerB, PeerC] - - par Send wantBlock to all peers - BlockExchange->>PeerA: Message(wantlist: wantBlock) - BlockExchange->>PeerB: Message(wantlist: wantBlock) - BlockExchange->>PeerC: Message(wantlist: wantBlock) - end - - Note over PeerA,PeerC: All peers start preparing block data - - PeerB-->>BlockExchange: Message(payload: BlockDelivery) - Note over BlockExchange: First response wins - - BlockExchange->>BlockExchange: Verify block - BlockExchange->>LocalStore: Store block - - par Cancel requests to other peers - BlockExchange->>PeerA: Message(wantlist: cancel) - BlockExchange->>PeerC: Message(wantlist: cancel) - end - - Note over PeerA,PeerC: May have already sent data (wasted bandwidth) - - BlockExchange-->>Client: Return block - -Strategy 2: Two-Phase Discovery (Bandwidth Efficient) -In this strategy, the requester first sends wantType = wantHave to -discover which peers have the block, then sends wantType = wantBlock -only to a single selected peer. -This conserves bandwidth but adds an extra round-trip of latency. -Trade-offs: - -Pro: Bandwidth-efficient - only one peer sends block data -Pro: Enables price comparison before committing to a peer -Pro: Allows selection based on peer reputation or proximity -Con: Higher latency due to extra round-trip for presence check -Con: Selected peer may become unavailable between phases -Best for: Large blocks, paid content, bandwidth-constrained networks - -sequenceDiagram - participant Client - participant BlockExchange - participant LocalStore - participant Discovery - participant PeerA - participant PeerB - participant PeerC - - Client->>BlockExchange: requestBlock(address) - BlockExchange->>LocalStore: checkBlock(address) - LocalStore-->>BlockExchange: Not found - - BlockExchange->>Discovery: findPeers(address) - Discovery-->>BlockExchange: [PeerA, PeerB, PeerC] - - Note over BlockExchange: Phase 1: Discovery - - par Send wantHave to all peers - BlockExchange->>PeerA: Message(wantlist: wantHave) - BlockExchange->>PeerB: Message(wantlist: wantHave) - BlockExchange->>PeerC: Message(wantlist: wantHave) - end - - PeerA-->>BlockExchange: BlockPresence(presenceDontHave) - PeerB-->>BlockExchange: BlockPresence(presenceHave, price=X) - PeerC-->>BlockExchange: BlockPresence(presenceHave, price=Y) - - BlockExchange->>BlockExchange: Select best peer (PeerB: lower price) - - Note over BlockExchange: Phase 2: Retrieval - - BlockExchange->>PeerB: Message(wantlist: wantBlock) - PeerB-->>BlockExchange: Message(payload: BlockDelivery) - - BlockExchange->>BlockExchange: Verify block - BlockExchange->>LocalStore: Store block - BlockExchange-->>Client: Return block - -Hybrid Approach -Implementations MAY combine both strategies: - -Use two-phase discovery for large blocks or paid content -Use parallel requests for small blocks or time-critical data -Adaptively switch strategies based on network conditions - -flowchart TD - A[Block Request] --> B{Block Size?} - B -->|Small < 64 KiB| C[Parallel Strategy] - B -->|Large >= 64 KiB| D{Paid Content?} - D -->|Yes| E[Two-Phase Discovery] - D -->|No| F{Network Condition?} - F -->|Reliable| E - F -->|Unreliable| C - C --> G[Return Block] - E --> G - -Dataset Block Verification Flow -sequenceDiagram - participant Requester - participant Provider - participant Verifier - - Requester->>Provider: WantList(leaf=true, treeCid, index) - Provider->>Provider: Load block at index - Provider->>Provider: Generate CodexProof - Provider->>Requester: BlockDelivery(data, proof) - - Requester->>Verifier: Verify proof - - alt Proof valid - Verifier-->>Requester: Valid - Requester->>Requester: Verify CID - alt CID matches - Requester->>Requester: Store block - Requester-->>Requester: Success - else CID mismatch - Requester->>Requester: Reject block - Requester->>Provider: Disconnect - end - else Proof invalid - Verifier-->>Requester: Invalid - Requester->>Requester: Reject block - Requester->>Provider: Disconnect - end - -Payment Flow with State Channels -sequenceDiagram - participant Buyer - participant Seller - participant StateChannel - - Buyer->>Seller: Message(wantlist) - Seller->>Seller: Check block availability - Seller->>Buyer: BlockPresence(price) - - alt Buyer accepts price - Buyer->>StateChannel: Create update - StateChannel-->>Buyer: Signed state - Buyer->>Seller: Message(payment: StateChannelUpdate) - Seller->>StateChannel: Verify update - - alt Payment valid - StateChannel-->>Seller: Valid - Seller->>Buyer: BlockDelivery(data) - Buyer->>Buyer: Verify block - Buyer->>StateChannel: Finalize - else Payment invalid - StateChannel-->>Seller: Invalid - Seller->>Buyer: BlockPresence(price) - end - else Buyer rejects price - Buyer->>Seller: Message(wantlist.cancel) - end - -Peer Lifecycle Management -sequenceDiagram - participant Network - participant BlockExchange - participant PeerStore - participant Peer - - Network->>BlockExchange: PeerJoined(Peer) - BlockExchange->>PeerStore: AddPeer(Peer) - BlockExchange->>Peer: Open stream - - loop Active exchange - BlockExchange->>Peer: Message(wantlist/payload) - Peer->>BlockExchange: Message(payload/presence) - end - - alt Graceful disconnect - Peer->>BlockExchange: Close stream - BlockExchange->>PeerStore: RemovePeer(Peer) - else Connection failure - Network->>BlockExchange: PeerDropped(Peer) - BlockExchange->>PeerStore: RemovePeer(Peer) - BlockExchange->>BlockExchange: Requeue pending requests - end - -Message Format -All messages use Protocol Buffers encoding for serialization. -The main message structure supports multiple operation types in a -single message. -Main Message Structure -message Message { - Wantlist wantlist = 1; - // Field 2 reserved for future use - repeated BlockDelivery payload = 3; - repeated BlockPresence blockPresences = 4; - int32 pendingBytes = 5; - AccountMessage account = 6; - StateChannelUpdate payment = 7; -} - -Fields: - -wantlist: Block requests from the sender -Field 2: Reserved (unused, see note below) -payload: Block deliveries (actual block data) -blockPresences: Availability indicators for requested blocks -pendingBytes: Number of bytes pending delivery -account: Account information for micropayments -payment: State channel update for payment processing - -Note on Missing Field 2: -Field number 2 is intentionally skipped in the Message protobuf definition. -This is a common protobuf practice for several reasons: - -Protocol Evolution: Field 2 may have been used in earlier versions and -removed, with the field number reserved to prevent reuse -Forward Compatibility: Reserving field numbers ensures old clients can -safely ignore new fields -Implementation History: May have been used during development and removed -before final release - -The gap does not affect protocol operation. Protobuf field numbers need not be -sequential, and skipping numbers is standard practice for protocol evolution. -Block Address -The BlockAddress structure supports both standalone and dataset -block addressing: -message BlockAddress { - bool leaf = 1; - bytes treeCid = 2; // Present when leaf = true - uint64 index = 3; // Present when leaf = true - bytes cid = 4; // Present when leaf = false -} - -Fields: - -leaf: Indicates if this is dataset block (true) or standalone -(false) -treeCid: Merkle tree root CID (present when leaf = true) -index: Position of block within dataset (present when leaf = true) -cid: Content identifier of the block (present when leaf = false) - -Addressing Modes: - -Standalone Block (leaf = false): Direct CID reference to a -standalone content block -Dataset Block (leaf = true): Reference to a block within an -ordered set, identified by a Merkle tree root and an index. -The Merkle root may refer to either a regular dataset, or a dataset -that has undergone erasure-coding - -WantList -The WantList communicates which blocks a peer desires to receive: -message Wantlist { - enum WantType { - wantBlock = 0; - wantHave = 1; - } - - message Entry { - BlockAddress address = 1; - int32 priority = 2; - bool cancel = 3; - WantType wantType = 4; - bool sendDontHave = 5; - } - - repeated Entry entries = 1; - bool full = 2; -} - -WantType Values: - -wantBlock (0): Request full block delivery -wantHave (1): Request availability information only (presence check) - -Entry Fields: - -address: The block being requested -priority: Request priority (currently always 0, reserved for future use) -cancel: If true, cancels a previous want for this block -wantType: Specifies whether full block or presence is desired - -wantHave (1): Only check if peer has the block -wantBlock (0): Request full block data - - -sendDontHave: If true, peer should respond even if it doesn't have -the block - -Priority Field Clarification: -The priority field is currently fixed at 0 in all implementations and is -reserved for future protocol extensions. Originally intended for request -prioritization, this feature is not yet implemented. -Current Behavior: - -All WantList entries use priority = 0 -Implementations MUST accept priority values but MAY ignore them -Blocks are processed in order received, not by priority - -Future Extensions: -The priority field is reserved for: - -Bandwidth Management: Higher priority blocks served first during congestion -Time-Critical Data: Urgent blocks (e.g., recent dataset indices) prioritized -Fair Queueing: Priority-based scheduling across multiple peers -QoS Tiers: Different service levels based on payment/reputation - -Implementation Notes: - -Senders SHOULD set priority = 0 for compatibility -Receivers MUST NOT reject messages with non-zero priority -Future protocol versions may activate priority-based scheduling -When activated, higher priority values = higher priority (0 = lowest) - -WantList Fields: - -entries: List of block requests -full: If true, replaces all previous entries; if false, delta update - -Delta Updates: -WantLists support delta updates for efficiency. -When full = false, entries represent additions or modifications to -the existing WantList rather than a complete replacement. -Block Delivery -Block deliveries contain the actual block data along with verification -information: -message BlockDelivery { - bytes cid = 1; - bytes data = 2; - BlockAddress address = 3; - bytes proof = 4; -} - -Fields: - -cid: Content identifier of the block -data: Raw block data (up to 100 MiB) -address: The BlockAddress identifying this block -proof: Merkle proof (CodexProof) verifying block correctness -(required for dataset blocks) - -Merkle Proof Verification: -When delivering dataset blocks (address.leaf = true): - -The delivery MUST include a Merkle proof (CodexProof) -The proof verifies that the block at the given index is correctly -part of the Merkle tree identified by the tree CID -This applies to all datasets, irrespective of whether they have been -erasure-coded or not -Recipients MUST verify the proof before accepting the block -Invalid proofs result in block rejection - -Block Presence -Block presence messages indicate whether a peer has or does not have a -requested block: -enum BlockPresenceType { - presenceHave = 0; - presenceDontHave = 1; -} - -message BlockPresence { - BlockAddress address = 1; - BlockPresenceType type = 2; - bytes price = 3; -} - -Fields: - -address: The block address being referenced -type: Whether the peer has the block or not -price: Price in wei (UInt256 format, see below) - -UInt256 Price Format: -The price field encodes a 256-bit unsigned integer representing the cost in -wei (the smallest Ethereum denomination, where 1 ETH = 10^18 wei). -Encoding Specification: - -Format: 32 bytes, big-endian byte order -Type: Unsigned 256-bit integer -Range: 0 to 2^256 - 1 -Zero Price: 0x0000000000000000000000000000000000000000000000000000000000000000 -(block is free) - -Examples: -Free (0 wei): - 0x0000000000000000000000000000000000000000000000000000000000000000 - -1 wei: - 0x0000000000000000000000000000000000000000000000000000000000000001 - -1 gwei (10^9 wei): - 0x000000000000000000000000000000000000000000000000000000003b9aca00 - -0.001 ETH (10^15 wei): - 0x00000000000000000000000000000000000000000000000000038d7ea4c68000 - -1 ETH (10^18 wei): - 0x0000000000000000000000000000000000000000000000000de0b6b3a7640000 - -Maximum (2^256 - 1): - 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - -Conversion Logic: -# Wei to bytes (big-endian) -def wei_to_bytes(amount_wei: int) -> bytes: - return amount_wei.to_bytes(32, byteorder='big') - -# Bytes to wei -def bytes_to_wei(price_bytes: bytes) -> int: - return int.from_bytes(price_bytes, byteorder='big') - -# ETH to wei to bytes -def eth_to_price_bytes(amount_eth: float) -> bytes: - amount_wei = int(amount_eth * 10**18) - return wei_to_bytes(amount_wei) - -Payment Messages -Payment-related messages for micropayments using Nitro state channels. -Account Message: -message AccountMessage { - bytes address = 1; // Ethereum address to which payments should be made -} - -Fields: - -address: Ethereum address for receiving payments - -Concrete Message Examples -This section provides real-world examples of protobuf messages for different -block exchange scenarios. -Example 1: Simple Standalone Block Request -Scenario: Request a single standalone block -Protobuf (wire format representation): -Message { - wantlist: Wantlist { - entries: [ - Entry { - address: BlockAddress { - leaf: false - cid: 0x0155a0e40220b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 // CID bytes - } - priority: 0 - cancel: false - wantType: wantBlock // 0 - sendDontHave: true - } - ] - full: true - } -} - -Hex representation (sample): -0a2e 0a2c 0a24 0001 5512 2012 20b9 4d27 -b993 4d3e 08a5 2e52 d7da 7dab fac4 84ef -e37a 5380 ee90 88f7 ace2 efcd e910 0018 -0020 0028 011201 01 - -Example 2: Dataset Block Request -Scenario: Request block at index 100 from dataset -Protobuf: -Message { - wantlist: Wantlist { - entries: [ - Entry { - address: BlockAddress { - leaf: true - treeCid: 0x0155a0e40220c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 // Tree CID - index: 100 - } - priority: 0 - cancel: false - wantType: wantBlock - sendDontHave: true - } - ] - full: false // Delta update - } -} - -Example 3: Block Delivery with Proof -Scenario: Provider sends dataset block with Merkle proof -Protobuf: -Message { - payload: [ - BlockDelivery { - cid: 0x0155a0e40220a1b2c3d4e5f6071829... // Block CID - data: <65536 bytes of block data> // 64 KiB - address: BlockAddress { - leaf: true - treeCid: 0x0155a0e40220c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 - index: 100 - } - proof: <CodexProof bytes> // Merkle proof data - // Contains: path indices, sibling hashes, tree height - // Format: Implementation-specific (e.g., [height][index][hash1][hash2]...[hashN]) - // Size varies by tree depth (illustrative: ~1KB for depth-10 tree) - } - ] -} - -Example 4: Block Presence Response -Scenario: Provider indicates block availability with price -Protobuf: -Message { - blockPresences: [ - BlockPresence { - address: BlockAddress { - leaf: false - cid: 0x0155a0e40220b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 - } - type: presenceHave // 0 - price: 0x00000000000000000000000000000000000000000000000000038d7ea4c68000 // 0.001 ETH in wei - } - ] -} - -Example 5: Payment Message -Scenario: Send payment via state channel update -Protobuf: -Message { - account: AccountMessage { - address: 0x742d35Cc6634C0532925a3b844200a717C48D6d9 // 20 bytes Ethereum address - } - payment: StateChannelUpdate { - update: <JSON bytes> - // Contains signed Nitro state as UTF-8 JSON string - // Example: {"channelId":"0x1234...","nonce":42,...} - } -} - -Example 6: Multiple Operations in One Message -Scenario: Combined WantList, BlockPresence, and Delivery -Protobuf: -Message { - wantlist: Wantlist { - entries: [ - Entry { - address: BlockAddress { - leaf: false - cid: 0x0155a0e40220... // Requesting new block - } - wantType: wantBlock - priority: 0 - cancel: false - sendDontHave: true - } - ] - full: false - } - blockPresences: [ - BlockPresence { - address: BlockAddress { - leaf: false - cid: 0x0155a0e40220... // Response to previous request - } - type: presenceHave - price: 0x00 // Free - } - ] - payload: [ - BlockDelivery { - cid: 0x0155a0e40220... // Delivering another block - data: <65536 bytes> - address: BlockAddress { - leaf: false - cid: 0x0155a0e40220... - } - } - ] - pendingBytes: 131072 // 128 KiB more data pending -} - -Example 7: WantList Cancellation -Scenario: Cancel multiple pending requests -Protobuf: -Message { - wantlist: Wantlist { - entries: [ - Entry { - address: BlockAddress { - leaf: false - cid: 0x0155a0e40220abc123... - } - cancel: true // Cancellation flag - }, - Entry { - address: BlockAddress { - leaf: true - treeCid: 0x0155a0e40220def456... - index: 50 - } - cancel: true - } - ] - full: false - } -} - -CID Format Details -CID Structure: -CID v1 format (multibase + multicodec + multihash): -[0x01] [0x55] [0xa0] [0xe4] [0x02] [0x20] [<32 bytes SHA256 hash>] - │ │ │ │ │ │ │ - │ │ │ │ │ │ └─ Hash digest - │ │ │ │ │ └───────── Hash length (32) - │ │ │ │ └──────────────── Hash algorithm (SHA2-256) - │ │ │ └─────────────────────── Codec size - │ │ └────────────────────────────── Codec (raw = 0x55) - │ └───────────────────────────────────── Multicodec prefix - └──────────────────────────────────────────── CID version (1) - -Actual: 0x01 55 a0 e4 02 20 <hash bytes> - -Example Block CID Breakdown: -Full CID: 0x0155a0e40220b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 - -Parts: - Version: 0x01 (CID v1) - Multicodec: 0x55 (raw) - Codec Size: 0xa0e402 (codex-block = 0xCD02, varint encoded)* - Hash Type: 0x20 (SHA2-256) - Hash Len: 0x12 (20) (32 bytes) - Hash: b94d27b993... (32 bytes SHA256) - -State Channel Update: -message StateChannelUpdate { - bytes update = 1; // Signed Nitro state, serialized as JSON -} - -Fields: - -update: Nitro state channel update containing payment information - -Payment Flow and Price Negotiation -The Block Exchange protocol integrates with Nitro state channels to enable -micropayments for block delivery. -Payment Requirements -When Payment is Required: - -Blocks marked as paid content by the provider -Provider's local policy requires payment for specific blocks -Block size exceeds free tier threshold (implementation-defined) -Requester has insufficient credit with provider - -Free Blocks: - -Blocks explicitly marked as free (price = 0x00) -Blocks exchanged between trusted peers -Small metadata blocks (implementation-defined) - -Price Discovery -Initial Price Advertisement: - -Requester sends WantList with wantType = wantHave -Provider responds with BlockPresence including price field -Price encoded as UInt256 in wei (smallest Ethereum unit) -Requester evaluates price against local policy - -Price Format: -price: bytes (32 bytes, big-endian UInt256) -Example: 0x0000000000000000000000000000000000000000000000000de0b6b3a7640000 - represents 1 ETH = 10^18 wei - -Payment Negotiation Process -Step 1: Price Quote -Requester → Provider: Message(wantlist: wantHave) -Provider → Requester: BlockPresence(type=presenceHave, price=<amount>) - -Step 2: Payment Decision -Requester evaluates price: - -Accept: Proceed to payment -Reject: Send cancellation -Counter: Not supported in current protocol (future extension) - -Step 3: State Channel Update -If accepted: -Requester: - 1. Load existing state channel with Provider - 2. Create new state with updated balance - 3. Sign state update - 4. Encode as JSON - -Requester → Provider: Message(payment: StateChannelUpdate(update=<signed JSON>)) - -Step 4: Payment Verification -Provider: - 1. Decode state channel update - 2. Verify signatures - 3. Check balance increase matches price - 4. Verify state channel validity - 5. Check nonce/sequence number - -If valid: - Provider → Requester: BlockDelivery(data, proof) -Else: - Provider → Requester: BlockPresence(price) // Retry with correct payment - -Step 5: Delivery and Finalization -Requester: - 1. Receive and verify block - 2. Store block locally - 3. Finalize state channel update - 4. Update peer credit balance - -Payment State Machine -Note: The following state machine represents a design specification for -payment flow logic. Actual implementation may differ. -State: INIT - → Send wantHave - → Transition to PRICE_DISCOVERY - -State: PRICE_DISCOVERY - ← Receive BlockPresence(price) - → If price acceptable: Transition to PAYMENT_CREATION - → If price rejected: Transition to CANCELLED - -State: PAYMENT_CREATION - → Create state channel update - → Send payment message - → Transition to PAYMENT_PENDING - -State: PAYMENT_PENDING - ← Receive BlockDelivery: Transition to DELIVERY_VERIFICATION - ← Receive BlockPresence(price): Transition to PAYMENT_FAILED - -State: PAYMENT_FAILED - → Retry with corrected payment: Transition to PAYMENT_CREATION - → Abort: Transition to CANCELLED - -State: DELIVERY_VERIFICATION - → Verify block - → If valid: Transition to COMPLETED - → If invalid: Transition to DISPUTE - -State: COMPLETED - → Finalize state channel - → End - -State: CANCELLED - → Send cancellation - → End - -State: DISPUTE - → Reject block - → Dispute state channel update - → End - -State Channel Integration -Account Message Usage: -Sent early in connection to establish payment address: -Message { - account: AccountMessage { - address: 0x742d35Cc6634C0532925a3b8... // Ethereum address - } -} - -State Channel Update Format: -{ - "channelId": "0x1234...", - "nonce": 42, - "balances": { - "0x742d35Cc...": "1000000000000000000", // Seller balance - "0x8ab5d2F3...": "500000000000000000" // Buyer balance - }, - "signatures": [ - "0x789abc...", // Buyer signature - "0x456def..." // Seller signature - ] -} - -Error Scenarios -Insufficient Funds: - -State channel balance < block price -Response: BlockPresence with price (retry after funding) - -Invalid Signature: - -State update signature verification fails -Response: Reject payment, close stream if repeated - -Nonce Mismatch: - -State update nonce doesn't match expected sequence -Response: Request state sync, retry with correct nonce - -Channel Expired: - -State channel past expiration time -Response: Refuse payment, request new channel creation - -Error Handling -The Block Exchange protocol defines error handling for common failure scenarios: -Verification Failures -Merkle Proof Verification Failure: - -Condition: CodexProof validation fails for dataset block -Action: Reject block delivery, do NOT store block -Response: Send BlockPresence with presenceDontHave for the address -Logging: Log verification failure with peer ID and block address -Peer Management: Track repeated failures; disconnect after threshold - -CID Mismatch: - -Condition: SHA256 hash of block data doesn't match provided CID -Action: Reject block delivery immediately -Response: Close stream and mark peer as potentially malicious -Logging: Log CID mismatch with peer ID and expected/actual CIDs - -Network Failures -Stream Disconnection: - -Condition: libp2p stream closes unexpectedly during transfer -Action: Cancel pending block requests for that peer -Recovery: Attempt to request blocks from alternative peers -Timeout: Wait for stream timeout (60s) before peer cleanup - -Missing Blocks: - -Condition: Peer responds with presenceDontHave for requested block -Action: Remove peer from candidates for this block -Recovery: Query discovery service for alternative peers -Fallback: If no peers have block, return error to requestBlock caller - -Request Timeout: - -Condition: Block not received within request timeout (300s) -Action: Cancel request with that peer -Recovery: Retry with different peer if available -User Notification: If all retry attempts exhausted, requestBlock returns timeout error - -Protocol Violations -Oversized Messages: - -Condition: Message exceeds maximum size limits -Action: Close stream immediately -Peer Management: Mark peer as non-compliant -No Response: Do not send error message (message may be malicious) - -Invalid WantList: - -Condition: WantList exceeds entry limit or contains malformed addresses -Action: Ignore malformed entries, process valid ones -Response: Continue processing stream -Logging: Log validation errors for debugging - -Payment Failures: - -Condition: State channel update invalid or payment insufficient -Action: Do not deliver blocks requiring payment -Response: Send BlockPresence with price indicating payment needed -Stream: Keep stream open for payment retry - -Recovery Strategies -Retry Responsibility Model -The protocol defines a clear separation between system-level and caller-level -retry responsibilities: -System-Level Retry (Automatic): -The Block Exchange module automatically retries in these scenarios: - -Peer failure: If a peer disconnects or times out, the system -transparently tries alternative peers from the discovery set -Transient errors: Network glitches, temporary unavailability -Peer rotation: Automatic failover to next available peer - -The caller's requestBlock call remains pending during system-level retries. -This is transparent to the caller. -Caller-Level Retry (Manual): -The caller is responsible for retry decisions when: - -All peers exhausted: No more peers available from discovery -Permanent failures: Block doesn't exist in the network -Timeout exceeded: Request timeout (300s) expired -Verification failures: All peers provided invalid data - -In these cases, requestBlock returns an error and the caller decides -whether to retry, perhaps after waiting or refreshing the peer list -via discovery. -Retry Flow: -requestBlock(address) - │ - ├─► System tries Peer A ──► Fails - │ │ - │ └─► System tries Peer B ──► Fails (automatic, transparent) - │ │ - │ └─► System tries Peer C ──► Success ──► Return block - │ - └─► All peers failed ──► Return error to caller - │ - └─► Caller decides: retry? wait? abort? - -Peer Rotation: -When a peer fails to deliver blocks: - -Mark peer as temporarily unavailable for this block -Query discovery service for alternative peers -Send WantList to new peers -Implement exponential backoff before retrying failed peer - -Graceful Degradation: - -If verification fails, request block from alternative peer -If all peers fail, propagate error to caller -Clean up resources (memory, pending requests) on unrecoverable failures - -Error Propagation: - -Service interface functions (requestBlock, cancelRequest) return errors -to callers only after system-level retries are exhausted -Internal errors logged for debugging -Network errors trigger automatic peer rotation before surfacing to caller -Verification errors result in block rejection and peer reputation impact - -Security Considerations -Block Verification - -All dataset blocks MUST include and verify Merkle proofs before acceptance -Standalone blocks MUST verify CID matches the SHA256 hash of the data -Peers SHOULD reject blocks that fail verification immediately - -DoS Protection - -Implementations SHOULD limit the number of concurrent block requests per peer -Implementations SHOULD implement rate limiting for WantList updates -Large WantLists MAY be rejected to prevent resource exhaustion - -Data Integrity - -All blocks MUST be validated before being stored or forwarded -Zero-padding in dataset blocks MUST be verified to prevent data corruption -Block sizes MUST be validated against protocol limits - -Privacy Considerations - -Block requests reveal information about what data a peer is seeking -Implementations MAY implement request obfuscation strategies -Presence information can leak storage capacity details - -Rationale -Design Decisions -Two-Tier Block Addressing: -The protocol supports both standalone and dataset blocks to accommodate -different use cases. -Standalone blocks are simpler and don't require Merkle proofs, while -dataset blocks enable efficient verification of large datasets without -requiring the entire dataset. -WantList Delta Updates: -Supporting delta updates reduces bandwidth consumption when peers only -need to modify a small portion of their wants, which is common in -long-lived connections. -Separate Presence Messages: -Decoupling presence information from block delivery allows peers to -quickly assess availability without waiting for full block transfers. -Fixed Block Size: -The 64 KiB default block size balances efficient network transmission -with manageable memory overhead. -Zero-Padding Requirement: -Requiring zero-padding for incomplete dataset blocks ensures uniform -block sizes within datasets, simplifying Merkle tree construction and -verification. -Protocol Buffers: -Using Protocol Buffers provides efficient serialization, forward -compatibility, and wide language support. -Copyright -Copyright and related rights waived via -CC0. -References -Normative - -RFC 2119 - Key words for use -in RFCs to Indicate Requirement Levels -libp2p: https://libp2p.io -Protocol Buffers: https://protobuf.dev -Multihash: https://multiformats.io/multihash/ -Multicodec: https://github.com/multiformats/multicodec - -Informative - -Codex Documentation: https://docs.codex.storage -Codex Block Exchange Module Spec: -https://github.com/codex-storage/codex-docs-obsidian/blob/main/10%20Notes/Specs/Block%20Exchange%20Module%20Spec.md -Merkle Trees: https://en.wikipedia.org/wiki/Merkle_tree -Content Addressing: -https://en.wikipedia.org/wiki/Content-addressable_storage - - -slug: codex-marketplace -title: CODEX-MARKETPLACE -name: Codex Storage Marketplace -status: raw -category: Standards Track -tags: codex, storage, marketplace, smart-contract -editor: Codex Team and Dmitriy Ryajov dryajov@status.im -contributors: - -Mark Spanbroek mark@codex.storage -Adam Uhlíř adam@codex.storage -Eric Mastro eric@codex.storage -Jimmy Debe jimmy@status.im -Filip Dimitrijevic filip@status.im - - -Abstract + +Abstract Codex Marketplace and its interactions are defined by a smart contract deployed on an EVM-compatible blockchain. This specification describes these interactions for the various roles within the network. The document is intended for implementors of Codex nodes. -Semantics +Semantics The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in 2119. -Definitions +Definitions TerminologyDescription Storage Provider (SP)A node in the Codex network that provides storage services to the marketplace. ValidatorA node that assists in identifying missing storage proofs. @@ -24991,7 +21835,7 @@ contributors: TokenThe ERC20-based token used within the Codex network. -Motivation +Motivation The Codex network aims to create a peer-to-peer storage engine with robust data durability, data persistence guarantees, and a comprehensive incentive structure. The marketplace is a critical component of the Codex network, serving as a platform where all involved parties interact to ensure data persistence. It provides mechanisms to enforce agreements and facilitate data repair when SPs fail to fulfill their duties. Implemented as a smart contract on an EVM-compatible blockchain, the marketplace enables various scenarios where nodes assume one or more roles to maintain a reliable persistence layer for users. This specification details these interactions. @@ -25457,7 +22301,7 @@ Accounting of both reserved bytes in the storage module and freeSize in the Avai onClear: notification emitted once the state machine has concluded; used to reconcile Availability bytes and reserved bytes in the storage module onCleanUp: cleanup hook called in terminal states to release resources, delete reservations, and return collateral to availabilities -Error Handling +Error Handling Always catch CancelledError from nim-chronos and log a trace, exiting gracefully Catch CatchableError, log it, and route to SaleErrored @@ -25598,10 +22442,10 @@ method requestState*(market: Market, requestId: RequestId): Future[?RequestState Protocol Compliance Note: The Client implementation described above is specific to nim-codex. The only normative requirements for Clients are defined in the Client Role section of Part I. Implementations must satisfy those protocol requirements but may use completely different internal designs. -Copyright +Copyright Copyright and related rights waived via CC0. -References -Normative +References +Normative RFC 2119 - Key words for use in RFCs to Indicate Requirement Levels Reed-Solomon algorithm - Erasure coding algorithm used for data encoding @@ -25610,7 +22454,7 @@ method requestState*(market: Market, requestId: RequestId): Future[?RequestState Proof-of-Data-Possession - Zero-knowledge proof system for storage verification Original Codex Marketplace Spec - Source specification for this document -Informative +Informative Codex Implementation - Reference implementation in Nim Codex market implementation - Marketplace module implementation @@ -25622,19 +22466,30 @@ method requestState*(market: Market, requestId: RequestId): Future[?RequestState Status RFCs Status is a communication tool providing privacy features for the user. Specifications can also be viewed at Status. - -slug: 24 -title: 24/STATUS-CURATION -name: Status Community Directory Curation Voting using Waku v2 -status: draft -tags: waku-application -description: A voting protocol for SNT holders to submit votes to a smart contract. Voting is immutable, which helps avoid sabotage from malicious peers. -editor: Szymon Szlachtowicz szymon.s@ethworks.io -Abstract +24/STATUS-CURATION + + +NameStatus Community Directory Curation Voting using Waku v2 +Slug24 +Statusdraft +EditorSzymon Szlachtowicz <szymon.s@ethworks.io> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-02-05 — 60fcdd5 — Update curation.md +2024-01-27 — de29833 — Create curation.md + + +Abstract This specification is a voting protocol for peers to submit votes to a smart contract. Voting is immutable, this will help avoid sabotage from malicious peers. -Motivation +Motivation In open p2p protocol there is an issue with voting off-chain as there is much room for malicious peers to only include votes that support their case when submitting votes to chain. @@ -25697,20 +22552,31 @@ that votes aren't duplicated on smart contract. Once the vote deadline has expired, the smart contract will not accept votes anymore. Also directory will be updated according to vote results (community added to directory, removed etc.) -Copyright +Copyright Copyright and related rights waived via CC0. - -slug: 28 -title: 28/STATUS-FEATURING -name: Status community featuring using waku v2 -status: draft -tags: waku-application -description: To gain new members, current SNT holders can vote to feature an active Status community to the larger Status audience. -editor: Szymon Szlachtowicz szymon.s@ethworks.io -Abstract +28/STATUS-FEATURING + + +NameStatus community featuring using waku v2 +Slug28 +Statusdraft +EditorSzymon Szlachtowicz <szymon.s@ethworks.io> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-02-05 — 1255162 — Update featuring.md +2024-01-27 — 86cafd8 — Create featuring.md + + +Abstract This specification describes a voting method to feature different active Status Communities. -Overview +Overview When there is a active community that is seeking new members, current users of community should be able to feature their community so that it will be accessible to larger audience. @@ -25746,28 +22612,36 @@ only the vote with highest timestamp is considered valid. it can't be featured in current week. - In a current week top 5 (or 10) communities with highest amount of SNT votes up to previous Sunday 23:59:59 UTC are considered featured. -Copyright +Copyright Copyright and related rights waived via CC0. - -slug: 55 -title: 55/STATUS-1TO1-CHAT -name: Status 1-to-1 Chat -status: draft -category: Standards Track -tags: waku-application -description: A chat protocol to send public and private messages to a single recipient by the Status app. -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors: +55/STATUS-1TO1-CHAT + + +NameStatus 1-to-1 Chat +Slug55 +Statusdraft +CategoryStandards Track +EditorAaryamann Challani <p1ge0nh8er@proton.me> +ContributorsAndrea Piana <andreap@status.im>Pedro Pombeiro <pedro@status.im>Corey Petty <corey@status.im>Oskar Thorén <oskarth@titanproxy.com>Dean Eigenmann <dean@status.im> + + + +Timeline -Andrea Piana andreap@status.im -Pedro Pombeiro pedro@status.im -Corey Petty corey@status.im -Oskar Thorén oskarth@titanproxy.com -Dean Eigenmann dean@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-09-12 — 0b4d151 — Update 1to1-chat.md (#92) +2024-08-05 — eb25cd0 — chore: replace email addresses (#86) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-07 — e95c5c6 — Update 1to1-chat.md +2024-02-05 — 44baefd — Update 1to1-chat.md +2024-02-01 — e105bea — Update and rename 1TO1-CHAT.md to 1to1-chat.md +2024-01-27 — 4a8585b — Create 1TO1-CHAT.md - -Abstract + +Abstract This specification describes how the Status 1-to-1 chat protocol is implemented on top of the Waku v2 protocol. This protocol can be used to send messages to a single recipient. @@ -25781,11 +22655,11 @@ This protocol can be used to send messages to a single recipient. Group admin: A participant that is able to add/remove participants from a group chat. -Background +Background This document describes how 2 peers communicate with each other to send messages in a 1-to-1 chat, with privacy and authenticity guarantees. -Specification -Overview +Specification +Overview This protocol MAY use any key-exchange mechanism previously discussed - 53/WAKU2-X3DH @@ -25962,14 +22836,14 @@ group admins MUST use a COLOR_CHANGED event. Image Changed To change the display image of the group chat, group admins MUST use an IMAGE_CHANGED event. -Security Considerations +Security Considerations Inherits the security considerations of the key-exchange mechanism used, e.g., 53/WAKU2-X3DH or WAKU2-NOISE -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 53/WAKU2-X3DH WAKU2-NOISE @@ -25980,22 +22854,33 @@ e.g., 53/WAKU2 chat_message.proto emoji_reaction.proto - -slug: 56 -title: 56/STATUS-COMMUNITIES -name: Status Communities that run over Waku v2 -status: draft -category: Standards Track -tags: waku-application -description: Status Communities allow multiple users to communicate in a discussion space. This is a key feature of the Status application. -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors: +56/STATUS-COMMUNITIES + + +NameStatus Communities that run over Waku v2 +Slug56 +Statusdraft +CategoryStandards Track +EditorAaryamann Challani <p1ge0nh8er@proton.me> +ContributorsAndrea Piana <andreap@status.im>Prem Chaitanya Prathi <prem@waku.org> + + + +Timeline -Andrea Piana andreap@status.im -Prem Chaitanya Prathi prem@waku.org +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-03-07 — f4b34af — Fix Linting Errors (#135) +2025-02-21 — 9bed57e — docs: define basic sharding for Communities (#132) +2025-01-02 — dc7497a — add usage guidelines for waku content topics (#117) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-05 — eb25cd0 — chore: replace email addresses (#86) +2024-02-05 — 11bdc3b — Update communities.md +2024-02-01 — 8350742 — Update and rename COMMUNITIES.md to communities.md +2024-01-27 — a786356 — Create COMMUNITIES.md - -Abstract + +Abstract This document describes the design of Status Communities over Waku v2, allowing for multiple users to communicate in a discussion space. This is a key feature for the Status messaging app. @@ -26028,7 +22913,7 @@ then the number of messages sent over the network is reduced to one per message. Used interchangeably with "owner". Channel: A designated subtopic for a community. Used interchangeably with "chat". -Design Requirements +Design Requirements Due to the nature of communities, the following requirements are necessary for the design of communities - @@ -26050,7 +22935,7 @@ Light nodes solely implementing 19/WAKU2-LIGHTPUSH may not be able to run their own Waku node with the configuration described. -Design +Design Cryptographic Primitives The following cryptographic primitives are used in the design - @@ -26473,13 +23358,13 @@ in case of a data loss. This feature relies on 13/WAKU2-STORE for storing and retrieving messages. -Clock +Clock The clock used in the wire format refers to the Lamport timestamp of the message. The Lamport timestamp is a logical clock that is used to determine the order of events in a distributed system. This allows ordering of messages in an asynchronous network where messages may be received out of order. -Security Considerations +Security Considerations The Community owner is a single point of failure. @@ -26507,9 +23392,9 @@ The following document describes this method in more detail - since members of the community don't need to receive all the control messages. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 55/STATUS-1TO1-CHAT 53/WAKU2-X3DH @@ -26521,26 +23406,34 @@ since members of the community don't need to receive all the control messages. 13/WAKU2-STORE 12/WAKU2-FILTER -informative +informative community.go organisation-channels.md - -slug: 61 -title: 61/STATUS-Community-History-Service -name: Status Community History Service -status: draft -category: Standards Track -description: Explains how new members of a Status community can request historical messages from archive nodes. -editor: r4bbit r4bbit@status.im -contributors: +61/STATUS-Community-History-Service + + +NameStatus Community History Service +Slug61 +Statusdraft +CategoryStandards Track +Editorr4bbit <r4bbit@status.im> +ContributorsSanaz Taheri <sanaz@status.im>John Lea <john@status.im> + + + +Timeline -Sanaz Taheri sanaz@status.im -John Lea john@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-03-21 — 2eaa794 — Broken Links + Change Editors (#26) +2024-02-07 — d8ba50e — Update community-history-service.md +2024-02-05 — ad72c49 — Create community-history-service.md - -Abstract + +Abstract Messages are stored permanently by store nodes (13/WAKU2-STORE) for up to a certain configurable period of time, @@ -26602,7 +23495,7 @@ older than 30 days. These assumptions are less than ideal and will be enhanced in future work. This forum discussion provides more details. -Overview +Overview The following is a high-level overview of the user flow and features this specification describes. For more detailed descriptions, read the dedicated sections in this specification. @@ -27000,9 +23893,9 @@ the hashes presented in archive indices will look completely different, resulting in the community member node to download the corresponding archive (which might be identical to an archive that was already downloaded, except for that one message). -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 13/WAKU2-STORE BitTorrent @@ -27017,22 +23910,30 @@ except for that one message). 14/WAKU2-MESSAGE 62/STATUS-PAYLOADS - -slug: 62 -title: 62/STATUS-PAYLOADS -name: Status Message Payloads -status: draft -description: Describes the payload of each message in Status. -editor: r4bbit r4bbit@status.im -contributors: +62/STATUS-PAYLOADS + + +NameStatus Message Payloads +Slug62 +Statusdraft +Editorr4bbit <r4bbit@status.im> +ContributorsAdam Babik <adam@status.im>Andrea Maria Piana <andreap@status.im>Oskar Thoren <oskarth@titanproxy.com>Samuel Hawksby-Robinson <samuel@status.im> + + + +Timeline -Adam Babik adam@status.im -Andrea Maria Piana andreap@status.im -Oskar Thoren oskarth@titanproxy.com -Samuel Hawksby-Robinson samuel@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-16 — ad80a59 — 62/STATUS-PAYLOAD: Add Description (#95) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-02-07 — 1abf2c9 — Rename payload.md to payloads.md +2024-02-07 — e2b9e32 — Update payload.md +2024-02-05 — 20e9a66 — Rename payloads.md to payload.md +2024-02-05 — 488ce9b — Create payloads.md - -Abstract + +Abstract This specification describes how the payload of each message in Status looks like. It is primarily centered around chat and chat-related use cases. @@ -27964,39 +24865,49 @@ they've revealed when requesting to join a community. A node does not support deletion of existing fields or messages, which might break compatibility -Security Considerations -Changelog -Version 0.5 +Security Considerations +Changelog +Version 0.5 Released August 25, 2020 Added support for emoji reactions -Version 0.4 +Version 0.4 Released July 16, 2020 Added support for images Added support for audio -Version 0.3 +Version 0.3 Released May 22, 2020 Added language to include Waku in all relevant places -Copyright +Copyright Copyright and related rights waived via CC0. - -slug: 63 -title: 63/STATUS-Keycard-Usage -name: Status Keycard Usage -status: draft -category: Standards Track -description: Describes how an application can use the Status Keycard to create, store and transact with different account addresses. -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors: +63/STATUS-Keycard-Usage + + +NameStatus Keycard Usage +Slug63 +Statusdraft +CategoryStandards Track +EditorAaryamann Challani <p1ge0nh8er@proton.me> +ContributorsJimmy Debe <jimmy@status.im> + + + +Timeline -Jimmy Debe jimmy@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-05 — eb25cd0 — chore: replace email addresses (#86) +2024-02-05 — 928173d — Update keycard-usage.md +2024-02-05 — 68e6d45 — Update keycard-usage.md +2024-01-27 — 100e0e8 — Create keycard-usage.md - + Terminology Account: A valid @@ -28004,7 +24915,7 @@ contributors: compliant key. Multiaccount: An account from which multiple Accounts can be derived. -Abstract +Abstract This specification describes how an application can use the Status Keycard to - Create Multiaccounts @@ -28013,7 +24924,7 @@ compliant key. Derive Accounts from Multiaccounts More documentation on the Status Keycard can be found here -Motivation +Motivation The Status Keycard is a hardware wallet that can be used to store and sign transactions. For the purpose of the Status App, @@ -28231,37 +25142,45 @@ MAY implement the following flows according to the actions listed above. The user unblocks the Keycard using the /unblock-pin endpoint. -Security Considerations +Security Considerations Inherits the security considerations of Status Keycard -Privacy Considerations +Privacy Considerations Inherits the privacy considerations of Status Keycard -Copyright +Copyright Copyright and related rights waived via CC0. -References +References BIP-32 specification Keycard documentation 16/Keycard-Usage - -slug: 65 -title: 65/STATUS-ACCOUNT-ADDRESS -name: Status Account Address -status: draft -category: Standards Track -description: Details of what a Status account address is and how account addresses are created and used. -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors: +65/STATUS-ACCOUNT-ADDRESS + + +NameStatus Account Address +Slug65 +Statusdraft +CategoryStandards Track +EditorAaryamann Challani <p1ge0nh8er@proton.me> +ContributorsCorey Petty <corey@status.im>Oskar Thorén <oskarth@titanproxy.com>Samuel Hawksby-Robinson <samuel@status.im> + + + +Timeline -Corey Petty corey@status.im -Oskar Thorén oskarth@titanproxy.com -Samuel Hawksby-Robinson samuel@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-05 — eb25cd0 — chore: replace email addresses (#86) +2024-02-05 — 67a1221 — Update account-address.md +2024-02-01 — 91874da — Update and rename ACCOUNT-ADDRESS.md to account-address.md +2024-01-27 — ae04f02 — Create ACCOUNT-ADDRESS.md - -Abstract + +Abstract This specification details what a Status account address is and how account addresses are created and used. -Background +Background The core concept of an account in Status is a set of cryptographic keypairs. Namely, the combination of the following: @@ -28359,22 +25278,22 @@ An Account is referred to as a Multiaccount in the wire format. The above payload is broadcasted when 2 devices that belong to a user need to be paired. -Security Considerations +Security Considerations This specification inherits security considerations of 53/WAKU2-X3DH and 54/WAKU2-X3DH-SESSIONS. -Copyright +Copyright Copyright and related rights waived via CC0. -References -normative +References +normative 53/WAKU2-X3DH 54/WAKU2-X3DH-SESSIONS 55/STATUS-1TO1-CHAT -informative +informative BIP43 BIP39 @@ -28383,24 +25302,34 @@ that belong to a user need to be paired. Ethereum Name System Status Multiaccount - -slug: 71 -title: 71/STATUS-PUSH-NOTIFICATION-SERVER -name: Push Notification Server -status: draft -category: Standards Track -description: A set of methods to allow Status clients to use push notification services in mobile environments. -editor: Jimmy Debe jimmy@status.im -contributors: +71/STATUS-PUSH-NOTIFICATION-SERVER + + +NamePush Notification Server +Slug71 +Statusdraft +CategoryStandards Track +EditorJimmy Debe <jimmy@status.im> +ContributorsAndrea Maria Piana <andreap@status.im> + + + +Timeline -Andrea Maria Piana andreap@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-02-07 — 3e21cc0 — Update push-notification-server.md +2024-02-05 — 5bce327 — Update push-notification-server.md +2024-02-02 — 8df3f00 — Update and rename PUSH-NOTIFICATIONS.md to push-notification-server.md +2024-01-27 — eb7c5bf — Create PUSH-NOTIFICATIONS.md - -Abstract + +Abstract A push notification server implementation for IOS devices and Android devices. This specification provides a set of methods that allow clients to use push notification services in mobile environments. -Background +Background Push notification for iOS and Android devices can only be implemented by relying on APN, @@ -28420,11 +25349,11 @@ Status provides a set of methods to acheive push notification services. Since this can not be safely implemented in a privacy-preserving manner, clients need to be given an option to opt-in to receive and send push notifications. They are disabled by default. -Specification +Specification The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in 2119. -Definitions +Definitions TerminologyDescription clientA node that implements the Status specifications. userThe owner of a device that runs a client. @@ -29057,9 +25986,9 @@ but querying client’s chat key is not disclosed. The shake-256 of the chat_id. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References PUSH-NOTIFICATION-SERVER, Initial Specification Push Notification, Apple Developer @@ -29072,20 +26001,37 @@ but querying client’s chat key is not disclosed. Protocol Buffers 53/WAKU2-X3DH - -title: STATUS-SIMPLE-SCALING -name: Status Simple Scaling -status: raw -category: Informational -tags: waku/application -description: Describes how to scale Status Communities and Status 1-to-1 chats using Waku v2 protocol and components. -editor: Daniel Kaiser danielkaiser@status.im -contributors: +Status Raw Specifications +Early-stage Status specifications that precede draft or stable status. +STATUS-SIMPLE-SCALING + + +NameStatus Simple Scaling +Statusraw +CategoryInformational +EditorDaniel Kaiser <danielkaiser@status.im> +ContributorsAlvaro Revuelta <alrevuelta@status.im> + + + +Timeline -Alvaro Revuelta alrevuelta@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-11-20 — ff87c84 — Update Waku Links (#104) +2024-09-17 — 9b5e219 — Update simple-scaling (#93) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-06-14 — a189a72 — fix: messageHash in 57 (#22) +2024-03-01 — 61a39e2 — Update and rename vac/raw/57/simple-scaling.md to status/raw/simple-scaling.md +2024-02-28 — 18a16ae — Update and rename simple-scaling.md to simple-scaling.md +2024-02-12 — f19a136 — Update and rename status/57/simple-scaling.md to status/raw/57/simple-scaling.md +2024-02-07 — 27fae4f — Update simple-scaling.md +2024-02-05 — fa8c750 — Update simple-scaling.md +2024-02-01 — 5919040 — Update simple-scaling.md +2024-01-27 — f7a51b9 — Create simple-scaling.md - -Abstract + +Abstract This document describes how to scale 56/STATUS-COMMUNITIES as well as 55/STATUS-1TO1-CHAT using Waku v2 protocol and components. @@ -29417,7 +26363,7 @@ one register query per shard. A discovery query for nodes that are part of this shard would look like DISCOVER{ns: "rs/16/2"} -DoS Protection +DoS Protection Hereunder we describe the "opt-in message signing for DoS prevention" solution, designed ad hoc for Status MVP. Since publishing messages to pubsub topics has no limits, @@ -29575,9 +26521,9 @@ It could be rate-limited with RLN. Todo: elaborate. See WAKU2-ADVERSARIAL-MODELS for information on Waku Anonymity. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 56/STATUS-COMMUNITIES 55/STATUS-1TO1-CHAT @@ -29600,558 +26546,33 @@ for information on Waku Anonymity. Circuit Relay WAKU2-ADVERSARIAL-MODELS -Informative +Informative Circuit Relay WAKU2-ENR - -title: STATUS-SIMPLE-SCALING -name: Status Simple Scaling -status: raw -category: Informational -tags: waku/application -description: Describes how to scale Status Communities and Status 1-to-1 chats using Waku v2 protocol and components. -editor: Daniel Kaiser danielkaiser@status.im -contributors: - -Alvaro Revuelta alrevuelta@status.im - - -Abstract -This document describes how to scale -56/STATUS-COMMUNITIES as well as 55/STATUS-1TO1-CHAT -using Waku v2 protocol and components. -It also adds a few new aspects, -where more sophisticated components are not yet researched and evaluated. - -Note: (Parts of) this RFC will be deprecated in the future -as we continue research to scale specific components -in a way that aligns better with our principles of decentralization and -protecting anonymity. -This document informs about scaling at the current stage of research and -shows it is practically possible. -Practical feasibility is also a core goal for us. -We believe in incremental improvement, i.e. -having a working decentralized scaling solution with trade-offs -is better than a fully centralized solution. - -Background and Motivation -56/STATUS-COMMUNITIES as well as -55/STATUS-1TO1-CHAT use Waku v2 protocols. -Both use Waku content topics -(see 23/WAKU2-TOPICS) -for content based filtering. -Waku v2 currently has scaling limitations in two dimensions: - - -Messages that are part of a specific content topic -have to be disseminated in a single mesh network (i.e. pubsub topic). -This limits scaling the number of messages disseminated in a specific content topic, -and by extension, the number of active nodes that are part of this content topic. - - -Scaling a large set of content topics requires distributing these over several -mesh networks (which this document refers to as pubsub topic shards). - - -This document focuses on the second scaling dimension. -With the scaling solutions discussed in this document, -each content topics can have a large set of active users, -but still has to fit in a single pubsub mesh. - -Note: While it is possible to use the same content topic name on several shards, -each node that is interested in this content topic -has to be subscribed to all respective shards, which does not scale. -Splitting content topics in a more sophisticated and -efficient way will be part of a future document. - -Relay Shards -Sharding the 11/WAKU2-RELAY -network is an integral part of scaling the Status app. -WAKU2-RELAY-SHARDING -specifies shards clusters, which are sets of 1024 shards -(separate pubsub mesh networks). -Content topics specified by application protocols can be distributed over these shards. -The Status app protocols are assigned to shard cluster 16, -as defined in WAKU2-RELAY-STATIC-SHARD-ALLOC. -WAKU2-RELAY-SHARDING -specifies three sharding methods. -This document uses static sharding, -which leaves the distribution of content topics to application protocols, -but takes care of shard discovery. -The 1024 shards within the main Status shard cluster are allocated as follows. -Shard Allocation -shard indexusage -0 - 15reserved -16 - 127specific (large) communities -128 - 767communities -768 - 8951:1 chat -896 - 1023media and control msgs - +STATUS-PROTOCOLS + + +NameStatus Protocol Stack +Statusraw +CategoryStandards Track +EditorHanno Cornelius <hanno@status.im> +ContributorsJimmy Debe <jimmy@status.im>Aaryamann Challani <p1ge0nh8er@proton.me> + -Shard indices are mapped to pubsub topic names as follows (specified in WAKU2-RELAY-SHARDING). -/waku/2/rs/<cluster_id>/<shard_number> -an example for the shard with index 18 in the Status shard cluster: -/waku/2/rs/16/18 -In other words, the mesh network with the pubsub topic name /waku/2/rs/16/18, -carries messages associated with shard 18 in the Status shard cluster. -Implementation Suggestion -The Waku implementation should offer an interface that -allows Status nodes to subscribe to Status specific content topics like -subscribe("/status/xyz", 16, 18) - -The shard cluster index 16 can be kept in the Status app configuration, -so that Status nodes can simply use -subscribe("/status/xyz", 18) - -which means: connect to the "status/xyz" content topic on shard 18 -within the Status shard cluster. -Status Communities -In order to associate a community with a shard, -the community description protobuf is extended by the field -uint16 relay_shard_index = 15: - -syntax = "proto3"; - -message CommunityDescription { - // The Lamport timestamp of the message - uint64 clock = 1; - // A mapping of members in the community to their roles - map<string,CommunityMember> members = 2; - // The permissions of the Community - CommunityPermissions permissions = 3; - // The metadata of the Community - ChatIdentity identity = 5; - // A mapping of chats to their details - map<string,CommunityChat> chats = 6; - // A list of banned members - repeated string ban_list = 7; - // A mapping of categories to their details - map<string,CommunityCategory> categories = 8; - // The admin settings of the Community - CommunityAdminSettings admin_settings = 10; - // If the community is encrypted - bool encrypted = 13; - // The list of tags - repeated string tags = 14; - // index of the community's shard within the Status shard cluster - uint16 relay_shard_index = 15 -} - - -Note: Currently, Status app has allocated shared cluster 16 in WAKU2-RELAY-STATIC-SHARD-ALLOC. -Status app could allocate more shard clusters, for instance to establish a test net. -We could add the shard cluster index to the community description as well. -The recommendation for now, -is to keep it as a configuration option of the Status app. -Note: Once this RFC moves forward, -the new community description protobuf fields should be mentioned in 56/STATUS-COMMUNITIES. - -Status communities can be mapped to shards in two ways: static, and owner-based. -Static Mapping -With static mapping, -communities are assigned a specific shard index within the Status shard cluster. -This mapping is similar in nature to the shard cluster allocation in WAKU2-RELAY-STATIC-SHARD-ALLOC. -Shard indices allocated in that way are in the range 16 - 127. -The Status CC community uses index 16 -(not to confuse with shard cluster index 16, which is the Status shard cluster). -Owner Mapping - -Note: This way of mapping will be specified post-MVP. - -Community owners can choose to map their communities to any shard within -the index range 128 - 767. -1:1 Chat -55/STATUS-1TO1-CHAT -uses partitioned topics to map 1:1 chats to a set of 5000 content topics. -This document extends this mapping to 8192 content topics that are, in turn, -mapped to 128 shards in the index range of 768 - 895. -contentPartitionsNum = 8192 -contentPartition = mod(publicKey, contentPartitionsNum) -partitionContentTopic = "contact-discovery-" + contentPartition - -partitionContentTopic = keccak256(partitionContentTopic) - -shardNum = 128 -shardIndex = 768 + mod(publicKey, shardNum) - - -Infrastructure Nodes -As described in 30/ADAPTIVE-NODES, -Waku supports a continuum of node types with respect to available resources. -Infrastructure nodes are powerful nodes that have a high bandwidth connection and -a high up-time. -This document, which informs about simple ways of scaling Status over Waku, -assumes the presence of a set of such infrastructure nodes in each shard. -Infrastructure nodes are especially important for -providing connectivity in the roll-out phase. -Infrastructure nodes are not limited to Status fleets, or -nodes run by community owners. -Anybody can run infrastructure nodes. -Statically-Mapped Communities -Infrastructure nodes are provided by the community owner, -or by members of the respective community. -Owner-Mapped Communities -Infrastructure nodes are part of a subset of the shards in the range 128 - 767. -Recommendations on choosing this subset will be added -in a future version of this document. -Status fleet nodes make up a part of these infrastructure nodes. -1:1 chat -Infrastructure nodes are part of a subset of the shards in the range 768 - 985 -(similar to owner-mapped communities). -Recommendations on choosing this subset will be added -in a future version of this document. -Desktop clients can choose to only use filter and lightpush. - -Note: Discussion: I'd suggest to set this as the default for the MVP. -The load on infrastructure nodes would not be higher, because -they have to receive and relay each message anyways. -This comes as a trade-off to anonymity and decentralization, -but can significantly improve scaling. -We still have k-anonymity because -several chat pairs are mapped into one content topic. -We could improve on this in the future, and research the applicability of PIR -(private information retrieval) techniques in the future. - -Infrastructure Shards -Waku messages are typically relayed in larger mesh networks -comprised of nodes with varying resource profiles -(see 30/ADAPTIVE-NODES). -To maximise scaling, relaying of specific message types can be dedicated to shards -where only infrastructure nodes with very strong resource profiles relay messages. -This comes as a trade-off to decentralization. -Control Message Shards -To get the maximum scaling for select large communities for the Status scaling MVP, -specific control messages that cause significant load -(at a high user number) SHOULD be moved to a separate control message shard. -These control messages comprise: + +Timeline -community description -membership update -backup -community request to join response -sync profile picture +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-03-07 — f4b34af — Fix Linting Errors (#135) +2025-02-21 — 9bed57e — docs: define basic sharding for Communities (#132) +2024-11-20 — 776c1b7 — rfc-index: Update (#110) +2024-10-25 — 37b3edf — docs: add spec for status protocol stack, deprecate waku-usage spec (#105) -The relay functionality of control messages shards SHOULD -be provided by infrastructure nodes. -Desktop clients should use light protocols as the default for control message shards. -Strong Desktop clients MAY opt in to support the relay network. -Each large community (in the index range of 16 - 127) -can get its dedicated control message shard -(in the index range 896 - 1023) if deemed necessary. -The Status CC community uses shard 896 as its control message shard. -This comes with trade-offs to decentralization and anonymity -(see Security Considerations section). -Media Shards -Similar to control messages, media-heavy communities should use separate media shards -(in the index range 896 - 1023) for disseminating messages with large media data. -The Status CC community uses shard 897 as its media shard. -Infrastructure-focused Community -Large communities MAY choose to mainly rely on infrastructure nodes -for all message transfers (not limited to control, and media messages). -Desktop clients of such communities should use light protocols as the default. -Strong Desktop clients MAY opt in to support the relay network. - -Note: This is not planned for the MVP. - -Light Protocols -Light protocols may be used to save bandwidth, -at the (global) cost of not contributing to the network. -Using light protocols is RECOMMENDED for resource restricted nodes, -e.g. browsers, -and devices that (temporarily) -have a low bandwidth connection or a connection with usage-based billing. -Light protocols comprise - -19/WAKU2-LIGHTPUSH for sending messages -12/WAKU2-FILTER -for requesting messages with specific attributes -WAKU2-PEER-EXCHANGE -for discovering peers - -Waku Archive -Archive nodes are Waku nodes that offer the Waku archive service via -the Waku store protocol (13/WAKU2-STORE). -They are part of a set of shards and store all messages disseminated in these shards. -Nodes can request history messages via the 13/WAKU2-STORE. -The store service is not limited to a Status fleet. -Anybody can run a Waku Archive node in the Status shards. - -Note: There is no specification for discovering archive nodes -associated with specific shards yet. -Nodes expect archive nodes to store all messages, regardless of shard association. - -The recommendation for the allocation of archive nodes to shards is similar to the -allocation of infrastructure nodes to shards described above. -In fact, the archive service can be offered by infrastructure nodes. -Discovery -Shard discovery is covered by WAKU2-RELAY-SHARDING. -This allows the Status app to abstract from the discovery process and -simply address shards by their index. -Libp2p Rendezvous and Circuit-Relay -To make nodes behind restrictive NATs discoverable, -this document suggests using libp2p rendezvous. -Nodes can check whether they are behind a restrictive NAT using the -libp2p AutoNAT protocol. - -Note: The following will move into WAKU2-RELAY-SHARDING, -or 33/WAKU2-DISCV5: -Nodes behind restrictive NATs SHOULD not announce their publicly unreachable address -via 33/WAKU2-DISCV5 discovery. - -It is RECOMMENDED that nodes that are part of the relay network also -act as rendezvous points. -This includes accepting register queries from peers, -as well as answering rendezvous discover queries. -Nodes MAY opt-out of the rendezvous functionality. -To allow nodes to initiate connections to peers behind restrictive NATs -(after discovery via rendezvous), -it is RECOMMENDED that nodes that are part of the Waku relay network also offer -libp2p circuit relay -functionality. -To minimize the load on circuit-relay nodes, nodes SHOULD - -make use of the limiting -functionality offered by the libp2p circuit relay protocols, and -use DCUtR -to upgrade to a direct connection. - -Nodes that do not announce themselves at all and only plan to use light protocols, -MAY use rendezvous discovery instead of or along-side WAKU2-PEER-EXCHANGE. -For these nodes, rendezvous and -WAKU2-PEER-EXCHANGE -offer the same functionality, -but return node sets sampled in different ways. -Using both can help increasing connectivity. -Nodes that are not behind restrictive NATs MAY register at rendezvous points, too; -this helps increasing discoverability, and by extension connectivity. -Such nodes SHOULD, however, not register at circuit relays. -Announcing Shard Participation -Registering a namespace via lib-p2p rendezvous -is done via a register query: -REGISTER{my-app, {QmA, AddrA}} - -The app name, my-app contains the encoding of a single shard in string form: -"rs/"| to_string(<2-byte shard cluster index>) | "/" | to_string(<2-byte shard index>) - -The string conversion SHOULD remove leading zeros. - -Note: Since the ns -field is of type string, a more efficient byte encoding is not utilized. - -Registering shard 2 in the Status shard cluster (with shard cluster index 16, -see WAKU2-RELAY-STATIC-SHARD-ALLOC, -the register query would look like -REGISTER{"rs/16/2", {QmA, AddrA}} - -Participation in further shards is registered with further queries; -one register query per shard. -A discovery query for nodes that are part of this shard would look like -DISCOVER{ns: "rs/16/2"} - -DoS Protection -Hereunder we describe the "opt-in message signing for DoS prevention" solution, -designed ad hoc for Status MVP. -Since publishing messages to pubsub topics has no limits, -anyone can publish messages at a very high rate and DoS the network. -This would elevate the bandwidth consumption of all nodes subscribed -to said pubsub topic, making it prohibitive (in terms of bandwidth) -to be subscribed to it. -In order to scale, we need some mechanism to prevent this from happening, -otherwise all scaling efforts will be in vain. -Since RLN is not ready yet, -hereunder we describe a simpler approach designed ad hoc for Status use case, -feasible to implement for the MVP and -that validates some of the ideas that will evolve to solutions such as RLN. -With this approach, certain pubsub topics can be optionally configured -to only accept messages signed with a given key, -that only trusted entities know. -This key can be pre-shared among a set of participants, -that are trusted to make fair usage of the network, -publishing messages at a reasonable rate/size. -Note that this key can be shared/reused among multiple participants, and -only one key is whitelisted per pubsub topic. -This is an opt-in solution that operators can choose to deploy in their shards -(i.e. pubsub topics), but it's not enforced in the default one. -Operators can freely choose how they want to generate, and -distribute the public keys. -It's also their responsibility to handle the private key, -sharing it with only trusted parties and keeping proper custody of it. -The following concepts are introduced: - -private-key-topic: A private key of 32 bytes, -that allows the holder to sign messages and it's mapped to a protected-pubsub-topic. -app-message-hash: Application WakuMessage hash, -calculated as sha256(concat(pubsubTopic, payload, contentTopic, timestamp, ephemeral)) -with all elements in bytes. -message-signature: ECDSA signature of application-message-hash -using a given private-key-topic, 64 bytes. -public-key-topic: The equivalent public key of private-key-topic. -protected-pubsub-topic: Pubsub topic that only accepts messages -that were signed with private-key-topic, -where verify(message-signature, app-message-hash, public-key-topic) -is only correct if the message-signature was produced by private-key-topic. -See ECDSA signature verification algorithm. - -This solution introduces two roles: - -Publisher: A node that knows the private-key-topic associated to public-key-topic, -that can publish messages with a valid message-signature that are accepted and -relayed by the nodes implementing this feature. -Relayer: A node that knows the public-key-topic, -which can be used to verify if the messages were signed with the equivalent private-key-topic. -It allows distinguishing valid from invalid messages -which protect the node against DoS attacks, -assuming that the users of the key send messages of a reasonable size and rate. -Note that a node can validate messages and -relay them or not without knowing the private key. - -Design requirements (publisher) -A publisher that wants to send messages -that are relayed in the network for a given protected-pubsub-topic shall: - -be able to sign messages with the private-key-topic configured for that topic, -producing a ECDSA signature of 64 bytes using -deterministic signing complying with RFC 6979. -include the signature of the app-message-hash (message-signature) -that wishes to send in the WakuMessage meta field. - -The app-message-hash of the message shall be calculated as the sha256 hash -of the following fields of the message: -sha256(concat(pubsubTopic, payload, contentTopic, timestamp, ephemeral)) - -Where fields are serialized into bytes using little-endian. -Note that ephemeral is a boolean that is serialized to 0 if false and -1 if true. -Design requirements (relay) -Requirements for the relay are listed below: - -A valid protected-pubsub-topic shall be configured with a public-key-topic, -(derived from a private-key-topic). -Note that the relay does not need to know the private key. -For simplicity, there is just one key per topic. -Since this approach has clear privacy implications, -this configuration is not part of the waku protocol, but of the application. - -Requirements on the gossipsub validator: - -Relay nodes should use the existing gossipsub validators that allow to Accept -or Reject messages, according to the following criteria: -If timestamp is not set (equals to 0) then Reject the message. -If the timestamp is abs(current_timestamp-timestamp) > MessageWindowInSec -then Reject the message. -If meta is empty, Reject the message. -If meta exists but its size is different than 64 bytes, Reject the message. -If meta does not successfully verifies according to the ECDSA signature -verification algorithm using public-key-topic and app-message-hash, -then Reject the message. -If and only if all above conditions are met then Accept the message. - -Other requirements: - -The node shall keep metrics on the messages validation output, -Accept or Reject. -(Optional). To further strengthen DoS protection, -gossipsub scoring -can be used to trigger disconnections from peers sending multiple invalid messages. -See P4 penalty. -This protects each peer from DoS, -since this score is used to trigger disconnections from nodes attempting to DoS them. - -Required changes -This solution is designed to be backward compatible so -that nodes validating messages can coexist in the same topic -with other nodes that don't perform validation. -But note that only nodes that perform message validation -will be protected against DoS. -Nodes wishing to opt-in this DoS protection feature shall: - -Generate a private-key-topic and distribute it to a curated list of users, -that are trusted to send messages at a reasonable rate. -Redeploy the nodes, adding a new configuration -where a protected-pubsub-topic is configured with a public-key-topic, -used to verify the messages being relayed. - -Test vectors -Relay nodes complying with this specification -shall accept the following message in the configured pubsub topic. -Given the following key pair: -private-key-topic = 5526a8990317c9b7b58d07843d270f9cd1d9aaee129294c1c478abf7261dd9e6 -public-key-topic = 049c5fac802da41e07e6cdf51c3b9a6351ad5e65921527f2df5b7d59fd9b56ab02bab736cdcfc37f25095e78127500da371947217a8cd5186ab890ea866211c3f6 - -And the following message to send: -protected-pubsub-topic = pubsub-topic -contentTopic = content-topic -payload = 1A12E077D0E89F9CAC11FBBB6A676C86120B5AD3E248B1F180E98F15EE43D2DFCF62F00C92737B2FF6F59B3ABA02773314B991C41DC19ADB0AD8C17C8E26757B -timestamp = 1683208172339052800 -ephemeral = true - -The message hash and meta (aka signature) are calculated as follows. -app-message-hash = 662F8C20A335F170BD60ABC1F02AD66F0C6A6EE285DA2A53C95259E7937C0AE9 -message.meta = 127FA211B2514F0E974A055392946DC1A14052182A6ABEFB8A6CD7C51DA1BF2E40595D28EF1A9488797C297EED3AAC45430005FB3A7F037BDD9FC4BD99F59E63 - -Using message.meta, the relay node shall calculate the app-message-hash -of the received message using public-key-topic, -and with the values above, the signature should be verified, -making the node Accept the message and relaying it to other nodes in the network. -Owner Mapped Communities -Basic idea: -Tokenized load. -1 to 1 Chat -An idea we plan to explore in the future: -Map 1:1 chats to community shards, if both A and B are part of the respective community. -This increases k-anonymity and benefits from community DoS protection. -It could be rate-limited with RLN. -Security/Privacy Considerations -This document makes several trade-offs to privacy and anonymity. -Todo: elaborate. -See WAKU2-ADVERSARIAL-MODELS -for information on Waku Anonymity. -Copyright -Copyright and related rights waived via CC0. -References - -56/STATUS-COMMUNITIES -55/STATUS-1TO1-CHAT -23/WAKU2-TOPICS -11/WAKU2-RELAY -WAKU2-RELAY-SHARDING -WAKU2-RELAY-STATIC-SHARD-ALLOC -30/ADAPTIVE-NODES -19/WAKU2-LIGHTPUSH -12/WAKU2-FILTER -WAKU2-PEER-EXCHANGE -13/WAKU2-STORE -libp2p rendezvous -libp2p AutoNAT protocol -33/WAKU2-DISCV5 -libp2p circuit relay -limiting -DCUtR -scoring -Circuit Relay -WAKU2-ADVERSARIAL-MODELS - -Informative - -Circuit Relay -WAKU2-ENR - - -title: STATUS-PROTOCOLS -name: Status Protocol Stack -status: raw -category: Standards Track -description: Specifies the Status application protocol stack. -editor: Hanno Cornelius hanno@status.im -contributors: - -Jimmy Debe jimmy@status.im -Aaryamann Challani p1ge0nh8er@proton.me - - -Abstract + +Abstract This specification describes the Status Application protocol stack. It focuses on elements and features in the protocol stack for all application-level functions: @@ -30341,7 +26762,7 @@ Status Mobile clients are assumed to operate with more resource restrictions and For the purposes of the rest of this document, clients in full mode will be referred to as "full clients" and clients in light mode will be referred to as "light clients". -Discovery +Discovery The application MUST make use of at least one discovery method to discover and connect to Waku peers useful for the user functions specific to that instance of the application. The specific Waku discovery protocol used for discovery depends on the use case and resource-availability of the client. @@ -30457,9 +26878,9 @@ The definition of a large message is up to the application. However, the maximum size for a 14/WAKU2-MESSAGE payload is 150KB. Status application payloads that exceed this size MUST be chunked into smaller pieces and MUST be considered a "large message". -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 55/STATUS-1TO1-CHAT 56/STATUS-COMMUNITIES @@ -30473,18 +26894,28 @@ and MUST be considered a "large message". STATUS-MVDS-USAGE WAKU2-STORE - -title: STATUS-MVDS-USAGE -name: MVDS Usage in Status -status: raw -category: Best Current Practice -description: Defines how MVDS protocol used by different message types in Status. -editor: Kaichao Sun kaichao@status.im -contributors: -Abstract +STATUS-MVDS-USAGE + + +NameMVDS Usage in Status +Statusraw +CategoryBest Current Practice +EditorKaichao Sun <kaichao@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-08-21 — 751a01e — feat: status mvds usage (#87) + + +Abstract This document lists the types of messages that are using MVDS in the Status application. -Background +Background Status app uses MVDS to ensure messages going through Waku are acknolwedged by the recipient. This is to ensure that the messages are not missed by any interested parties. @@ -30585,28 +27016,35 @@ These are the three main types of chats in Status. ApplicationMetadataMessage_COMMUNITY_SHARED_ADDRESSES_RESPONSENoNoCommunityChat -Copyright +Copyright Copyright and related rights waived via CC0. -References +References MVDS - -title: STATUS-URL-DATA -name: Status URL Data -status: raw -category: Standards Track -tags: -editor: Felicio Mununga felicio@status.im -contributors: +STATUS-URL-DATA + + +NameStatus URL Data +Statusraw +CategoryStandards Track +EditorFelicio Mununga <felicio@status.im> +ContributorsAaryamann Challani <aaryamann@status.im> + + + +Timeline -Aaryamann Challani aaryamann@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-11-20 — ff87c84 — Update Waku Links (#104) +2024-09-17 — 36f64f0 — feat(59/STATUS-URL-DATA): initial draft (#13) - -Abstract + +Abstract This document specifies serialization, compression, and encoding techniques used to transmit data within URLs in the context of Status protocols. -Motivation +Motivation When sharing URLs, link previews often expose metadata to the websites behind those links. To reduce reliance on external servers for providing appropriate link previews, @@ -30712,9 +27150,9 @@ raw_data = deserialized_data.content See https://github.com/felicio/status-web/blob/825262c4f07a68501478116c7382862607a5544e/packages/status-js/src/utils/encode-url-data.compare.test.ts#L4 -Copyright +Copyright Copyright and related rights waived via CC0. -References +References Proposal Google Sheet Base64url @@ -30725,15 +27163,26 @@ raw_data = deserialized_data.content - -title: STATUS-URL-SCHEME -name: Status URL Scheme -status: raw -category: Standards Track -tags: -editor: Felicio Mununga felicio@status.im -contributors: -Abstract +STATUS-URL-SCHEME + + +NameStatus URL Scheme +Statusraw +CategoryStandards Track +EditorFelicio Mununga <felicio@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2024-09-17 — a519e67 — Move Status-URL-scheme (#98) +2024-09-13 — 3ab314d — Fix Files for Linting (#94) +2024-06-21 — 89cac77 — feat(60/STATUS-URL-SCHEME): initial draft (#14) + + +Abstract This document describes URL scheme for previewing and deep linking content as well as for triggering actions. Background / Rationale / Motivation @@ -30779,24 +27228,32 @@ for the respective document. --> See https://github.com/status-im/specs/pull/159 See https://github.com/status-im/status-web/issues/327 -Copyright +Copyright Copyright and related rights waived via CC0. -References +References STATUS-URL-DATA - -title: 3RD-PARTY -name: 3rd party -status: deprecated -description: This specification discusses 3rd party APIs that Status relies on. -editor: Filip Dimitrijevic filip@status.im -contributors: +Status Deprecated Specifications +Deprecated Status specifications maintained for archival purposes. +3RD-PARTY + + +Name3rd party +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsVolodymyr Kozieiev <volodymyr@status.im> + + + +Timeline -Volodymyr Kozieiev volodymyr@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - -Abstract + +Abstract This specification discusses 3rd party APIs that Status relies on. These APIs provide various capabilities, including: @@ -30806,7 +27263,7 @@ These APIs provide various capabilities, including: obtaining information about collectibles, hosting the privacy policy. -Definitions +Definitions TermDescription Fiat moneyCurrency established as money, often by government regulation, but without intrinsic value. Full nodeA computer, connected to the Ethereum network, that enforces all Ethereum consensus rules. @@ -30874,140 +27331,42 @@ Status’s privacy policy is hosted on Iubenda. Concerns If Iubenda becomes unavailable, users will be unable to view the app's privacy policy. -Changelog +Changelog VersionComment 0.1.0Initial release -Copyright +Copyright Copyright and related rights waived via CC0. -References +References GraphQL Etheremon Cryptostrikers Cryptokitties - -title: 3RD-PARTY -name: 3rd party -status: deprecated -description: This specification discusses 3rd party APIs that Status relies on. -editor: Filip Dimitrijevic filip@status.im -contributors: - -Volodymyr Kozieiev volodymyr@status.im - - -Abstract -This specification discusses 3rd party APIs that Status relies on. -These APIs provide various capabilities, including: - -communicating with the Ethereum network, -allowing users to view address and transaction details on external websites, -retrieving fiat/crypto exchange rates, -obtaining information about collectibles, -hosting the privacy policy. - -Definitions -TermDescription -Fiat moneyCurrency established as money, often by government regulation, but without intrinsic value. -Full nodeA computer, connected to the Ethereum network, that enforces all Ethereum consensus rules. -Crypto-collectibleA unique, non-fungible digital asset, distinct from cryptocurrencies where tokens are identical. - +ACCOUNT + + +NameAccount +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsCorey Petty <corey@status.im>Oskar Thorén <oskar@status.im>Samuel Hawksby-Robinson <samuel@status.im> + -Why 3rd Party APIs Can Be a Problem -Relying on 3rd party APIs conflicts with Status’s censorship-resistance principle. -Since Status aims to avoid suppression of information, -it is important to minimize reliance on 3rd parties that are critical to app functionality. -3rd Party APIs Used by the Current Status App -Infura -What is it? -Infura hosts a collection of Ethereum full nodes and provides an API -to access the Ethereum and IPFS networks without requiring a full node. -How Status Uses It -Since Status operates on mobile devices, -it cannot rely on a local node. -Therefore, all Ethereum network communication happens via Infura. -Concerns -Making an HTTP request can reveal user metadata, -which could be exploited in attacks if Infura is compromised. -Infura uses centralized hosting providers; -if these providers fail or cut off service, -Ethereum-dependent features in Status would be affected. -Etherscan -What is it? -Etherscan is a service that allows users to explore the Ethereum blockchain -for transactions, addresses, tokens, prices, -and other blockchain activities. -How Status Uses It -The Status Wallet allows users to view address and transaction details on Etherscan. -Concerns -If Etherscan becomes unavailable, -users won’t be able to view address or transaction details through Etherscan. -However, in-app information will still be accessible. -CryptoCompare -What is it? -CryptoCompare provides live crypto prices, charts, and analysis from major exchanges. -How Status Uses It -Status regularly fetches crypto prices from CryptoCompare, -using this information to calculate fiat values -for transactions or wallet assets. -Concerns -HTTP requests can reveal metadata, -which could be exploited if CryptoCompare is compromised. -If CryptoCompare becomes unavailable, -Status won’t be able to show fiat equivalents for crypto in the wallet. -Collectibles -Various services provide information on collectibles: + +Timeline -Service 1 -Service 2 -Service 3 -Service 4 +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-06-05 — 36caaa6 — Fix Errors rfc.vac.dev (#165) +2025-04-29 — 614348a — Status deprecated update2 (#134) -Concerns -HTTP requests can reveal metadata, -which could be exploited if these services are compromised. -Iubenda -What is it? -Iubenda helps create compliance documents for websites and apps across jurisdictions. -How Status Uses It -Status’s privacy policy is hosted on Iubenda. -Concerns -If Iubenda becomes unavailable, -users will be unable to view the app's privacy policy. -Changelog -VersionComment -0.1.0Initial release - - -Copyright -Copyright and related rights waived via CC0. -References - -GraphQL -Etheremon -Cryptostrikers -Cryptokitties - - -title: ACCOUNT -name: Account -status: deprecated -description: This specification explains what a Status account is, and how a node establishes trust. -editor: Filip Dimitrijevic filip@status.im -contributors: - -Corey Petty corey@status.im -Oskar Thorén oskar@status.im -Samuel Hawksby-Robinson samuel@status.im - - -Abstract + +Abstract This specification explains what a Status account is, and how a node establishes trust. -Introduction +Introduction The core concept of an account in Status is a set of cryptographic keypairs. Namely, the combination of the following: @@ -31360,26 +27719,26 @@ ab | 97 | bd | 50 | 05 | 4c | 6e | bc For the user, the deserialization process is exactly the same as serialization with the exception that the user MUST provide a serialized public key for deserialization. Else the deserialization algorithm will fail. For further guidance on the implementation of public key de/serialization consult the status-go implementation and tests. -Security Considerations +Security Considerations -Changelog -Version 0.4 +Changelog +Version 0.4 Released June 24, 2020 Added details of public key serialization and deserialization -Version 0.3 +Version 0.3 Released May 22, 2020 Added language to include Waku in all relevant places Change to keep Mailserver term consistent Added clarification to Open Whisper Systems -Copyright +Copyright Copyright and related rights waived via CC0. -References +References BIP43 BIP39 @@ -31395,23 +27754,24 @@ that the user MUST provide a serialized public key for deserialization. Else the June 24, 2020 change commit May 22, 2020 change commit - -title: CLIENT -name: Client -status: deprecated -description: This specification describes how to write a Status client for communicating with other Status clients. -editor: Filip Dimitrijevic filip@status.im -contributors: +CLIENT + + +NameClient +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsAdam Babik <adam@status.im>Andrea Maria Piana <andreap@status.im>Dean Eigenmann <dean@status.im>Corey Petty <corey@status.im>Oskar Thorén <oskar@status.im>Samuel Hawksby-Robinson <samuel@status.im> + + + +Timeline -Adam Babik adam@status.im -Andrea Maria Piana andreap@status.im -Dean Eigenmann dean@status.im -Corey Petty corey@status.im -Oskar Thorén oskar@status.im -Samuel Hawksby-Robinson samuel@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - -Abstract + +Abstract This specification describes how to write a Status client for communicating with other Status clients. This specification presents a reference implementation of the protocol @@ -31419,7 +27779,7 @@ used in a command-line client and a mobile app. This document consists of two parts. The first outlines the specifications required to be a full Status client. The second provides a design rationale and answers some common questions. -Introduction +Introduction Protocol layers Implementing a Status clients largely means implementing the following layers. Additionally, there are separate specifications for things like key management and account lifecycle. @@ -31483,7 +27843,7 @@ run these provided they are connected to the rest of the Whisper/Waku network. These bootstrap nodes MAY change and are not guaranteed to stay this way forever and at some point circumstances might force them to change. -Discovery +Discovery A Status client MUST discover or have a list of peers to connect to. Status uses a light discovery mechanism based on a combination of Discovery v5 and Rendezvous Protocol, @@ -31547,7 +27907,7 @@ various degrees of standardization. Please refer to BIPs and EIPs Standards support For a list of EIPs and BIPs that SHOULD be supported by Status client, please see EIPS. -Security Considerations +Security Considerations See Appendix A Design Rationale P2P Overlay @@ -31620,17 +27980,17 @@ whereby participants can sync. Additionally, MVDS is currently not optimized for large group contexts, which means bandwidth usage will be a lot higher than reasonable. See P2P Data Sync for Mobile for more. This is an active area of research. -Footnotes +Footnotes https://github.com/status-im/status-protocol-go/ https://github.com/status-im/status-console-client/ https://github.com/status-im/status-mobile/ -Appendix A: Security considerations +Appendix A: Security considerations There are several security considerations to take into account when running Status. Chief among them are: scalability, DDoS-resistance and privacy. These also vary depending on what capabilities are used, such as Mailserver, light node, and so on. -Scalability and UX +Scalability and UX Bandwidth usage: In version 1 of Status, bandwidth usage is likely to be an issue. In Status version 1.1 this is partially addressed with Waku usage, see the theoretical scaling model. @@ -31643,7 +28003,7 @@ and having too many light nodes can cause propagation probability that is too lo See Whisper vs PSS for more and a possible Kademlia based alternative. Lack of incentives: Status currently lacks incentives to run nodes, which means node operators are more likely to create centralized choke points. -Privacy +Privacy Light node privacy: The main privacy concern with light nodes is that directly connected peers will know that a message originates from them (as it are the only ones it sends). This means nodes can make assumptions about what messages (topics) their peers are interested in. Bloom filter privacy: @@ -31656,19 +28016,19 @@ though the trade-off space is likely suboptimal in terms of the Spam resistance +Spam resistance PoW bad for heterogeneous devices: Proof of work is a poor spam prevention mechanism. A mobile device can only have a very low PoW in order not to use too much CPU / burn up its phone battery. This means someone can spin up a powerful node and overwhelm the network. Mailserver trusted connection: A Mailserver has a direct TCP connection, which means they are trusted to send traffic. This means a malicious or malfunctioning Mailserver can overwhelm an individual node. -Censorship resistance +Censorship resistance Devp2p TCP port blockable: By default Devp2p runs on port 30303, which is not commonly used for any other service. This means it is easy to censor, e.g. airport WiFi. This can be mitigated somewhat by running on e.g. port 80 or 443, but there are still outstanding issues. See libp2p and Tor's Pluggable Transport for how this can be improved. See https://github.com/status-im/status-mobile/issues/6351 for some discussion. Acknowledgments Jacek Sieka -Changelog -Version 0.3 +Changelog +Version 0.3 Released May 22, 2020 Added that Waku SHOULD be used @@ -31676,9 +28036,9 @@ though the trade-off space is likely suboptimal in terms of the Copyright +Copyright Copyright and related rights waived via CC0. -References +References Protobuf Discv5 @@ -31714,25 +28074,34 @@ though the trade-off space is likely suboptimal in terms of the Status mobile Status mobile issue 6351 - -title: Dapp browser API usage -name: Dapp browser API usage -status: deprecated -description: This document describes requirements that an application must fulfill in order to provide a proper environment for Dapps running inside a browser. -editor: Filip Dimitrijevic filip@status.im -contributors: -Abstract +Dapp browser API usage + + +NameDapp browser API usage +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) + + +Abstract This document describes requirements that an application must fulfill in order to provide a proper environment for Dapps running inside a browser. A description of the Status Dapp API is provided, along with an overview of bidirectional communication underlying the API implementation. The document also includes a list of EIPs that this API implements. -Definitions +Definitions TermDescription WebviewPlatform-specific browser core implementation. Ethereum ProviderA JS object (window.ethereum) injected into each web page opened in the browser providing web3 compatible provider. BridgeA set of facilities allow bidirectional communication between JS code and the application. -Overview +Overview The application should expose an Ethereum Provider object (window.ethereum) to JS code running inside the browser. It is important to have the window.ethereum object available before the page loads, otherwise Dapps might not work correctly. Additionally, the browser component should also provide bidirectional communication between JS code and the application. @@ -31741,7 +28110,7 @@ It is important to have the window.ethereum object available before Properties isStatus Returns true. Can be used by the Dapp to find out whether it's running inside Status. -status +status Returns a StatusAPI object. For now it supports one method: getContactCode that sends a contact-code request to Status. Methods isConnected @@ -31790,14 +28159,14 @@ Thus it is possible to inject a function call passing Status node response back EIP1102: eth_requestAccounts support EIP1193: connect, disconnect, chainChanged, and accountsChanged event support is not implemented -Changelog +Changelog VersionComment 0.1.0Initial Release -Copyright +Copyright Copyright and related rights waived via CC0. -References +References Ethereum JS API docs EIP1102 @@ -31808,17 +28177,26 @@ Thus it is possible to inject a function call passing Status node response back webview.js docs - -title: EIPS -name: EIPS -status: deprecated -description: Status relation with the EIPs -editor: Ricardo Guilherme Schmidt ricardo3@status.im -contributors: - -Abstract +EIPS + + +NameEIPS +Statusdeprecated +EditorRicardo Guilherme Schmidt <ricardo3@status.im> +ContributorsNone + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) + + +Abstract This specification describes how Status relates with EIPs. -Introduction +Introduction Status should follow all standards as possible. Whenever the Status app needs a feature, it should be first checked if there is a standard for that, if not, Status should propose a standard. @@ -31983,9 +28361,9 @@ Description: Allows the storing and retrieving of nodes through merkle trees sto Used for: Finding Waku nodes. Related: - Sourcecode: - -Copyright +Copyright Copyright and related rights waived via CC0. -References +References BIP32 - Hierarchical Deterministic Wallets BIP39 - Mnemonic code for generating deterministic keys @@ -32041,18 +28419,27 @@ Sourcecode: - EIP1581 Source Code EIP1459 - Node Discovery via DNS - -title: ETHEREUM-USAGE -name: Status interactions with the Ethereum blockchain -status: deprecated -description: All interactions that the Status client has with the Ethereum blockchain. -editor: Filip Dimitrijevic filip@status.im -contributors: -- Andrea Maria Piana andreap@status.im -Abstract +ETHEREUM-USAGE + + +NameStatus interactions with the Ethereum blockchain +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsAndrea Maria Piana <andreap@status.im> + + + +Timeline + +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) + + +Abstract This specification documents all the interactions that the Status client has with the Ethereum blockchain. -Background +Background All the interactions are made through JSON-RPC. Currently Infura is used. The client assumes high-availability, @@ -32203,9 +28590,9 @@ It is used in status to check if a token transfer was made to the user address.< ENS names are propagated through ChatMessage and ContactUpdate payload. A client SHOULD verify ens names against the public key of the sender on receiving the message against the ENS contract -Copyright +Copyright Copyright and related rights waived via CC0. -References +References Ethereum Developers JSON-RPC @@ -32217,18 +28604,24 @@ A client SHOULD verify ens names against the public key of the sender on receivi go-ethereum ENS Contract - -title: GROUP-CHAT -name: Group Chat -status: deprecated -description: This document describes the group chat protocol used by the Status application. -editor: Filip Dimitrijevic filip@status.im -contributors: +GROUP-CHAT + + +NameGroup Chat +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsAndrea Piana <andreap@status.im> + + + +Timeline -Andrea Piana andreap@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - -Abstract + +Abstract This document describes the group chat protocol used by the Status application. The node uses pairwise encryption among members so a message is exchanged between each participant, similarly to a one-to-one message. @@ -32341,25 +28734,31 @@ and no further message should be sent to them. Upon receiving this event a client MUST validate the chatId provided with the updates, MUST ensure that the author of the event is also the target of the event. If the event is valid a client MUST remove the member from the list of admins of the chat. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References PAYLOADS UUID - -title: IPFS-gateway-for-Sticker-Pack -name: IPFS gateway for Sticker Pack -status: deprecated -description: This specification describes how Status uses the IPFS gateway to store stickers. -editor: Filip Dimitrijevic filip@status.im -contributors: +IPFS-gateway-for-Sticker-Pack + + +NameIPFS gateway for Sticker Pack +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsGheorghe Pinzaru <gheorghe@status.im> + + + +Timeline -Gheorghe Pinzaru gheorghe@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - -Abstract + +Abstract This specification describes how Status uses the IPFS gateway to store stickers. The specification explores image format, @@ -32372,7 +28771,7 @@ and how an end user can see them inside the Status app. IPFSP2P network used to store and share data, in this case, the images for the stickerpack -Specification +Specification Image format Accepted image file types are PNG, JPG/JPEG and GIF, with a maximum allowed size of 300kb. @@ -32440,9 +28839,9 @@ This method will return an uint256 which is the id of the owned sti To buy a sticker pack call approveAndCall(address,uint256,bytes) where address is the address of buyer,uint256 is the price and third parameters bytes is the callback called if approved. In the callback, call buyToken(uint256,address,uint256), first parameter is sticker pack id, second buyers address, and the last is the price. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References ERC721 Token Standard Infura @@ -32450,20 +28849,26 @@ In the callback, call buyToken(uint256,address,uint256), first para EIP 1577 Sticker Market Specification - -title: Keycard Usage for Wallet and Chat Keys -name: Keycard Usage for Wallet and Chat Keys -status: deprecated -description: In this specification, we describe how Status communicates with Keycard to create, store and use multiaccount. -editor: Filip Dimitrijevic filip@status.im -contributors: +Keycard Usage for Wallet and Chat Keys + + +NameKeycard Usage for Wallet and Chat Keys +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsRoman Volosovskyi <roman@status.im> + + + +Timeline -Roman Volosovskyi roman@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - -Abstract + +Abstract In this specification, we describe how Status communicates with Keycard to create, store and use multiaccount. -Definitions +Definitions TermDescription Keycard Hardwallethttps://keycard.tech/docs/ @@ -32723,24 +29128,30 @@ params: When we create a regular multiaccount all its keys are stored on device and are encrypted via key which is derived from user's password. In case if account was created using keycard all keys are stored on the card and are retrieved from it during signing into multiaccount. When we create a regular multiaccount we also create a separate database for it and this database is encrypted using key which is derived from user's password. For a keycard account we use encryption-public-key (returned by status-im.hardwallet.card/get-keys/status-im.hardwallet.card/generate-and-load-keys) as a password. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References Keycard Hardwallet Documentation Keycard Codebase - -title: NOTIFICATIONS -name: Notifications -status: deprecated -description: A client should implement local notifications to offer notifications for any event in the app without the privacy cost and dependency on third party services. -editor: Filip Dimitrijevic filip@status.im -contributors: +NOTIFICATIONS + + +NameNotifications +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsEric Dvorsak <eric@status.im> + + + +Timeline -Eric Dvorsak eric@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - + Local Notifications A client should implement local notifications to offer notifications for any event in the app without the privacy cost and dependency on third party services. @@ -32766,32 +29177,36 @@ The system decides when the background updates are triggered and the heuristics Why is there no Push Notifications? Push Notifications, as offered by Apple and Google are a privacy concern, they require a centralized service that is aware of who the notification needs to be delivered to. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References None - -title: PAYLOADS -name: Payloads -status: deprecated -description: Payload of messages in Status, regarding chat and chat-related use cases. -editor: Filip Dimitrijevic filip@status.im -contributors: +PAYLOADS + + +NamePayloads +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsAdam Babik <adam@status.im>Andrea Maria Piana <andreap@status.im>Oskar Thorén <oskar@status.im> + + + +Timeline -Adam Babik adam@status.im -Andrea Maria Piana andreap@status.im -Oskar Thorén oskar@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - -Abstract + +Abstract This specification describes how the payload of each message in Status looks like. It is primarily centered around chat and chat-related use cases. The payloads aims to be flexible enough to support messaging but also cases described in the Status Whitepaper as well as various clients created using different technologies. -Introduction +Introduction This document describes the payload format and some special considerations. Payload wrapper The node wraps all payloads in a protobuf record: @@ -33064,16 +29479,16 @@ The details are in the Security Considerations -Changelog -Version 0.3 +Security Considerations +Changelog +Version 0.3 Released May 22, 2020 Added language to include Waku in all relevant places -Copyright +Copyright Copyright and related rights waived via CC0. -References +References Status Whitepaper protobuf record Protobuf @@ -33084,17 +29499,23 @@ The details are in the Lamport timestamps Group chats specs May 22, 2020 change commit - -title: PUSH-NOTIFICATION-SERVER -name: Push notification server -status: deprecated -description: Status provides a set of Push notification services that can be used to achieve this functionality. -editor: Filip Dimitrijevic filip@status.im -contributors: +PUSH-NOTIFICATION-SERVER + + +NamePush notification server +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsAndrea Maria Piana <andreap@status.im> + + + +Timeline -Andrea Maria Piana andreap@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - + Reason Push notifications for iOS devices and some Android devices can only be implemented by relying on APN service for iOS or Firebase. This is useful for Android devices that do not support foreground services @@ -33118,7 +29539,7 @@ The party releasing the app, Status in this case, needs to run its own Gorush instance A gorush instance MUST be publicly available, this will be used only by push notification servers. -Push notification server +Push notification server A push notification server used by clients to register for receiving and sending push notifications. Registering client A Status client that wants to receive push notifications @@ -33531,7 +29952,7 @@ nor the receiver to the server, but MAY result in missing push notifications as the propagation of the secret is left to the client. This can be mitigated by device syncing, but not completely addressed. -Security considerations +Security considerations If no anonymous mode is used, when registering with a push notification service a client discloses: The chat key @@ -33624,15 +30045,15 @@ But you can register with multiple servers (desktop, status, etc) if that's a co Can someone else (i.e not status) run this? Push notification servers can be run by anyone. Gorush can be run by anyone I take, but we are in charge of the certificate, so they would not be able to notify status-clients. -Changelog -Version 0.1 +Changelog +Version 0.1 Released Initial version -Copyright +Copyright Copyright and related rights waived via CC0. -References +References APN Service Background Execution on iOS @@ -33645,30 +30066,32 @@ but we are in charge of the certificate, so they would not be able to notify sta ENS Contract Payloads - -title: SECURE-TRANSPORT -name: Secure Transport -status: deprecated -description: This document describes how Status provides a secure channel between two peers, providing confidentiality, integrity, authenticity, and forward secrecy. -editor: Filip Dimitrijevic filip@status.im -contributors: +SECURE-TRANSPORT + + +NameSecure Transport +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsAndrea Maria Piana <andreap@status.im>Corey Petty <corey@status.im>Dean Eigenmann <dean@status.im>Oskar Thorén <oskar@status.im>Pedro Pombeiro <pedro@status.im> + + + +Timeline -Andrea Maria Piana andreap@status.im -Corey Petty corey@status.im -Dean Eigenmann dean@status.im -Oskar Thorén oskar@status.im -Pedro Pombeiro pedro@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - -Abstract + +Abstract This document describes how Status provides a secure channel between two peers, and thus provide confidentiality, integrity, authenticity and forward secrecy. It is transport-agnostic and works over asynchronous networks. It builds on the X3DH and Double Ratchet specifications, with some adaptations to operate in a decentralized environment. -Introduction +Introduction This document describes how nodes establish a secure channel, and how various conversational security properties are achieved. -Definitions +Definitions Perfect Forward Secrecy is a feature of specific key-agreement protocols @@ -33679,7 +30102,7 @@ Specifically, past messages cannot be decrypted by a third-party who manages to Secret channel describes a communication channel where Double Ratchet algorithm is in use. -Design Requirements +Design Requirements Confidentiality: The adversary should not be able to learn what data is being exchanged between two Status clients. Authenticity: The adversary should not be able to cause either endpoint of a Status 1:1 chat @@ -33905,7 +30328,7 @@ containing a map of DirectMessageProtocol indexed by installa - otherwise, payload encrypted with output key of DH exchange (no Perfect Forward Secrecy). -Security Considerations +Security Considerations The same considerations apply as in section 4 of the X3DH spec and section 6 of the Double Ratchet spec, with some additions detailed below. +Timeline -Adam Babik adam@status.im -Oskar Thorén oskar@status.im -Samuel Hawksby-Robinson samuel@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - -Abstract + +Abstract Being mostly offline is an intrinsic property of mobile clients. They need to save network transfer and battery consumption to avoid spending too much money or constant charging. Waku protocol, on the other hand, is an online protocol. @@ -34228,7 +30655,7 @@ it SHOULD handle P2P Request Complete code (0x7d). This code is fol If Cursor is not empty, it means that not all messages were sent due to the set Limit in the request. One or more consecutive requests MAY be sent with Cursor field filled in order to receive the rest of the messages. -Security considerations +Security considerations Confidentiality The node encrypts all Waku envelopes. A Mailserver node can not inspect their contents. Altruistic and centralized operator risk @@ -34248,8 +30675,8 @@ when it is online as well as many metadata like IP address. Denial-of-service Since a Mailserver is delivering expired envelopes and has a direct TCP connection with the recipient, the recipient is vulnerable to DoS attacks from a malicious Mailserver node. -Changelog -Version 0.1 +Changelog +Version 0.1 Released May 22, 2020 Created document @@ -34257,27 +30684,30 @@ the recipient is vulnerable to DoS attacks from a malicious MailserverChange to keep Mailserver term consistent Replaced Whisper references with Waku -Copyright +Copyright Copyright and related rights waived via CC0. -References +References May 22, 2020 change commit - -title: WAKU-USAGE -name: Waku Usage -status: deprecated -description: Status uses Waku to provide privacy-preserving routing and messaging on top of devP2P. -editor: Filip Dimitrijevic filip@status.im -contributors: +WAKU-USAGE + + +NameWaku Usage +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsAdam Babik <adam@status.im>Corey Petty <corey@status.im>Oskar Thorén <oskar@status.im>Samuel Hawksby-Robinson <samuel@status.im> + + + +Timeline -Adam Babik adam@status.im -Corey Petty corey@status.im -Oskar Thorén oskar@status.im -Samuel Hawksby-Robinson samuel@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - -Abstract + +Abstract Status uses Waku to provide privacy-preserving routing and messaging on top of devP2P. Waku uses topics to partition its messages, @@ -34322,7 +30752,7 @@ Hence, all clients MUST use the following Whisper node settings: proof-of-work requirement not larger than 0.000002 for payloads greater than or equal to 50,000 bytes time-to-live not lower than 10 (in seconds) -Status +Status Handshake is a RLP-encoded packet sent to a newly connected peer. It MUST start with a Status Code (0x00) and follow up with items: [ [ pow-requirement-key pow-requirement ] @@ -34542,8 +30972,8 @@ To move further back in time, use cursor and limit.Boolean - returns true if the request was sent. The above topics is then converted into a bloom filter and then and sent to the Mailserver. -Changelog -Version 0.1 +Changelog +Version 0.1 Released May 22, 2020 Created document @@ -34570,9 +31000,9 @@ To move further back in time, use cursor and limit. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References Waku WAKU1 @@ -34586,19 +31016,24 @@ To move further back in time, use cursor and limit.Key Change #3 Key Change #4 - -title: WHISPER-MAILSERVER -name: Whisper mailserver -status: deprecated -description: Whisper Mailserver is a Whisper extension that allows to store messages permanently and deliver them to the clients even though they are already not available in the network and expired. -editor: Filip Dimitrijevic filip@status.im -contributors: +WHISPER-MAILSERVER + + +NameWhisper mailserver +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsAdam Babik <adam@status.im>Oskar Thorén <oskar@status.im> + + + +Timeline -Adam Babik adam@status.im -Oskar Thorén oskar@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - -Abstract + +Abstract Being mostly offline is an intrinsic property of mobile clients. They need to save network transfer and battery consumption to avoid spending too much money or constant charging. @@ -34655,7 +31090,7 @@ it SHOULD handle P2P Request Complete code (0x7d). This code is fol Cursor: an array of a cursor returned from the previous request (optional) If Cursor is not empty, it means that not all messages were sent due to the set Limit in the request. One or more consecutive requests MAY be sent with Cursor field filled in order to receive the rest of the messages. -Security considerations +Security considerations Confidentiality The node encrypts all Whisper envelopes. A Mailserver node can not inspect their contents. Altruistic and centralized operator risk @@ -34676,15 +31111,15 @@ when it is online as well as many metadata like IP address. Denial-of-service Since a Mailserver is delivering expired envelopes and has a direct TCP connection with the recipient, the recipient is vulnerable to DoS attacks from a malicious Mailserver node. -Changelog -Version 0.3 +Changelog +Version 0.3 Released May 22, 2020 Change to keep Mailserver term consistent -Copyright +Copyright Copyright and related rights waived via CC0. -References +References Whisper EIP-627 @@ -34695,21 +31130,24 @@ the recipient is vulnerable to DoS attacks from a malicious MailserverWaku V1 May 22, 2020 change commit - -title: WHISPER-USAGE -name: Whisper Usage -status: deprecated -description: Status uses Whisper to provide privacy-preserving routing and messaging on top of devP2P. -editor: Filip Dimitrijevic filip@status.im -contributors: +WHISPER-USAGE + + +NameWhisper Usage +Statusdeprecated +EditorFilip Dimitrijevic <filip@status.im> +ContributorsAdam Babik <adam@status.im>Andrea Piana <andreap@status.im>Corey Petty <corey@status.im>Oskar Thorén <oskar@status.im> + + + +Timeline -Adam Babik adam@status.im -Andrea Piana andreap@status.im -Corey Petty corey@status.im -Oskar Thorén oskar@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-04-29 — 614348a — Status deprecated update2 (#134) - -Abstract + +Abstract Status uses Whisper to provide privacy-preserving routing and messaging on top of devP2P. Whisper uses topics to partition its messages, @@ -34993,16 +31431,16 @@ To move further back in time, use cursor and limit.Boolean - returns true if the request was sent. The above topics is then converted into a bloom filter and then and sent to the Mailserver. -Changelog -Version 0.3 +Changelog +Version 0.3 Released May 22, 2020 Added Whisper / Waku Bridging section Change to keep Mailserver term consistent -Copyright +Copyright Copyright and related rights waived via CC0. -References +References Whisper WHISPER-MAILSERVER @@ -35048,6 +31486,7 @@ To move further back in time, use cursor and limit. +
title: CODEX-BLOCK-EXCHANGE -name: Codex Block Exchange Protocol -status: raw -category: Standards Track -tags: codex, block-exchange, p2p, data-distribution -editor: Codex Team -contributors:
b1a5783
d03e699
b2f3564
63107d3
This specification contains a mix of:
slug: codex-marketplace -title: CODEX-MARKETPLACE -name: Codex Storage Marketplace -status: raw -category: Standards Track -tags: codex, storage, marketplace, smart-contract -editor: Codex Team and Dmitriy Ryajov dryajov@status.im -contributors:
d2df7e0
Codex Marketplace and its interactions are defined by a smart contract deployed on an EVM-compatible blockchain. This specification describes these interactions for the various roles within the network.
The document is intended for implementors of Codex nodes.
Early-stage Codex specifications collected before reaching draft status.
NOTE: This repo is WIP. We are currently restructuring the RFC process.
This repository contains specifications from the Waku, Nomos, -Codex, and -Status projects that are part of the IFT portfolio. -Vac is an -IFT service that will manage the RFC, -Request for Comments, -process within this repository.
This repository replaces the previous rfc.vac.dev resource. -Each project will maintain initial specifications in separate repositories, -which may be considered as a raw specification. -All Vac raw specifications and -discussions will live in the Vac subdirectory. -When projects have reached some level of maturity -for a specification living in their repository, -the process of updating the status to draft may begin in this repository. -Specifications will adhere to -1/COSS before obtaining draft status.
rfc.vac.dev
Implementations should follow specifications as described, -and all contributions will be discussed before the stable status is obtained. -The goal of this RFC process will to engage all interseted parities and -reach a rough consensus for techcinal specifications.
Please see 1/COSS for general guidelines and specification lifecycle.
Feel free to join the Vac discord.
Here's the project board used by core contributors and maintainers: Projects
The repository for each project raw specifications:
An IETF-style index of Vac-managed RFCs across Waku, Nomos, Codex, and Status. Use the filters below to jump straight to a specification.
JavaScript is required to load the RFC index table.
title: CONSENSUS-CLARO -name: Claro Consensus Protocol -status: deprecated -category: Standards Track -tags:
1ddddc7
3ab314d
f52c54f
01e2781
This document specifies Claro: a Byzantine, fault-tolerant, binary decision agreement algorithm that utilizes bounded memory for its execution. @@ -852,11 +856,11 @@ Move: a Language for Writing DAG Abstractions
Deprecated Nomos specifications kept for archival and reference purposes.
Early-stage Nomos specifications that have not yet progressed beyond raw status.
title: NOMOSDA-ENCODING -name: NomosDA Encoding Protocol -status: raw -category: -tags: data-availability -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors:
39d6f07
This document describes the encoding and verification processes of NomosDA, which is the data availability (DA) solution used by the Nomos blockchain. NomosDA provides an assurance that all data from Nomos blobs are accessible and verifiable by every network participant.
This document presents an implementation specification describing how:
title: NOMOS-DA-NETWORK -name: NomosDA Network -status: raw -category: -tags: network, data-availability, da-nodes, executors, sampling -editor: Daniel Sanchez Quiros danielsq@status.im -contributors:
51ef4cd
NomosDA is the scalability solution protocol for data availability within the Nomos network. This document delineates the protocol's structure at the network level, @@ -447,6 +449,7 @@ ensures the overlay node distribution is scalable for networks of any size.
title: P2P-HARDWARE-REQUIREMENTS -name: Nomos p2p Network Hardware Requirements Specification -status: raw -category: infrastructure -tags: [hardware, requirements, nodes, validators, services] -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors:
34bbd7a
This specification defines the hardware requirements for running various types of Nomos blockchain nodes. Hardware needs vary significantly based on the node's role, from lightweight verification nodes to high-performance Zone Executors. The requirements are designed to support diverse participation levels while ensuring network security and performance.
title: P2P-NAT-SOLUTION -name: Nomos P2P Network NAT Solution Specification -status: raw -category: networking -tags: [nat, traversal, autonat, upnp, pcp, nat-pmp] -editor: Antonio Antonino antonio@status.im -contributors:
cfb3b78
This specification defines a comprehensive NAT (Network Address Translation) traversal solution for the Nomos P2P network. The solution enables nodes to automatically determine their NAT status and establish both outbound and inbound connections regardless of network configuration. The strategy combines AutoNAT, dynamic port mapping protocols, and continuous verification to maximize public reachability while maintaining decentralized operation.
title: P2P-NETWORK-BOOTSTRAPPING -name: Nomos P2P Network Bootstrapping Specification -status: raw -category: networking -tags: [p2p, networking, bootstrapping, peer-discovery, libp2p] -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors:
aa8a3b0
Nomos network bootstrapping is the process by which a new node discovers peers and synchronizes with the existing decentralized network. It ensures that a node can:
title: NOMOS-P2P-NETWORK -name: Nomos P2P Network Specification -status: draft -category: networking -tags: [p2p, networking, libp2p, kademlia, gossipsub, quic] -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors:
a3a5b91
This specification defines the peer-to-peer (P2P) network layer for Nomos blockchain nodes. The network serves as the comprehensive communication infrastructure enabling transaction dissemination through mempool and block propagation. The specification leverages established libp2p protocols to ensure robust, scalable performance with low bandwidth requirements and minimal latency while maintaining accessibility for diverse hardware configurations and network environments.
title: NOMOS-SDP -name: Nomos Service Declaration Protocol Specification -status: raw -category: -tags: participation, validators, declarations -editor: Marcin Pawlowski marcin@status.im -contributors:
53dfb97
This document defines a mechanism enabling validators to declare their participation in specific protocols that require a known and agreed-upon list of participants. Some examples of this are Data Availability and the Blend Network. We create a single repository of identifiers which is used to establish secure communication between validators and provide services. Before being admitted to the repository, the validator proves that it locked at least a minimum stake.
nonce
Vac builds public good protocols for the decentralised web. +Vac acts as a custodian for the protocols that live in the RFC-Index repository. +With the goal of widespread adoption, +Vac will make sure the protocols adhere to a set of principles, +including but not limited to liberty, security, privacy, decentralisation and inclusivity.
To learn more, visit Vac Research
dd397ad
d5e0072
ed2c68f
3eaccf9
990d940
6495074
bab16a8
a9162f2
slug: 1 -title: 1/COSS -name: Consensus-Oriented Specification System -status: draft -category: Best Current Practice -editor: Daniel Kaiser danielkaiser@status.im -contributors:
This document describes a consensus-oriented specification system (COSS) for building interoperable technical specifications. COSS is based on a lightweight editorial process that @@ -489,24 +509,35 @@ Color coded specifications SHOULD use the following color scheme:
slug: 2 -title: 2/MVDS -name: Minimum Viable Data Synchronization -status: stable -editor: Sanaz Taheri sanaz@status.im -contributors:
a5b24ac
0253d53
70326d1
472a7fd
4362a7b
In this specification, we describe a minimum viable protocol for -data synchronization inspired by the Bramble Synchronization Protocol1. +data synchronization inspired by the Bramble Synchronization Protocol (BSP). This protocol is designed to ensure reliable messaging between peers across an unreliable peer-to-peer (P2P) network where they may be unreachable or unresponsive.
We present a reference implementation2 +
We present a reference implementation1 including a simulation to demonstrate its performance.
MESSAGE
Copyright and related rights waived via CC0.
akwizgran et al. BSP. Briar.
https://github.com/vacp2p/mvds
slug: 3 -title: 3/REMOTE-LOG -name: Remote log specification -status: draft -editor: Oskar Thorén oskarth@titanproxy.com -contributors:
3fd8b5a
dce61fe
A remote log is a replication of a local log. This means a node can read data that originally came from a node that is offline.
This specification is complemented by a proof of concept implementation1.
https://github.com/vacp2p/research/tree/master/remote_log
slug: 4 -title: 4/MVDS-META -name: MVDS Metadata Field -status: draft -editor: Sanaz Taheri sanaz@status.im -contributors:
3a396b5
2e80c3b
In this specification, we describe a method to construct message history that will aid the consistency guarantees of 2/MVDS. Additionally, @@ -907,13 +951,25 @@ As their delivery is not needed to be guaranteed.
2eaa794
a3ad14e
25/LIBP2P-DNS-DISCOVERY specifies a scheme to implement libp2p peer discovery via DNS for Waku v2. The generalised purpose is to retrieve an arbitrarily long, authenticated, @@ -1024,22 +1080,30 @@ and verify that the content matches the hash.
25/LIBP2P-DNS-DISCOVERY
libp2p
slug: 32 -title: 32/RLN-V1 -name: Rate Limit Nullifier -status: draft -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors:
eb25cd0
cbefa48
94db406
a23299f
539575b
The following specification covers the RLN construct as well as some auxiliary libraries useful for interacting with it. @@ -1695,14 +1759,24 @@ assert!(verified);
All Vac specifications that have not reached draft status will live in this repository. To learn more about raw specifications, take a look at 1/COSS.
f051117
This document specifies a scalable, decentralized, and Byzantine Fault Tolerant (BFT) consensus mechanism inspired by Hashgraph, designed for binary decision-making in P2P networks.
517b639
c655980
7e3a625
This document introduces a decentralized group messaging protocol using Ethereum adresses as identifiers. @@ -2630,15 +2717,25 @@ opens the door to some novel research.
title: ETH-MLS-OFFCHAIN -name: Secure channel setup using decentralized MLS and Ethereum accounts -status: raw -category: Standards Track -tags: -editor: Ugur Sen ugur@status.im -contributors: seemenkina ekaterina@status.im
e39d288
3b968cc
The following document specifies Ethereum authenticated scalable and decentralized secure group messaging application by @@ -3006,14 +3103,32 @@ This design choice is intentional, in order to preserve the efficiency advantage
13aaae3
e234e9d
b842725
f2e1b4c
22bb331
5b8ce46
The need for secure communications has become paramount. Traditional centralized messaging protocols are susceptible to various security threats, @@ -3904,14 +4019,32 @@ control mechanisms to restrict who can call the set and get functions.
36caaa6
db90adc
The content of this specification has been split between ETH-DEMLS and NOISE-X3DH-RATCHET @@ -5101,14 +5234,26 @@ the prospective key package has not been already used.
99be3b9
cd8c9f4
0db60c1
This document extends the libp2p gossipsub specification specifying gossipsub Tor Push, @@ -5277,15 +5422,24 @@ For the best protection, these contexts should run on separate physical machines
title: LOGOS-CAPABILITY-DISCOVERY -name: Logos Capability Discovery Protocol -status: raw -category: Standards Track -tags: -editor: Arunima Chaudhuri arunima@status.im -contributors: Ugur Sen ugur@status.im
aaf158a
Note: This specification is currently a WIP and undergoing a high rate of changes.
ad
dabc317
4f54254
7f1df32
e742cd5
9d11a22
36be428
5e3b478
38fce27
7f5276e
The Mix Protocol defines a decentralized anonymous message routing layer for libp2p networks. It enables sender anonymity by routing each message through a decentralized mix overlay network composed of participating libp2p nodes, known as mix nodes. @@ -7466,14 +7639,24 @@ However, these protections do not prevent adversaries from injecting large volum
DoS protection—such as admission control, rate-limiting, or resource-bound access—MUST be implemented outside the core protocol. Any such mechanism MUST preserve sender unlinkability and SHOULD be evaluated carefully to avoid introducing correlation risks.
Defending against large-scale DoS attacks is considered a deployment-level responsibility and is out of scope for this specification.
The need for secure communications has become paramount. This specification outlines a protocol describing a @@ -7748,14 +7931,27 @@ communication.
860bae2
3f722d9
ea62398
This spec integrates Interep into the RLN spec. @@ -7861,16 +8057,25 @@ previously in proof verification.
title: RLN-STEALTH-COMMITMENTS -name: RLN Stealth Commitment Usage -category: Standards Track -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors:
0b0e00f
This specification describes the usage of stealth commitments to add prospective users to a network-governed @@ -7965,16 +8170,26 @@ which also includes a test to generate a stealth commitment for a given user.
title: RLN-V2 -name: Rate Limit Nullifier V2 -status: raw -editor: Rasul Ibragimov curryrasul@gmail.com -contributors:
8342636
d7e84b4
The protocol specified in this document is an improvement of 32/RLN-V1, being more general construct, that allows to set various limits for an epoch @@ -8155,16 +8370,34 @@ this spec inherits all the security considerations of 2
title: SDS -name: Scalable Data Sync protocol for distributed logs -status: raw -editor: Hanno Cornelius hanno@status.im -contributors:
6980237
171e934
6672c5b
b1da703
3505da6
536d31b
8ee2a6d
235c1d5
7182459
7a01711
08b363d
bee78c4
This specification introduces the Scalable Data Sync (SDS) protocol to achieve end-to-end reliability @@ -8590,16 +8823,17 @@ if there are any eligible items in the outgoing repair request buffer, regardless of whether other participants have also recently broadcast a Periodic Sync message.
This section contains meta info about writing RFCs. This section (including its subsections) MUST be removed.
COSS explains the Vac RFC process.
Contributors can visit Waku RFCs for new Waku specifications under discussion.
slug: 10 -title: 10/WAKU2 -name: Waku v2 -status: draft -editor: Hanno Cornelius hanno@status.im -contributors:
Core Waku protocol specifications, including messaging, peer discovery, and network primitives.
34aa3f3
cafa04f
ff87c84
8e14d58
6cf68fd
6734b16
356649a
550238c
eef961b
d6651b7
6e98666
9b740d8
330c35b
Waku is a family of modular peer-to-peer protocols for secure communication. The protocols are designed to be secure, privacy-preserving, censorship-resistant @@ -9223,581 +9476,30 @@ for more details on this piece of work.
21/WAKU2-FAULT-TOLERANT-STORE
Waku is a family of modular peer-to-peer protocols for secure communication. -The protocols are designed to be secure, privacy-preserving, censorship-resistant -and being able to run in resource-restricted environments. -At a high level, it implements Pub/Sub over libp2p -and adds a set of capabilities to it. -These capabilities are things such as: -(i) retrieving historical messages for mostly-offline devices -(ii) adaptive nodes, allowing for heterogeneous nodes to contribute to the network -(iii) preserving bandwidth usage for resource-restriced devices
This makes Waku ideal for running a p2p protocol on mobile devices and -other similar restricted environments.
Historically, it has its roots in 6/WAKU1, -which stems from Whisper, -originally part of the Ethereum stack. -However, Waku acts more as a thin wrapper for Pub/Sub and has a different API. -It is implemented in an iterative manner where initial focus -is on porting essential functionality to libp2p. -See rough road map (2020) for more historical context.
Waku, as a family of protocols, is designed to have a set of properties -that are useful for many applications:
1.Useful for generalized messaging.
Many applications require some form of messaging protocol to communicate -between different subsystems or different nodes. -This messaging can be human-to-human, machine-to-machine or a mix. -Waku is designed to work for all these scenarios.
2.Peer-to-peer.
Applications sometimes have requirements that make them suitable -for peer-to-peer solutions:
3.Runs anywhere.
Applications often run in restricted environments, -where resources or the environment is restricted in some fashion. -For example:
4.Privacy-preserving.
Applications often have a desire for some privacy guarantees, such as:
5.Modular design.
Applications often have different trade-offs when it comes to what properties they -and their users value. -Waku is designed in a modular fashion where an application protocol or -node can choose what protocols they run. -We call this concept adaptive nodes.
For example:
For more on the concept of adaptive nodes and what this means in practice, -please see the 30/ADAPTIVE-NODES spec.
The keywords “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, -“SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and -“OPTIONAL” in this document are to be interpreted as described in 2119.
While Waku is best thought of as a single cohesive thing, -there are three network interaction domains:
(a) gossip domain -(b) discovery domain -(c) request/response domain
Since Waku is built on top of libp2p, many protocols have a libp2p protocol identifier. -The current main protocol identifiers -are:
/vac/waku/relay/2.0.0
/vac/waku/store-query/3.0.0
/vac/waku/filter/2.0.0-beta1
/vac/waku/lightpush/2.0.0-beta1
This is in addition to protocols that specify messages, payloads, and -recommended usages. -Since these aren't negotiated libp2p protocols, -they are referred to by their RFC ID. -For example:
There are also more experimental libp2p protocols such as:
/vac/waku/waku-rln-relay/2.0.0-alpha1
/vac/waku/peer-exchange/2.0.0-alpha1
The semantics of these protocols are referred to by RFC ID 17/WAKU2-RLN-RELAY and 34/WAKU2-PEER-EXCHANGE.
Unless otherwise specified, -all protocols are implemented over libp2p and use Protobuf by default. -Since messages are exchanged over a bi-directional binary stream, -as a convention, -libp2p protocols prefix binary message payloads with -the length of the message in bytes. -This length integer is encoded as a protobuf varint.
Waku is using gossiping to disseminate messages throughout the network.
Protocol identifier: /vac/waku/relay/2.0.0
See 11/WAKU2-RELAY specification for more details.
For an experimental privacy-preserving economic spam protection mechanism, -see 17/WAKU2-RLN-RELAY.
See 23/WAKU2-TOPICS -for more information about the recommended topic usage.
In addition to /vac/waku/* protocols, -Waku MAY directly use the following libp2p protocols:
/vac/waku/*
/ipfs/ping/1.0.0 -
for liveness checks between peers, or -to keep peer-to-peer connections alive.
/ipfs/id/1.0.0 -
and
/ipfs/id/push/1.0.0 -
respectively, as basic means for capability discovery. -These protocols are anyway used by the libp2p connection -establishment layer Waku is built on. -We plan to introduce a new Vac capability discovery protocol -with better anonymity properties and more functionality.
Waku is built in top of libp2p, and like libp2p it strives to be transport agnostic. -We define a set of recommended transports in order to achieve a baseline of -interoperability between clients. -This section describes these recommended transports.
Waku client implementations SHOULD support the TCP transport. -Where TCP is supported it MUST be enabled for both dialing and listening, -even if other transports are available.
Waku nodes running in environments that do not allow the use of TCP directly, -MAY use other transports.
A Waku node SHOULD support secure websockets for bidirectional communication streams, -for example in a web browser context.
A node MAY support unsecure websockets if required by the application or -running environment.
Waku can retrieve a list of nodes to connect to using DNS-based discovery -as per EIP-1459. -While this is a useful way of bootstrapping connection to a set of peers, -it MAY be used in conjunction with an ambient peer discovery -procedure to find other nodes to connect to, -such as Node Discovery v5. -It is possible to bypass the discovery domain by specifying static nodes.
WAKU2-ENR -describes the usage of EIP-778 ENR (Ethereum Node Records) -for Waku discovery purposes. -It introduces two new ENR fields, multiaddrs and -waku2, that a Waku node MAY use for discovery purposes. -These fields MUST be used under certain conditions, as set out in the specification. -Both EIP-1459 DNS-based discovery and Node Discovery v5 operate on ENR, -and it's reasonable to expect even wider utility for ENR in Waku networks in the future.
multiaddrs
waku2
In addition to the Gossip domain, -Waku provides a set of request/response protocols. -They are primarily used in order to get Waku to run in resource restricted environments, -such as low bandwidth or being mostly offline.
Protocol identifier*: /vac/waku/store-query/3.0.0
This is used to fetch historical messages for mostly offline devices. -See 13/WAKU2-STORE spec specification for more details.
There is also an experimental fault-tolerant addition to the store protocol -that relaxes the high availability requirement. -See 21/WAKU2-FAULT-TOLERANT-STORE
Protocol identifier*: /vac/waku/filter/2.0.0-beta1
This is used to preserve more bandwidth when fetching a subset of messages. -See 12/WAKU2-FILTER specification for more details.
Protocol identifier*: /vac/waku/lightpush/2.0.0-beta1
This is used for nodes with short connection windows and -limited bandwidth to publish messages into the Waku network. -See 19/WAKU2-LIGHTPUSH specification for more details.
The above is a non-exhaustive list, -and due to the modular design of Waku, -there may be other protocols here that provide a useful service to the Waku network.
See the sequence diagram below for an overview of how different protocols interact.
We have six nodes, A-F. -The protocols initially mounted are indicated as such. -The PubSub topics pubtopic1 and -pubtopic2 is used for routing and -indicates that it is subscribed to messages on that topic for relay, -see 11/WAKU2-RELAY for details. -Ditto for 13/WAKU2-STORE -where it indicates that these messages are persisted on that node.
pubtopic1
pubtopic2
Node A creates a WakuMessage msg1 with a ContentTopic contentTopic1. -See 14/WAKU2-MESSAGE for more details. -If WakuMessage version is set to 1, -we use the 6/WAKU1 compatible data field with encryption. -See 7/WAKU-DATA for more details.
msg1
contentTopic1
data
Node F requests to get messages filtered by PubSub topic pubtopic1 and -ContentTopic contentTopic1. -Node D subscribes F to this filter and -will in the future forward messages that match that filter. -See 12/WAKU2-FILTER for more details.
Node A publishes msg1 on pubtopic1 and -subscribes to that relay topic. -It then gets relayed further from B to D, but -not C since it doesn't subscribe to that topic. -See 11/WAKU2-RELAY.
Node D saves msg1 for possible later retrieval by other nodes. -See 13/WAKU2-STORE.
Node D also pushes msg1 to F, -as it has previously subscribed F to this filter. -See 12/WAKU2-FILTER.
At a later time, Node E comes online. -It then requests messages matching pubtopic1 and -contentTopic1 from Node D. -Node D responds with messages meeting this (and possibly other) criteria. -See 13/WAKU2-STORE.
6/WAKU1 and Waku are different protocols all together. -They use a different transport protocol underneath; -6/WAKU1 is devp2p RLPx based while Waku uses libp2p. -The protocols themselves also differ as does their data format. -Compatibility can be achieved only by using a bridge -that not only talks both devp2p RLPx and libp2p, -but that also transfers (partially) the content of a packet from one version -to the other.
See 15/WAKU-BRIDGE for details on a bidirectional bridge mode.
Each protocol layer of Waku provides a distinct service and -is associated with a separate set of security features and concerns. -Therefore, the overall security of Waku -depends on how the different layers are utilized. -In this section, -we overview the security properties of Waku protocols -against a static adversarial model which is described below. -Note that a more detailed security analysis of each Waku protocol -is supplied in its respective specification as well.
In the primary adversarial model, -we consider adversary as a passive entity that attempts to collect information -from others to conduct an attack, -but it does so without violating protocol definitions and instructions.
The following are not considered as part of the adversarial model:
Waku by default guarantees pseudonymity for all of the protocol layers -since parties do not have to disclose their true identity -and instead they utilize libp2p PeerID as their identifiers. -While pseudonymity is an appealing security feature, -it does not guarantee full anonymity since the actions taken under the same pseudonym -i.e., PeerID can be linked together and -potentially result in the re-identification of the true actor.
PeerID
At a high level, -anonymity is the inability of an adversary in linking an actor -to its data/performed action (the actor and action are context-dependent). -To be precise about linkability, -we use the term Personally Identifiable Information (PII) -to refer to any piece of data that could potentially -be used to uniquely identify a party. -For example, the signature verification key, and -the hash of one's static IP address are unique for each user and -hence count as PII. -Notice that users' actions can be traced through their PIIs -(e.g., signatures) and hence result in their re-identification risk. -As such, we seek anonymity by avoiding linkability between actions and -the actors / actors' PII. Concerning anonymity, Waku provides the following features:
Publisher-Message Unlinkability: -This feature signifies the unlinkability of a publisher -to its published messages in the 11/WAKU2-RELAY protocol. -The Publisher-Message Unlinkability -is enforced through the StrictNoSign policy due to which the data fields -of pubsub messages that count as PII for the publisher must be left unspecified.
StrictNoSign
Subscriber-Topic Unlinkability: -This feature stands for the unlinkability of the subscriber -to its subscribed topics in the 11/WAKU2-RELAY protocol. -The Subscriber-Topic Unlinkability -is achieved through the utilization of a single PubSub topic. -As such, subscribers are not re-identifiable from their subscribed topic IDs -as the entire network is linked to the same topic ID. -This level of unlinkability / anonymity is known as k-anonymity -where k is proportional to the system size (number of subscribers). -Note that there is no hard limit on the number of the pubsub topics, however, -the use of one topic is recommended for the sake of anonymity.
This property indicates that no adversary can flood the system -(i.e., publishing a large number of messages in a short amount of time), -either accidentally or deliberately, with any kind of message -i.e. even if the message content is valid or useful. -Spam protection is partly provided in 11/WAKU2-RELAY -through the scoring mechanism -provided for by GossipSub v1.1. -At a high level, -peers utilize a scoring function to locally score the behavior -of their connections and remove peers with a low score.
11/WAKU2-RELAY
Confidentiality can be addressed through data encryption whereas integrity and -authenticity are achievable through digital signatures. -These features are provided for in 14/WAKU2-MESSAGE (version 1)` -through payload encryption as well as encrypted signatures.
Lack of anonymity/unlinkability in the protocols involving direct connections -including 13/WAKU2-STORE and 12/WAKU2-FILTER protocols:
13/WAKU2-STORE
12/WAKU2-FILTER
The anonymity/unlinkability is not guaranteed in the protocols like 13/WAKU2-STORE -and 12/WAKU2-FILTER where peers need to have direct connections -to benefit from the designated service. -This is because during the direct connections peers utilize PeerID -to identify each other, -therefore the service obtained in the protocol is linkable -to the beneficiary's PeerID (which counts as PII). -For 13/WAKU2-STORE, -the queried node would be able to link the querying node's PeerID -to its queried topics. -Likewise, in the 12/WAKU2-FILTER, -a full node can link the light node's PeerIDs to its content filter.
There are multiple implementations of Waku and its protocols:
Below you can find an overview of the specifications that they implement -as they relate to Waku. -This includes Waku legacy specifications, as they are used for bridging between the two networks.
*js-waku implements 13/WAKU2-STORE as a querying node only. -**js-waku only implements 19/WAKU2-LIGHTPUSH requests.
To implement a minimal Waku client, -we recommend implementing the following subset in the following order:
b346ad2
0904a8b
8ff46fa
4c4591c
6874961
To get compatibility with Waku Legacy:
7/WAKU-DATA
For an interoperable keep-alive mechanism:
The following features are currently experimental, -under research and initial implementations:
Economic Spam Resistance:
We aim to enable an incentivized spam protection technique -to enhance 11/WAKU2-RELAY by using rate limiting nullifiers. -More details on this can be found in 17/WAKU2-RLN-RELAY. -In this advanced method, -peers are limited to a certain rate of messaging per epoch and -an immediate financial penalty is enforced for spammers who break this rate.
Prevention of Denial of Service (DoS) and Node Incentivization: -Denial of service signifies the case where an adversarial node -exhausts another node's service capacity (e.g., by making a large number of requests) -and makes it unavailable to the rest of the system. -DoS attack is to be mitigated through the accounting model as described in 18/WAKU2-SWAP. -In a nutshell, peers have to pay for the service they obtain from each other. -In addition to incentivizing the service provider, -accounting also makes DoS attacks costly for malicious peers. -The accounting model can be used in 13/WAKU2-STORE and -12/WAKU2-FILTER to protect against DoS attacks.
Additionally, this gives node operators who provide a useful service to the network -an incentive to perform that service. -See 18/WAKU2-SWAP -for more details on this piece of work.
libp2p specs
6/WAKU1
Whisper spec (EIP627)
Waku v2 plan
30/ADAPTIVE-NODES
Protocol Identifiers
14/WAKU2-MESSAGE
26/WAKU-PAYLOAD
23/WAKU2-TOPICS
27/WAKU2-PEERS
bi-directional binary stream
Protobuf varint encoding
11/WAKU2-RELAY spec
17/WAKU2-RLN-RELAY
EIP-1459
Ambient peer discovery
Node Discovery v5
WAKU2-ENR
EIP-778 ENR (Ethereum Node Records)
13/WAKU2-STORE spec
21/WAKU2-FT-STORE
19/WAKU2-LIGHTPUSH
15/WAKU-BRIDGE
k-anonymity
GossipSub v1.1
nim-waku (Nim)
go-waku (Go)
js-waku (NodeJS and Browser)
8/WAKU-MAIL
9/WAKU-RPC
16/WAKU2-RPC
18/WAKU2-SWAP spec
slug: 11 -title: 11/WAKU2-RELAY -name: Waku v2 Relay -status: stable -tags: waku-core -editor: Hanno Cornelius hanno@status.im -contributors:
11/WAKU2-RELAY specifies a Publish/Subscribe approach to peer-to-peer messaging with a strong focus on privacy, censorship-resistance, security and scalability. @@ -10040,10 +9742,10 @@ on behalf of the group as such the true signer is indistinguishable from other group members. -
10/WAKU2
slug: 12 -title: 12/WAKU2-FILTER -name: Waku v2 Filter -status: draft -tags: waku-core -version: 01 -editor: Hanno Cornelius hanno@status.im -contributors:
e8a3f8a
e4d8f27
046a3b7
57124a7
940d795
420adf1
previous versions: 00
Protocol identifiers:
/vac/waku/filter-push/2.0.0-beta1
This specification describes the 12/WAKU2-FILTER protocol, which enables a client to subscribe to a subset of real-time messages from a Waku peer. This is a more lightweight version of 11/WAKU2-RELAY, @@ -10134,7 +9845,7 @@ query for a recent time window, provided it is acceptable to do frequent polling
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in 2119.
Content filtering is a way to do message-based filtering. Currently the only content filter being applied is on contentTopic.
contentTopic
WakuFilter
Note that while using WakuFilter allows light nodes to save bandwidth, it comes with a privacy cost in the sense that they need to disclose their liking topics to the full nodes to retrieve the relevant messages. @@ -10360,10 +10071,10 @@ Examples of such 2PC protocols are Oblivious Transfers and one-way Private Set Intersections (PSI). -
slug: 13 -title: 13/WAKU2-STORE -name: Waku Store Query -status: draft -tags: waku-core -version: 01 -editor: Hanno Cornelius hanno@status.im -contributors:
1b8b2ac
a60a2c4
755be94
3baed07
51e2879
Previous version: 00
This specification explains the WAKU2-STORE protocol, which enables querying of 14/WAKU2-MESSAGEs.
WAKU2-STORE
slug: 14 -title: 14/WAKU2-MESSAGE -name: Waku v2 Message -status: stable -category: Standards Track -tags: waku/core-protocol -editor: Hanno Cornelius hanno@status.im -contributors:
8052808
8e70159
88df5d8
9cd48a8
10/WAKU2 is a family of modular peer-to-peer protocols for secure communication. These protocols are designed to be secure, privacy-preserving, @@ -10958,7 +10689,7 @@ message.timestamp = 0x175789bfa23f8400 message_hash = 0x483ea950cb63f9b9d6926b262bb36194d3f40a0463ce8446228350bd44e96de4 -
The level of confidentiality, integrity, and authenticity of the WakuMessage payload is discretionary. @@ -10985,9 +10716,9 @@ for network participants to behave correctly, this attribute is inherently insecure. A malicious actor can tamper with the value of a Waku message’s ephemeral attribute, and the receiver would not be able to verify the integrity of the message.
WakuMessage
ephemeral
c3d5fe6
d637b10
4bf2f6e
f883f26
This specification describes how 6/WAKU1 traffic can be used with 10/WAKU2 networks.
payload
contentFilter
topic
expiry
ttl
As mentioned above, a bridge will be posting new 6/WAKU1 envelopes, which requires doing the PoW nonce calculation.
slug: 17 -title: 17/WAKU2-RLN-RELAY -name: Waku v2 RLN Relay -status: draft -tags: waku-core -editor: Alvaro Revuelta alvaro@status.im -contributors:
776c1b7
5064ded
7b443c1
244ea55
7bcefac
1ed5919
4b3b4e3
This specification describes the 17/WAKU2-RLN-RELAY protocol, which is an extension of 11/WAKU2-RELAY to provide spam protection using Rate Limiting Nullifiers (RLN).
The acceptable_root_window_size should indicate how many blocks may have been mined during the time it takes for a peer to receive a message. This formula represents a lower bound of the number of acceptable roots.
acceptable_root_window_size
slug: 19 -title: 19/WAKU2-LIGHTPUSH -name: Waku v2 Light Push -status: draft -editor: Hanno Cornelius hanno@status.im -contributors:
c88680a
f9efd29
c90013b
Protocol identifier: /vac/waku/lightpush/2.0.0-beta1
Light nodes with short connection windows and limited bandwidth wish to publish messages into the Waku network. Additionally, @@ -11467,29 +11238,38 @@ or forward the PushRequest via 19/LIGHTPUSH on a Security Considerations +
PushRequest
Since this can introduce an amplification factor, it is RECOMMENDED for the node relaying to the rest of the network to take extra precautions. This can be done by rate limiting via 17/WAKU2-RLN-RELAY.
Note that the above is currently not fully implemented.
e4f5f28
This specification describes the usage of the ENR (Ethereum Node Records) format for 10/WAKU2 purposes. The ENR format is defined in EIP-778 [3].
true
slug: 33 -title: 33/WAKU2-DISCV5 -name: Waku v2 Discv5 Ambient Peer Discovery -status: draft -editor: Daniel Kaiser danielkaiser@status.im -contributors:
5971166
87d4ff7
dcc579c
38d68ce
b8f8d20
c6ef447
037474d
33/WAKU2-DISCV5 specifies a modified version of Ethereum's Node Discovery Protocol v5 as a means for ambient node discovery. @@ -11784,7 +11581,7 @@ as in go-waku. -
33/WAKU2-DISCV5
Implementations should limit the number of bucket entries that have the same network parameters (IP address / port) to mitigate Sybil attacks.
Properly protecting against eclipse attacks is challenging and raises research questions that we will address in future stages of our discv5 roadmap.
34/WAKU2-PEER-EXCHANGE
slug: 34 -title: 34/WAKU2-PEER-EXCHANGE -name: Waku2 Peer Exchange -status: draft -category: Standards Track -tags: waku/core-protocol -editor: Hanno Cornelius hanno@status.im -contributors:
2b297d5
This document specifies a simple request-response peer exchange protocol. Responders send information about a requested number of peers. The main purpose of this protocol is providing resource restricted devices with peers.
The peer exchange protocol specified in this document comes with anonymity and security implications. @@ -12015,9 +11820,9 @@ are not propagated in the relay domain. However, there might still be some form of leakage: ENRs could be used to track peers and facilitate linking attacks. We will investigate this further in our Waku anonymity analysis.
slug: 36 -title: 36/WAKU2-BINDINGS-API -name: Waku v2 C Bindings API -status: draft -tags: waku-core -editor: Richard Ramos richard@status.im -contributors:
cb56103
e9469d0
76e514a
6bd686d
Native applications that wish to integrate Waku may not be able to use nwaku and its JSON RPC API due to constraints @@ -13408,19 +13225,31 @@ enr and peerID each node found. onErrCb will be executed with the reason the function execution failed.
onErrCb
0277fd0
77029a2
e5b859a
This specification describes an opinionated deployment of 10/WAKU2 protocols to form a coherent and shared decentralized messaging network that is open-access, @@ -13503,7 +13332,7 @@ as described in Transports +
Relay nodes MUST follow 10/WAKU2 specifications with regards to supporting different transports. If TCP transport is available, @@ -13717,9 +13546,9 @@ and SHOULD use the short length format:
slug: 66 -title: 66/WAKU2-METADATA -name: Waku Metadata Protocol -status: draft -editor: Franck Royer franck@status.im -contributors:
4361e29
f829b12
d82eacc
This specification describes the metadata that can be associated with a 10/WAKU2 node.
Application-layer specifications built on top of Waku core protocols.
3b152e4
89a94a5
c4ff509
8841f49
a16a2b4
Content Topics:
/eth-pm/1/public-key/proto
/eth-pm/1/private-message/proto
This specification explains the Toy Ethereum Private Message protocol which enables a peer to send an encrypted message to another peer over the Waku network using the peer's Ethereum address.
M
B'
Alice SHOULD now publish this message on the Private Message content topic.
f08de10
33cf551
29acb80
7bd0712
This specification explains the Toy Ethereum Private Message protocol -which enables a peer to send an encrypted message to another peer -over the Waku network using the peer's Ethereum address.
Alice wants to send an encrypted message to Bob, -where only Bob can decrypt the message. -Alice only knows Bob's Ethereum Address.
The goal of this specification -is to demonstrate how Waku can be used for encrypted messaging purposes, -using Ethereum accounts for identity. -This protocol caters to Web3 wallet restrictions, -allowing it to be implemented using standard Web3 API. -In the current state, -Toy Ethereum Private Message, ETH-PM, has privacy and features limitations, -has not been audited and hence is not fit for production usage. -We hope this can be an inspiration for developers -wishing to build on top of Waku.
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, -“SHOULD NOT”, “RECOMMENDED”, “MAY”, and -“OPTIONAL” in this document are to be interpreted as described in 2119.
Here are the variables used in the protocol and their definition:
B
b
b'
The proposed protocol MUST adhere to the following design requirements:
Alice's details are not included in the message's structure, -meaning that there is no programmatic way for Bob to reply to Alice -or verify her identity.
Private messages are sent on the same content topic for all users. -As the recipient data is encrypted, -all participants must decrypt all messages which can lead to scalability issues.
This protocol does not guarantee Perfect Forward Secrecy nor Future Secrecy: -If Bob's private key is compromised, past and future messages could be decrypted. -A solution combining regular X3DH -bundle broadcast with Double Ratchet -encryption would remove these limitations; -See the Status secure transport specification -for an example of a protocol that achieves this in a peer-to-peer setting.
Bob MUST decide to participate in the protocol before Alice can send him a message. -This is discussed in more detail in -Consideration for a non-interactive/uncoordinated protocol
First, Bob needs to generate a keypair for Encryption purposes.
Bob SHOULD get 32 bytes from a secure random source as Encryption Private Key, b'. -Then Bob can compute the corresponding SECP-256k1 Public Key, B'.
For Alice to encrypt messages for Bob, -Bob SHOULD broadcast his Encryption Public Key B'. -To prove that the Encryption Public Key B' -is indeed owned by the owner of Bob's Ethereum Account B, -Bob MUST sign B' using B.
To prove ownership of the Encryption Public Key, -Bob must sign it using EIP-712 v3, -meaning calling eth_signTypedData_v3 on his wallet's API.
eth_signTypedData_v3
Note: While v4 also exists, it is not available on all wallets and -the features brought by v4 is not needed for the current use case.
The TypedData to be passed to eth_signTypedData_v3 MUST be as follows, where:
TypedData
encryptionPublicKey
0x
bobAddress
const typedData = { - domain: { - chainId: 1, - name: 'Ethereum Private Message over Waku', - version: '1', - }, - message: { - encryptionPublicKey: encryptionPublicKey, - ownerAddress: bobAddress, - }, - primaryType: 'PublishEncryptionPublicKey', - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - ], - PublishEncryptionPublicKey: [ - { name: 'encryptionPublicKey', type: 'string' }, - { name: 'ownerAddress', type: 'string' }, - ], - }, - } -
The resulting signature is then included in a PublicKeyMessage, where
PublicKeyMessage
encryption_public_key
eth_address
signature
syntax = "proto3"; - -message PublicKeyMessage { - bytes encryption_public_key = 1; - bytes eth_address = 2; - bytes signature = 3; -} -
This MUST be wrapped in a 14/WAKU-MESSAGE version 0, -with the Public Key Broadcast content topic. -Finally, Bob SHOULD publish the message on Waku.
Alice has to get Bob's public Key to send a message to Bob. -Because an Ethereum Address is part of the hash of the public key's account, -it is not enough in itself to deduce Bob's Public Key.
This is why the protocol dictates that Bob MUST send his Public Key first, -and Alice MUST receive it before she can send him a message.
Moreover, nwaku, the reference implementation of 13/WAKU2-STORE, -stores messages for a maximum period of 30 days. -This means that Bob would need to broadcast his public key -at least every 30 days to be reachable.
Below we are reviewing possible solutions to mitigate this "sign up" step.
If Bob has signed at least one transaction with his account -then his Public Key can be extracted from the transaction's ECDSA signature. -The challenge with this method is that standard Web3 Wallet API -does not allow Alice to specifically retrieve all/any transaction sent by Bob.
Alice would instead need to use the eth.getBlock API -to retrieve Ethereum blocks one by one. -For each block, she would need to check the from value of each transaction -until she finds a transaction sent by Bob.
eth.getBlock
from
This process is resource intensive and -can be slow when using services such as Infura due to rate limits in place, -which makes it inappropriate for a browser or mobile phone environment.
An alternative would be to either run a backend -that can connect directly to an Ethereum node, -use a centralized blockchain explorer -or use a decentralized indexing service such as The Graph.
Note that these would resolve a UX issue -only if a sender wants to proceed with air drops.
Indeed, if Bob does not publish his Public Key in the first place -then it MAY be an indication that he does not participate in this protocol -and hence will not receive messages.
However, these solutions would be helpful -if the sender wants to proceed with an air drop of messages: -Send messages over Waku for users to retrieve later, -once they decide to participate in this protocol. -Bob may not want to participate first but may decide to participate at a later stage -and would like to access previous messages. -This could make sense in an NFT offer scenario: -Users send offers to any NFT owner, -NFT owner may decide at some point to participate in the protocol and -retrieve previous offers.
Another improvement would be for Bob not having to re-publish his public key -every 30 days or less. -Similarly to above, -if Bob stops publishing his public key -then it MAY be an indication that he does not participate in the protocol anymore.
In any case, -the protocol could be modified to store the Public Key in a more permanent storage, -such as a dedicated smart contract on the blockchain.
Alice MAY monitor the Waku network to collect Ethereum Address and -Encryption Public Key tuples. -Alice SHOULD verify that the signatures of PublicKeyMessages she receives -are valid as per EIP-712. -She SHOULD drop any message without a signature or with an invalid signature.
Using Bob's Encryption Public Key, -retrieved via 10/WAKU2, -Alice MAY now send an encrypted message to Bob.
If she wishes to do so, -Alice MUST encrypt her message M using Bob's Encryption Public Key B', -as per 26/WAKU-PAYLOAD Asymmetric Encryption specs.
slug: 26 -title: 26/WAKU2-PAYLOAD -name: Waku Message Payload Encryption -status: draft -editor: Oskar Thoren oskarth@titanproxy.com -contributors:
This specification describes how Waku provides confidentiality, authenticity, and integrity, as well as some form of unlinkability. Specifically, it describes how encryption, decryption and @@ -14277,7 +13929,7 @@ but written in a way that is agnostic and self-contained for EIP-627: Whisper spec as well from RLPx Transport Protocol spec (ECIES encryption) with some modifications.
The keywords “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in 2119.
padding
In order to decode a message, a node SHOULD try to apply both symmetric and asymmetric decryption operations. This is because the type of encryption is not included in the message.
slug: 53 -title: 53/WAKU2-X3DH -name: X3DH usage for Waku payload encryption -status: draft -category: Standards Track -tags: waku-application -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors:
b60abdb
51567b1
9fd3266
5e95a1a
555eb20
This document describes a method that can be used to provide a secure channel between two peers, and thus provide confidentiality, integrity, authenticity and forward secrecy. @@ -14466,7 +14127,7 @@ with some adaptations to operate in a decentralized environment.
Nodes on a network may want to communicate with each other in a secure manner, without other nodes network being able to read their messages.
The message key MUST be derived from a single ratchet step in the symmetric-key ratchet as described in Symmetric key ratchet
The message key MUST be used to encrypt the next message to be sent.
Inherits the security considerations of X3DH @@ -14718,10 +14379,10 @@ In this case, the server is trusted.
slug: 54 -title: 54/WAKU2-X3DH-SESSIONS -name: Session management for Waku X3DH -status: draft -category: Standards Track -tags: waku-application -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors:
db365cb
0e490d4
7f8b187
a22c2a0
484df92
This document specifies how to manage sessions based on an X3DH key exchange. This includes how to establish new sessions, how to re-establish them, how to maintain them, and how to close them.
installation-id
slug: 6 -title: 6/WAKU1 -name: Waku v1 -status: stable -editor: Oskar Thorén oskarth@titanproxy.com -contributors:
Legacy Waku standards retained for reference and historical compatibility.
be052c8
7d83b3d
161b35a
4c666c6
61f7641
This specification describes the format of Waku packets within the ÐΞVp2p Wire Protocol. This spec substitutes EIP-627. Waku is a fork of the original Whisper protocol @@ -15483,13 +15165,13 @@ This can be mitigated somewhat by running on e.g. port 80 or but there are still outstanding issues. See libp2p and Tor's Pluggable Transport for how this can be improved.
80
but there are still outstanding issues. See libp2p and Tor's Pluggable Transport for how this can be improved.
Notes useful for implementing Waku mode.
1.Avoid duplicate envelopes
To avoid duplicate envelopes, @@ -15592,723 +15274,39 @@ confirmations-enabled and rate-limits
Felix Lange et al. The RLPx Transport Protocol. Ethereum.
This specification describes the format of Waku packets within the ÐΞVp2p Wire Protocol. -This spec substitutes EIP-627. -Waku is a fork of the original Whisper protocol -that enables better usability for resource restricted devices, -such as mostly-offline bandwidth-constrained smartphones. -It does this through (a) light node support, (b) historic envelopes -(with a mailserver) (c) expressing topic interest for better bandwidth usage -and (d) basic rate limiting.
Waku was created to incrementally improve in areas that Whisper is lacking in, -with special attention to resource restricted devices. -We specify the standard for Waku packets in order to ensure forward compatibility -of different Waku clients, backwards compatibility with Whisper clients, -as well as to allow multiple implementations of Waku and its capabilities. -We also modify the language to be more unambiguous, concise and consistent.
waku-envelope
For nodes to communicate, they MUST implement devp2p and run RLPx. -They MUST have some way of connecting to other nodes. -Node discovery is largely out of scope for this spec, -but see the appendix for some suggestions on how to do this.
This protocol needs to advertise the waku/1 capability.
waku/1
In Whisper, envelopes are gossiped between peers. -Whisper is a form of rumor-mongering protocol -that works by flooding to its connected peers based on some factors. -Envelopes are eligible for retransmission until their TTL expires. -A node SHOULD relay envelopes to all connected nodes -if an envelope matches their PoW and bloom filter settings. -If a node works in light mode, it MAY choose not to forward envelopes. -A node MUST NOT send expired envelopes, -unless the envelopes are sent as a 8/WAKU-MAIL response. -A node SHOULD NOT send an envelope to a peer that it has already sent before.
Nodes SHOULD limit the maximum size of both packets and envelopes. -If a packet or envelope exceeds its limit, it MUST be dropped.
a57d7b4
900a3e9
662eb12
93c3896
Clients MAY use their own maximum packet and envelope sizes. -The default values are 1.5mb for the RLPx Packet and 1mb for a Waku envelope.
1.5mb
1mb
All Waku packets are sent as devp2p RLPx transport protocol, version 51 packets. -These packets MUST be RLP-encoded arrays of data containing two objects: -packet code followed by another object (whose type depends on the packet code). -See informal RLP spec and -the Ethereum Yellow Paper, appendix B -for more details on RLP.
Waku is a RLPx subprotocol called waku with version 0. -The version number corresponds to the major version in the header spec. -Minor versions should not break compatibility of waku, -this would result in a new major. -(Some exceptions to this apply in the Draft stage -of where client implementation is rapidly change).
waku
0
Using Augmented Backus-Naur form (ABNF) -we have the following format:
; Packet codes 0 - 127 are reserved for Waku protocol -packet-code = 1*3DIGIT - -; rate limits per packet -packet-limit-ip = 1*DIGIT -packet-limit-peerid = 1*DIGIT -packet-limit-topic = 1*DIGIT - -; rate limits by size in bytes -bytes-limit-ip = 1*DIGIT -bytes-limit-peerid = 1*DIGIT -bytes-limit-topic = 1*DIGIT - -packet-rate-limits = "[" packet-limit-ip packet-limit-peerid packet-limit-topic "]" -bytes-rate-limits = "[" bytes-limit-ip bytes-limit-peerid bytes-limit-topic "]" - -pow-requirement-key = 0 -bloom-filter-key = 1 -light-node-key = 2 -confirmations-enabled-key = 3 -packet-rate-limits-key = 4 -topic-interest-key = 5 -bytes-rate-limits-key = 6 - -status-options = "[" - [ pow-requirement-key pow-requirement ] - [ bloom-filter-key bloom-filter ] - [ light-node-key light-node ] - [ confirmations-enabled-key confirmations-enabled ] - [ packet-rate-limits-key packet-rate-limits ] - [ topic-interest-key topic-interest ] - [ bytes-limits-key bytes-rate-limits ] -"]" - -status = status-options - -status-update = status-options - -confirmations-enabled = BIT - -light-node = BIT - -; pow is "a single floating point value of PoW. -; This value is the IEEE 754 binary representation -; of a 64-bit floating point number packed as a uint64. -; Values of qNAN, sNAN, INF and -INF are not allowed. -; Negative values are also not allowed." -pow = 1*DIGIT "." 1*DIGIT -pow-requirement = pow - -; bloom filter is "a byte array" -bloom-filter = *OCTET - -waku-envelope = "[" expiry ttl topic data nonce "]" - -; List of topics interested in -topic-interest = "[" *10000topic "]" - -; 4 bytes (UNIX time in seconds) -expiry = 4OCTET - -; 4 bytes (time-to-live in seconds) -ttl = 4OCTET - -; 4 bytes of arbitrary data -topic = 4OCTET - -; byte array of arbitrary size -; (contains encrypted payload) -data = *OCTET - -; 8 bytes of arbitrary data -; (used for PoW calculation) -nonce = 8OCTET - -messages = 1*waku-envelope - -; version of the confirmation packet -version = 1*DIGIT - -; keccak256 hash of the envelopes batch data (raw bytes) -; for which the confirmation is sent -hash = *OCTET - -hasherror = *OCTET - -; error code -code = 1*DIGIT - -; a descriptive error message -description = *ALPHA - -error = "[" hasherror code description "]" -errors = *error - -response = "[" hash errors "]" - -confirmation = "[" version response "]" - -; message confirmation packet types -batch-ack = confirmation -message-response = confirmation - -; mail server / client specific -p2p-request = waku-envelope -p2p-message = 1*waku-envelope -p2p-request-complete = *OCTET - -; packet-format needs to be paired with its -; corresponding packet-format -packet-format = "[" packet-code packet-format "]" - -required-packet = 0 status / - 1 messages / - 22 status-update / - -optional-packet = 11 batch-ack / - 12 message-response / - 126 p2p-request-complete / - 126 p2p-request / - 127 p2p-message - -packet = "[" required-packet [ optional-packet ] "]" -
All primitive types are RLP encoded. Note that, per RLP specification, -integers are encoded starting from 0x00.
0x00
The packet codes reserved for Waku protocol: 0 - 127.
Packets with unknown codes MUST be ignored without generating any error, -for forward compatibility of future versions.
The Waku sub-protocol MUST support the following packet codes:
The following message codes are optional, but they are reserved for specific purpose.
The Status packet serves as a Waku handshake and peers MUST exchange this -packet upon connection. It MUST be sent after the RLPx handshake and prior to -any other Waku packets.
A Waku node MUST await the Status packet from a peer -before engaging in other Waku protocol activity with that peer. -When a node does not receive the Status packet from a peer, -before a configurable timeout, it SHOULD disconnect from that peer.
Upon retrieval of the Status packet, the node SHOULD validate the packet -received and validated the Status packet. Note that its peer might not be in -the same state.
When a node is receiving other Waku packets from a peer before a Status -packet is received, the node MUST ignore these packets and -SHOULD disconnect from that peer. -Status packets received after the handshake is completed MUST also be ignored.
The Status packet MUST contain an association list containing various options. -All options within this association list are OPTIONAL, -ordering of the key-value pairs is not guaranteed and -therefore MUST NOT be relied on. -Unknown keys in the association list SHOULD be ignored.
This packet is used for sending the standard Waku envelopes.
The Status Update packet is used to communicate an update -of the settings of the node. -The format is the same as the Status packet, all fields are optional. -If none of the options are specified the packet MUST be ignored and -considered a noop. -Fields that are omitted are considered unchanged, -fields that haven't changed SHOULD not be transmitted.
When PoW Requirement is updated, -peers MUST NOT deliver envelopes with PoW lower than the PoW Requirement specified.
PoW is defined as average number of iterations, -required to find the current BestBit -(the number of leading zero bits in the hash), divided by envelope size and TTL:
PoW = (2**BestBit) / (size * TTL)
PoW calculation:
fn short_rlp(envelope) = rlp of envelope, excluding env_nonce field. -fn pow_hash(envelope, env_nonce) = sha3(short_rlp(envelope) ++ env_nonce) -fn pow(pow_hash, size, ttl) = 2**leading_zeros(pow_hash) / (size * ttl)
where size is the size of the RLP-encoded envelope, -excluding env_nonce field (size of short_rlp(envelope)).
env_nonce
short_rlp(envelope)
The bloom filter is used to identify a number of topics to a peer without compromising -(too much) privacy over precisely what topics are of interest. -Precise control over the information content (and thus efficiency of the filter) -may be maintained through the addition of bits.
Blooms are formed by the bitwise OR operation on a number of bloomed topics. -The bloom function takes the topic and projects them onto a 512-bit slice. -At most, three bits are marked for each bloomed topic.
The projection function is defined as a mapping -from a 4-byte slice S to a 512-bit slice D; for ease of explanation, -S will dereference to bytes, whereas D will dereference to bits.
LET D[*] = 0 -FOREACH i IN { 0, 1, 2 } DO -LET n = S[i] -IF S[3] & (2 ** i) THEN n += 256 -D[n] = 1 -END FOR
A full bloom filter (all the bits set to 1) -means that the node is to be considered a Full Node and it will accept any topic.
Full Node
If both topic interest and bloom filter are specified, -topic interest always takes precedence and bloom filter MUST be ignored.
If only bloom filter is specified, -the current topic interest MUST be discarded and -only the updated bloom filter MUST be used when forwarding or posting envelopes.
A bloom filter with all bits set to 0 signals that the node is not currently -interested in receiving any envelope.
Topic interest is used to share a node's interest in envelopes with specific topics. -It does this in a more bandwidth considerate way, -at the expense of some metadata protection. -Peers MUST only send envelopes with specified topics.
It is currently bounded to a maximum of 10000 topics. -If you are interested in more topics than that, this is currently underspecified -and likely requires updating it. The constant is subject to change.
If only topic interest is specified, the current bloom filter MUST be discarded and -only the updated topic interest MUST be used when forwarding or posting envelopes.
An empty array signals that the node is not currently interested in receiving -any envelope.
Rate limits is used to inform other nodes of their self defined rate limits.
In order to provide basic Denial-of-Service attack protection, -each node SHOULD define its own rate limits. -The rate limits SHOULD be applied on IPs, peer IDs, and envelope topics.
Each node MAY decide to whitelist, i.e. do not rate limit, selected IPs or peer IDs.
If a peer exceeds node's rate limits, the connection between them MAY be dropped.
Each node SHOULD broadcast its rate limits to its peers -using the status-update packet. -The rate limits MAY also be sent as an optional parameter in the handshake.
status-update
Each node SHOULD respect rate limits advertised by its peers. -The number of packets SHOULD be throttled in order not to exceed peer's rate limits. -If the limit gets exceeded, the connection MAY be dropped by the peer.
Two rate limits strategies are applied:
Both strategies SHOULD be applied per IP address, peer id and topic.
The size limit SHOULD be greater or equal than the maximum packet size.
When the node's light-node field is set to true, -the node SHOULD NOT forward Envelopes from its peers.
light-node
A node connected to a peer with the light-node field set to true -MUST NOT depend on the peer for forwarding Envelopes.
When the node's confirmations-enabled field is set to true, -the node SHOULD send message confirmations -to its peers.
confirmations-enabled
Message confirmations tell a node that an envelope -originating from it has been received by its peers, -allowing a node to know whether an envelope has or has not been received.
A node MAY send a message confirmation for any batch of envelopes -received with a Messages packet (0x01).
0x01
A message confirmation is sent using Batch Ack packet (0x0B) or -Message Response packet (0x0C). -The message confirmation is specified in the ABNF specification.
0x0B
0x0C
The current version in the confirmation is 1.
version
confirmation
1
The supported error codes:
The drawback of sending message confirmations is that it increases the noise -in the network because for each sent envelope, -a corresponding confirmation is broadcast by one or more peers.
This packet is used for sending Dapp-level peer-to-peer requests, -e.g. Waku Mail Client requesting historic (expired) -envelopes from the Waku Mail Server.
This packet is used for sending the peer-to-peer envelopes, -which are not supposed to be forwarded any further. -E.g. it might be used by the Waku Mail Server for delivery of historic (expired) -envelopes, which is otherwise not allowed.
This packet is used to indicate that all envelopes, -requested earlier with a P2P Request packet (0x7E), -have been sent via one or more P2P Message packets (0x7F).
0x7E
0x7F
The content of the packet is explained in the Waku Mail Server specification.
Asymmetric encryption uses the standard Elliptic Curve Integrated Encryption Scheme -with SECP-256k1 public key.
Symmetric encryption uses AES GCM algorithm with random 96-bit nonce.
Packet codes 0x00 and 0x01 are already used in all Waku / Whisper versions. -Packet code 0x02 and 0x03 were previously used in Whisper but -are deprecated as of Waku v0.4
0x02
0x03
Packet code 0x22 is used to dynamically change the settings of a node.
0x22
Packet codes 0x7E and 0x7F may be used to implement Waku Mail Server and -Client. -Without the P2P Message packet it would be impossible to deliver the historic envelopes, -since they will be recognized as expired, and -the peer will be disconnected for violating the Waku protocol. -They might be useful for other purposes -when it is not possible to spend time on PoW, -e.g. if a stock exchange will want to provide live feed about the latest trades.
Waku supports multiple capabilities. -These include light node, rate limiting and bridging of traffic. -Here we list these capabilities, how they are identified, -what properties they have and what invariants they must maintain.
Additionally, -there is the capability of a mailserver which is documented in its on specification.
The rationale for light nodes is to allow for interaction with waku -on resource restricted devices as bandwidth can often be an issue.
Light nodes MUST NOT forward any incoming envelopes, -they MUST only send their own envelopes. -When light nodes happen to connect to each other, they SHOULD disconnect. -As this would result in envelopes being dropped between the two.
Light nodes are identified by the light_node value in the Status packet.
light_node
Nodes MAY implement accounting, keeping track of resource usage. -It is heavily inspired by Swarm's SWAP protocol, -and works by doing pairwise accounting for resources.
Each node keeps track of resource usage with all other nodes. -Whenever an envelope is received from a node that is expected -(fits bloom filter or topic interest, is legal, etc) this is tracked.
Every epoch (say, every minute or every time an event happens) -statistics SHOULD be aggregated and saved by the client:
In later versions this will be amended by nodes communication thresholds, -settlements and disconnect logic.
The currently advertised capability is waku/1. -This needs to be advertised in the hello ÐΞVp2p packet. -If a node supports multiple versions of waku, those needs to be explicitly advertised. -For example if both waku/0 and waku/1 are supported, -both waku/0 and waku/1 MUST be advertised.
hello
ÐΞVp2p
waku/0
These are policies that guide how we make decisions when it comes to upgradability, -compatibility, and extensibility:
Waku aims to be compatible with previous and future versions.
In cases where we want to break this compatibility, -we do so gracefully and as a single decision point.
To achieve this, we employ the following two general strategies:
Examples:
shh/6
Waku is a different subprotocol from Whisper so it isn't directly compatible. -However, the data format is the same, -so compatibility can be achieved by the use of a bridging mode as described below. -Any client which does not implement certain packet codes -should gracefully ignore the packets with those codes. -This will ensure the forward compatibility.
waku/1 and shh/6 are different DevP2P subprotocols, -however they share the same data format making their envelopes compatible. -This means we can bridge the protocols naively, this works as follows.
Roles:
Flow:
Note: This flow means if another bridge C1 is active, -we might get duplicate relaying for a envelope between C1 and C2. -I.e. Whisper(<>Waku<>Whisper)<>Waku, A-C1-C2-B. -Theoretically this bridging chain can get as long as TTL permits.
It is desirable to have a strategy for maintaining forward compatibility -between waku/1 and future version of waku. -Here we outline some concerns and strategy for this.
status-options
status
There are several security considerations to take into account when running Waku. -Chief among them are: scalability, DDoS-resistance and privacy. -These also vary depending on what capabilities are used. -The security considerations for extra capabilities, -such as mailservers -can be found in their respective specifications.
In version 0 of Waku, bandwidth usage is likely to be an issue. -For more investigation into this, -see the theoretical scaling model described -here.
Use of gossip-based routing doesn't necessarily scale. -It means each node can see an envelope multiple times, and -having too many light nodes can cause propagation probability that is too low. -See Whisper vs PSS -for more and a possible Kademlia based alternative.
Waku currently lacks incentives to run nodes, -which means node operators are more likely to create centralized choke points.
The main privacy concern with a light node -is that it has to reveal its topic interests -(in addition to its IP/ID) to its directed peers. -This is because when a light node publishes an envelope, -its directed peers will know that the light node owns that envelope -(as light nodes do not relay other envelopes). -Therefore, the directed peers of a light node can make assumptions about what envelopes -(topics) the light node is interested in.
A mailserver client fetches archival envelopes from a mailserver -through a direct connection. -In this direct connection, -the client discloses its IP/ID as well as the topics/ bloom filter -it is interested in to the mailserver. -The collection of such information allows the mailserver to link clients' IP/IDs -to their topic interests and build a profile for each client over time. -As such, the mailserver client has to trust the mailserver with this level of information.
By having a bloom filter where only the topics you are interested in are set, -you reveal which envelopes you are interested in. -This is a fundamental tradeoff between bandwidth usage and privacy, -though the tradeoff space is likely suboptimal in terms of the Anonymity -trilemma.
Privacy for Whisper / Waku haven't been studied rigorously for various threat models -like global passive adversary, local active attacker, etc. -This is unlike e.g. Tor and mixnets.
Similar to bloom filter privacy, -if you use a very specific topic you reveal more information. -See scalability model linked above.
PoW bad for heterogeneous devices:
Proof of work is a poor spam prevention mechanism. -A mobile device can only have a very low PoW -in order not to use too much CPU / burn up its phone battery. -This means someone can spin up a powerful node and overwhelm the network.
Devp2p TCP port blockable:
By default Devp2p runs on port 30303, -which is not commonly used for any other service. -This means it is easy to censor, e.g. airport WiFi. -This can be mitigated somewhat by running on e.g. port 80 or 443, -but there are still outstanding issues. -See libp2p and Tor's Pluggable Transport for how this can be improved.
30303
443
To avoid duplicate envelopes, -only connect to one Waku node. -Benign duplicate envelopes is an intrinsic property of Whisper -which often leads to a N factor increase in traffic, -where N is the number of peers you are connected to.
2.Topic specific recommendations
Consider partition topics based on some usage, -to avoid too much traffic on a single topic.
Resource restricted devices SHOULD use EIP-1459 -to discover nodes.
Known static nodes MAY also be used.
Released June 09, 2020
Released April 21,2020
RLP
Released March 17,2020
Released February 21, 2020.
0x20
0x21
topic-interest
Released February 13, 2020.
Released December 10, 2019.
Initial version. Released November 21, 2019.
Summary of main differences between this spec and Whisper v6, as described in EIP-627:
slug: 7 -title: 7/WAKU-DATA -name: Waku Envelope data field -status: stable -editor: Oskar Thorén oskarth@titanproxy.com -contributors:
This specification describes the encryption, decryption and signing of the content in the data field used in Waku.
The data field is used within the waku envelope, the field MUST contain the encrypted payload of the envelope.
waku envelope
The fields that are concatenated and encrypted as part of the data field are:
slug: 8 -title: 8/WAKU-MAIL -name: Waku Mailserver -status: stable -editor: Andrea Maria Piana andreap@status.im -contributors:
fa77279
0c8e39b
de5cfa2
28e7862
In this specification, we describe Mailservers. These are nodes responsible for archiving envelopes and delivering them to peers on-demand.
A node which wants to provide mailserver functionality MUST store envelopes from incoming Messages packets (Waku packet-code 0x01). The envelopes can be stored in any format, @@ -16468,7 +15477,7 @@ payload = "[" request-id last-envelope-hash [ cursor ] "]" it means that not all envelopes were sent due to the set Limit in the request. One or more consecutive requests MAY be sent with Cursor field filled in order to receive the rest of the envelopes.
Limit
Cursor
There are several security considerations to take into account when running or interacting with Mailservers. Chief among them are: scalability, DDoS-resistance and privacy.
A mailserver has a direct TCP connection, which means they are trusted to send traffic. This means a malicious or malfunctioning mailserver can overwhelm an individual node.
topics
slug: 9 -title: 9/WAKU-RPC -name: Waku RPC API -status: stable -editor: Andrea Maria Piana andreap@status.im -contributors:
5eb393f
9617146
75705cd
e808e36
This specification describes the RPC API that Waku nodes MAY adhere to. The unified API allows clients to easily be able to connect to any node implementation. @@ -16870,25 +15890,36 @@ It can not be both.
slug: 22 -title: 22/TOY-CHAT -name: Waku v2 Toy Chat -status: draft -tags: waku/application -editor: Franck Royer franck@status.im -contributors:
Informational Waku documents covering guidance, examples, and supporting material.
722c3d2
5c5ea36
411e135
Content Topic: /toy-chat/2/huilong/proto.
/toy-chat/2/huilong/proto
This specification explains a toy chat example using Waku v2. This protocol is mainly used to:
nick
4df2d5f
dc7497a
e63d8a0
b8f088c
2b693e8
055c525
a11dfed
This specification explains a toy chat example using Waku v2. -This protocol is mainly used to:
Currently, all main Waku v2 implementations support the toy chat protocol: -nim-waku, -js-waku (NodeJS -and web) -and go-waku.
Note that this is completely separate from the protocol the Status app -is using for its chat functionality.
The chat protocol enables sending and receiving messages in a chat room. -There is currently only one chat room, which is tied to the content topic. -The messages SHOULD NOT be encrypted.
The contentTopic MUST be set to /toy-chat/2/huilong/proto.
syntax = "proto3"; - -message Chat2Message { - uint64 timestamp = 1; - string nick = 2; - bytes payload = 3; -} -
timestamp
slug: 23 -title: 23/WAKU2-TOPICS -name: Waku v2 Topic Usage Recommendations -status: draft -category: Informational -editor: Oskar Thoren oskarth@titanproxy.com -contributors:
This document outlines recommended usage of topic names in Waku v2. In 10/WAKU2 spec there are two types of topics:
/waku/1/0x007f80ff/rfc26
slug: 27 -title: 27/WAKU2-PEERS -name: Waku v2 Client Peer Management Recommendations -status: draft -editor: Hanno Cornelius hanno@status.im -contributors:
af7c413
4b77d10
e65c359
4a78cac
7daec2f
27/WAKU2-PEERS describes a recommended minimal set of peer storage and peer management features to be implemented by Waku v2 clients.
In this context, peer storage refers to a client's ability to keep track of discovered @@ -17222,10 +16235,10 @@ For example, idle TCP connections often times out after 10 to 15 minutes.
nim-waku
5 minutes
10 minutes
Peer ID
slug: 29 -title: 29/WAKU2-CONFIG -name: Waku v2 Client Parameter Configuration Recommendations -status: draft -editor: Hanno Cornelius hanno@status.im -contributors:
7408956
c506eac
930f84d
e6396b9
29/WAKU2-CONFIG describes the RECOMMENDED values to assign to configurable parameters for Waku v2 clients. Since Waku v2 is built on libp2p, @@ -17298,10 +16323,10 @@ MAY choose to implement.
29/WAKU2-CONFIG
IHaveMaxLength
slug: 30 -title: 30/ADAPTIVE-NODES -name: Adaptive nodes -status: draft -editor: Oskar Thorén oskarth@titanproxy.com -contributors:
91c9679
b35846a
04036ad
This is an informational spec that show cases the concept of adaptive nodes.
We can look at node types as a continuum, @@ -17394,10 +16430,10 @@ and 15/WAKU- This one shows a cross-section of nodes in different dimensions and shows how the connections look different for different protocols. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 11/WAKU2-RELAY 25/LIBP2P-DNS-DISCOVERY @@ -17409,20 +16445,27 @@ This subdirectory is for achrive purpose and should not be used in production ready implementations. Visit Waku RFCs for new Waku specifications under discussion.
This one shows a cross-section of nodes in different dimensions and shows how the connections look different for different protocols.
slug: 5 -title: 5/WAKU0 -name: Waku v0 -status: deprecated -editor: Oskar Thorén oskarth@titanproxy.com -contributors:
9770963
ac8fe6d
This specification describes the format of Waku messages within the ÐΞVp2p Wire Protocol. This spec substitutes EIP-627. Waku is a fork of the original Whisper protocol that enables better usability @@ -17432,7 +16475,7 @@ It does this through (a) light node support, (b) historic messages (with a mailserver) (c) expressing topic interest for better bandwidth usage and (d) basic rate limiting.
Waku was created to incrementally improve in areas that Whisper is lacking in, with special attention to resource restricted devices. We specify the standard for Waku messages @@ -17440,20 +16483,20 @@ in order to ensure forward compatibility of different Waku clients, backwards compatibility with Whisper clients, as well as to allow multiple implementations of Waku and its capabilities. We also modify the language to be more unambiguous, concise and consistent.
For nodes to communicate, they MUST implement devp2p and run RLPx. They MUST have some way of connecting to other nodes. Node discovery is largely out of scope for this spec, but see the appendix for some suggestions on how to do this.
In Whisper, messages are gossiped between peers. Whisper is a form of rumor-mongering protocol that works by flooding to its connected peers based on some factors. @@ -17464,8 +16507,8 @@ If a node works in light mode, it MAY choose not to forward envelopes. A node MUST NOT send expired envelopes, unless the envelopes are sent as a mailserver response. A node SHOULD NOT send a message to a peer that it has already sent before.
All Waku messages are sent as devp2p RLPx transport protocol, version 51 packets. These packets MUST be RLP-encoded arrays of data containing two objects: @@ -17479,7 +16522,7 @@ Minor versions should not break compatibility of waku, this would result in a new major. (Some exceptions to this apply in the Draft stage of where client implementation is rapidly change).
Using Augmented Backus-Naur form (ABNF) we have the following format:
; Packet codes 0 - 127 are reserved for Waku protocol @@ -17572,7 +16615,7 @@ packet = "[" required-packet [ optional-packet ] "]"
All primitive types are RLP encoded. Note that, per RLP specification, integers are encoded starting from 0x00.
The message codes reserved for Waku protocol: 0 - 127.
Messages with unknown codes MUST be ignored without generating any error, for forward compatibility of future versions.
The Status message serves as a Waku handshake and peers MUST exchange this message upon connection. It MUST be sent after the RLPx handshake and prior to any other Waku messages.
The Status Update message is used to communicate an update of the settings of the node. The format is the same as the Status message, all fields are optional. @@ -17734,19 +16777,19 @@ created in the future (the root cause is no time sync between nodes).
The drawback of sending message confirmations is that it increases the noise in the network because for each sent message, a corresponding confirmation is broadcast by one or more peers.
This packet is used for sending Dapp-level peer-to-peer requests, e.g. Waku Mail Client requesting old messages from the Waku Mail Server.
This packet is used for sending the peer-to-peer messages, which are not supposed to be forwarded any further. E.g. it might be used by the Waku Mail Server for delivery of old (expired) messages, which is otherwise not allowed.
Asymmetric encryption uses the standard Elliptic Curve Integrated Encryption Scheme with SECP-256k1 public key.
Packet codes 0x00 and 0x01 are already used in all Waku / Whisper versions. Packet code 0x02 and 0x03 were previously used in Whisper but are deprecated as of Waku v0.4
Waku supports multiple capabilities. These include light node, rate limiting and bridging of traffic. Here we list these capabilities, how they are identified, what properties they have and what invariants they must maintain.
Additionally there is the capability of a mailserver which is documented in its on specification.
The rationale for light nodes is to allow for interaction with waku on resource restricted devices as bandwidth can often be an issue.
Light nodes MUST NOT forward any incoming messages, @@ -17774,7 +16817,7 @@ When light nodes happen to connect to each other, they SHOULD disconnect. As this would result in messages being dropped between the two.
Light nodes are identified by the light_node value in the status message.
Nodes MAY implement accounting, keeping track of resource usage. It is heavily inspired by Swarm's SWAP protocol, @@ -17791,8 +16834,8 @@ statistics SHOULD be aggregated and saved by the client:
In later versions this will be amended by nodes communication thresholds, settlements and disconnect logic.
These are policies that guide how we make decisions when it comes to upgradability, compatibility, and extensibility:
Waku is a different subprotocol from Whisper so it isn't directly compatible. However, the data format is the same, so compatibility can be achieved by the use of a bridging mode as described below. Any client which does not implement certain packet codes should gracefully ignore the packets with those codes. This will ensure the forward compatibility.
waku/0 and shh/6 are different DevP2P subprotocols, however they share the same data format making their envelopes compatible. This means we can bridge the protocols naively, this works as follows.
It is desirable to have a strategy for maintaining forward compatibility between waku/0 and future version of waku. Here we outline some concerns and strategy for this.
There are several security considerations to take into account when running Waku. Chief among them are: scalability, DDoS-resistance and privacy. These also vary depending on what capabilities are used. The security considerations for extra capabilities such as mailservers can be found in their respective specifications.
Bandwidth usage:
In version 0 of Waku, bandwidth usage is likely to be an issue. For more investigation into this, @@ -17910,7 +16953,7 @@ for more and a possible Kademlia based alternative.
Lack of incentives:
Waku currently lacks incentives to run nodes, which means node operators are more likely to create centralized choke points.
Light node privacy:
The main privacy concern with light nodes is that directly connected peers will know that a message originates from them @@ -17931,13 +16974,13 @@ This is unlike e.g. Tor and mixnets.
Similar to bloom filter privacy, if you use a very specific topic you reveal more information. See scalability model linked above.
Proof of work is a poor spam prevention mechanism. A mobile device can only have a very low PoW in order not to use too much CPU / burn up its phone battery. This means someone can spin up a powerful node and overwhelm the network.
By default Devp2p runs on port 30303, which is not commonly used for any other service. @@ -17945,14 +16988,14 @@ This means it is easy to censor, e.g. airport WiFi. This can be mitigated somewhat by running on e.g. port 80 or 443, but there are still outstanding issues. See libp2p and Tor's Pluggable Transport for how this can be improved.
Consider partition topics based on some usage, to avoid too much traffic on a single topic.
Resource restricted devices SHOULD use EIP-1459 to discover nodes.
8b552ba
87b56de
9042acf
8a53f24
This specification describes the JSON-RPC API that Waku v2 nodes MAY adhere to. Refer to the Waku v2 specification @@ -18640,9 +17699,9 @@ using the cursor received above; 2 messages per page, backward direction.
8f94e97
0d8ad08
3c8410c
This specification outlines how we do accounting and settlement based on the provision and usage of resources, most immediately bandwidth usage and/or storing and retrieving of Waku message. @@ -18665,7 +17738,7 @@ This enables nodes to cooperate and efficiently share resources, and in the case of unequal nodes to settle the difference through a relaxed payment mechanism in the form of sending cheques.
Protocol identifier*: /vac/waku/swap/2.0.0-beta1
/vac/waku/swap/2.0.0-beta1
The Waku network makes up a service network, and some nodes provide a useful service to other nodes. We want to account for that, and when imbalances arise, settle this. @@ -18851,9 +17924,9 @@ pick another node.
In the hard phase, in addition to sending cheques and activating policy, this is done with blockchain integration on a public testnet. More details TBD.
This also includes settlements where cheques can be redeemed.
cb4d0de
5da8a11
206133e
The reliability of 13/WAKU2-STORE protocol heavily relies on the fact that full nodes i.e., those who persist messages have high availability and @@ -18908,10 +17995,10 @@ while using this method is that a querying node has to reveal its offline time to the queried node. This will gradually result in the extraction of the node's activity pattern which can lead to inference attacks.
We extend the HistoryQuery protobuf message with two fields of start_time and end_time to signify the time range to be queried.
start_time
end_time
syntax = "proto3"; message HistoryQuery { @@ -18961,10 +18048,10 @@ As such, the messages field of the corresponding HistoryResponse MUST contain historical waku messages that satisfy the indicated pubsubtopic AND contentFilters AND the time range [start_time, end_time]. -Copyright +Copyright Copyright and related rights waived via CC0. -References +References 13/WAKU2-STORE timestamp @@ -18974,22 +18061,25 @@ MUST contain historical waku messages that satisfy the indicated pubsubto scalable infrastructure for developers creating applications for the network state. Published Specifications are currently available here, Nomos Specifications. - -title: NOMOSDA-ENCODING -name: NomosDA Encoding Protocol -status: raw -category: -tags: data-availability -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors: +Nomos Raw Specifications +Early-stage Nomos specifications that have not yet progressed beyond raw status. +NOMOSDA-ENCODING + + +NameNomosDA Encoding Protocol +Statusraw +EditorDaniel Sanchez-Quiros <danielsq@status.im> +ContributorsDaniel Kashepava <danielkashepava@status.im>Álvaro Castro-Castilla <alvaro@status.im>Filip Dimitrijevic <filip@status.im>Thomas Lavaur <thomaslavaur@status.im>Mehmet Gonen <mehmet@status.im> + + + +Timeline -Daniel Kashepava danielkashepava@status.im -Álvaro Castro-Castilla alvaro@status.im -Filip Dimitrijevic filip@status.im -Thomas Lavaur thomaslavaur@status.im -Mehmet Gonen mehmet@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — 39d6f07 — added nomos/raw/nomosda-encoding.md draft (#156) - + Introduction This document describes the encoding and verification processes of NomosDA, which is the data availability (DA) solution used by the Nomos blockchain. NomosDA provides an assurance that all data from Nomos blobs are accessible and verifiable by every network participant. This document presents an implementation specification describing how: @@ -18997,7 +18087,7 @@ contributors: Encoders encode blobs they want to upload to the Data Availability layer. Other nodes implement the verification of blobs that were already uploaded to DA. -Definitions +Definitions Encoder: An encoder is any actor who performs the encoding process described in this document. This involves committing to the data, generating proofs, and submitting the result to the DA layer. @@ -19119,183 +18209,32 @@ b. The amount of rows depends on the size of the data. Details The encoder and verifier processes described above make use of a variety of cryptographic functions to facilitate the correct verification of column data by verifiers. These functions rely on primitives such as polynomial commitments and Reed-Solomon erasure codes, the details of which are outside the scope of this document. These details, as well as introductions to the cryptographic primitives being used, can be found in the NomosDA Cryptographic Protocol: NomosDA Cryptographic Protocol -References +References Encoder Specification: GitHub/encoder.py Verifier Specification: GitHub/verifier.py Cryptographic protocol: NomosDA Cryptographic Protocol -Copyright +Copyright Copyright and related rights waived via CC0. - -title: NOMOSDA-ENCODING -name: NomosDA Encoding Protocol -status: raw -category: -tags: data-availability -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors: +NOMOS-DA-NETWORK + + +NameNomosDA Network +Statusraw +EditorDaniel Sanchez Quiros <danielsq@status.im> +ContributorsÁlvaro Castro-Castilla <alvaro@status.im>Daniel Kashepava <danielkashepava@status.im>Gusto Bacvinka <augustinas@status.im>Filip Dimitrijevic <filip@status.im> + + + +Timeline -Daniel Kashepava danielkashepava@status.im -Álvaro Castro-Castilla alvaro@status.im -Filip Dimitrijevic filip@status.im -Thomas Lavaur thomaslavaur@status.im -Mehmet Gonen mehmet@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — 51ef4cd — added nomos/raw/nomosda-network.md (#160) - + Introduction -This document describes the encoding and verification processes of NomosDA, which is the data availability (DA) solution used by the Nomos blockchain. NomosDA provides an assurance that all data from Nomos blobs are accessible and verifiable by every network participant. -This document presents an implementation specification describing how: - -Encoders encode blobs they want to upload to the Data Availability layer. -Other nodes implement the verification of blobs that were already uploaded to DA. - -Definitions - - -Encoder: An encoder is any actor who performs the encoding process described in this document. This involves committing to the data, generating proofs, and submitting the result to the DA layer. -In the Nomos architecture, the rollup sequencer typically acts as the encoder, but the role is not exclusive and any actor in the DA layer can also act as encoders. - - -Verifier: Verifies its portion of the distributed blob data as per the verification protocol. In the Nomos architecture, the DA nodes act as the verifiers. - - -Overview -In the encoding stage, the encoder takes the DA parameters and the padded blob data and creates an initial matrix of data chunks. This matrix is expanded using Reed-Solomon coding and various commitments and proofs are created for the data. -When a verifier receives a sample, it verifies the data it receives from the encoder and broadcasts the information if the data is verified. Finally, the verifier stores the sample data for the required length of time. -Construction -The encoder and verifier use the NomosDA cryptographic protocol to carry out their respective functions. These functions are implemented as abstracted and configurable software entities that allow the original data to be encoded and verified via high-level operations. -Glossary -NameDescriptionRepresentation -CommitmentCommitment as per the NomosDA Cryptographic Protocolbytes -ProofProof as per the NomosDA Cryptographic Protocolbytes -ChunksMatrixMatrix of chunked data. Each chunk is 31 bytes. Row and Column sizes depend on the encoding necessities.List[List[bytes]] - - -Encoder -An encoder takes a set of parameters and the blob data, and creates a matrix of chunks that it uses to compute the necessary cryptographic data. It produces the set of Reed-Solomon (RS) encoded data, the commitments, and the proofs that are needed prior to dispersal. -flowchart LR - A[DaEncoderParams] -->|Input| B(Encoder) - I[31bytes-padded-input] -->|Input| B - B -->|Creates| D[Chunks matrix] - D --> |Input| C[NomosDA encoding] - C --> E{Encoded data📄} - -Encoding Process -The encoder executes the encoding process as follows: - - -The encoder takes the following input parameters: -class DAEncoderParams: - column_count: usize - bytes_per_field_element: usize - -NameDescriptionRepresentation -column_countThe number of subnets available for dispersal in the systemusize, int in Python -bytes_per_field_elementThe amount of bytes per data chunk. This is set to 31 bytes. Each chunk has 31 bytes rather than 32 to ensure that the chunk value does not exceed the maximum value on the BLS12-381 elliptic curve.usize, int in Python - - - -The encoder also includes the blob data to be encoded, which must be of a size that is a multiple of bytes_per_field_element bytes. Clients are responsible for padding the data so it fits this constraint. - - -The encoder splits the data into bytes_per_field_element-sized chunks. It also arranges these chunks into rows and columns, creating a matrix. -a. The amount of columns of the matrix needs to fit with the column_count parameter, taking into account the rs_expansion_factor (currently fixed to 2). -i. This means that the size of each row in this matrix is (bytes_per_field_element*column_count)/rs_expansion_factor. -b. The amount of rows depends on the size of the data. - - -The data is encoded as per the cryptographic details. - - -The encoder provides the encoded data set: -NameDescriptionRepresentation -dataOriginal databytes -chunked_dataMatrix before RS expansionChunksMatrix -extended_matrixMatrix after RS expansionChunksMatrix -row_commitmentsCommitments for each matrix rowList[Commitment] -combined_column_proofsProofs for each matrix columnList[Proof] - - -class EncodedData: - data: bytes - chunked_data: ChunksMatrix - extended_matrix: ChunksMatrix - row_commitments: List[Commitment] - combined_column_proofs: List[Proof] - - - -Encoder Limits -NomosDA does not impose a fixed limit on blob size at the encoding level. However, protocols that involve resource-intensive operations must include upper bounds to prevent abuse. In the case of NomosDA, blob size limits are expected to be enforced, as part of the protocol's broader responsibility for resource management and fairness. -Larger blobs naturally result in higher computational and bandwidth costs, particularly for the encoder, who must compute a proof for each column. Without size limits, malicious clients could exploit the system by attempting to stream unbounded data to DA nodes. Since payment is provided before blob dispersal, DA nodes are protected from performing unnecessary work. This enables the protocol to safely accept very large blobs, as the primary computational cost falls on the encoder. The protocol can accommodate generous blob sizes in practice, while rejecting only absurdly large blobs, such as those exceeding 1 GB, to prevent denial-of-service attacks and ensure network stability. -To mitigate this, the protocol define acceptable blob size limits, and DA implementations enforce local mitigation strategies, such as flagging or blacklisting clients that violate these constraints. -Verifier -A verifier checks the proper encoding of data blobs it receives. A verifier executes the verification process as follows: - - -The verifier receives a DAShare with the required verification data: -NameDescriptionRepresentation -columnColumn chunks (31 bytes) from the encoded matrixList[bytes] -column_idxColumn id (0..2047). It is directly related to the subnetworks in the network specification.u16, unsigned int of 16 bits. int in Python -combined_column_proofProof of the random linear combination of the column elements.Proof -row_commitmentsCommitments for each matrix rowList[Commitment] -blob_idThis is computed as the hash (blake2b) of row_commitmentsbytes - - - -Upon receiving the above data it verifies the column data as per the cryptographic details. If the verification is successful, the node triggers the replication protocol and stores the blob. -class DAShare: - column: Column - column_idx: u16 - combined_column_proof: Proof - row_commitments: List[Commitment] - - def blob_id(self) -> BlobId: - hasher = blake2b(digest_size=32) - for c in self.row_commitments: - hasher.update(bytes(c)) - return hasher.digest() - - - -Verification Logic -sequenceDiagram - participant N as Node - participant S as Subnetwork Column N - loop For each incoming blob column - N-->>N: If blob is valid - N-->>S: Replication - N->>N: Stores blob - end - -Details -The encoder and verifier processes described above make use of a variety of cryptographic functions to facilitate the correct verification of column data by verifiers. These functions rely on primitives such as polynomial commitments and Reed-Solomon erasure codes, the details of which are outside the scope of this document. These details, as well as introductions to the cryptographic primitives being used, can be found in the NomosDA Cryptographic Protocol: -NomosDA Cryptographic Protocol -References - -Encoder Specification: GitHub/encoder.py -Verifier Specification: GitHub/verifier.py -Cryptographic protocol: NomosDA Cryptographic Protocol - -Copyright -Copyright and related rights waived via CC0. - -title: NOMOS-DA-NETWORK -name: NomosDA Network -status: raw -category: -tags: network, data-availability, da-nodes, executors, sampling -editor: Daniel Sanchez Quiros danielsq@status.im -contributors: - -Álvaro Castro-Castilla alvaro@status.im -Daniel Kashepava danielkashepava@status.im -Gusto Bacvinka augustinas@status.im -Filip Dimitrijevic filip@status.im - - -Introduction NomosDA is the scalability solution protocol for data availability within the Nomos network. This document delineates the protocol's structure at the network level, identifies participants, @@ -19338,7 +18277,7 @@ and the data is split into a fixed number of portions (see the Overview +Overview Network Participants The NomosDA network includes three categories of participants: @@ -19368,7 +18307,7 @@ and replicated data. Indexing: Tracks and exposes blob metadata on-chain. NomosDA Indexing -Construction +Construction NomosDA Network Registration Entities wishing to participate in NomosDA must declare their role via SDP (Service Declaration Protocol). Once declared, they're accounted for in the subnetwork construction. @@ -19466,7 +18405,7 @@ subgraph Dispersal Executor -->|Disperse| N10 end
messages
HistoryResponse
pubsubtopic
contentFilters
pubsubto scalable infrastructure for developers creating applications for the network state. Published Specifications are currently available here, Nomos Specifications. - -title: NOMOSDA-ENCODING -name: NomosDA Encoding Protocol -status: raw -category: -tags: data-availability -editor: Daniel Sanchez-Quiros danielsq@status.im -contributors: +Nomos Raw Specifications +Early-stage Nomos specifications that have not yet progressed beyond raw status. +NOMOSDA-ENCODING + + +NameNomosDA Encoding Protocol +Statusraw +EditorDaniel Sanchez-Quiros <danielsq@status.im> +ContributorsDaniel Kashepava <danielkashepava@status.im>Álvaro Castro-Castilla <alvaro@status.im>Filip Dimitrijevic <filip@status.im>Thomas Lavaur <thomaslavaur@status.im>Mehmet Gonen <mehmet@status.im> + + + +Timeline -Daniel Kashepava danielkashepava@status.im -Álvaro Castro-Castilla alvaro@status.im -Filip Dimitrijevic filip@status.im -Thomas Lavaur thomaslavaur@status.im -Mehmet Gonen mehmet@status.im +2025-12-22 — b1a5783 — Chore/mdbook updates (#237) +2025-12-18 — d03e699 — ci: add mdBook configuration (#233) +2025-09-25 — 39d6f07 — added nomos/raw/nomosda-encoding.md draft (#156) - + Introduction This document describes the encoding and verification processes of NomosDA, which is the data availability (DA) solution used by the Nomos blockchain. NomosDA provides an assurance that all data from Nomos blobs are accessible and verifiable by every network participant. This document presents an implementation specification describing how: @@ -18997,7 +18087,7 @@ contributors: Encoders encode blobs they want to upload to the Data Availability layer. Other nodes implement the verification of blobs that were already uploaded to DA.
Encoder: An encoder is any actor who performs the encoding process described in this document. This involves committing to the data, generating proofs, and submitting the result to the DA layer.
The encoder and verifier processes described above make use of a variety of cryptographic functions to facilitate the correct verification of column data by verifiers. These functions rely on primitives such as polynomial commitments and Reed-Solomon erasure codes, the details of which are outside the scope of this document. These details, as well as introductions to the cryptographic primitives being used, can be found in the NomosDA Cryptographic Protocol:
NomosDA Cryptographic Protocol
In the Nomos architecture, the rollup sequencer typically acts as the encoder, but the role is not exclusive and any actor in the DA layer can also act as encoders.
Verifier: Verifies its portion of the distributed blob data as per the verification protocol. In the Nomos architecture, the DA nodes act as the verifiers.
In the encoding stage, the encoder takes the DA parameters and the padded blob data and creates an initial matrix of data chunks. This matrix is expanded using Reed-Solomon coding and various commitments and proofs are created for the data.
When a verifier receives a sample, it verifies the data it receives from the encoder and broadcasts the information if the data is verified. Finally, the verifier stores the sample data for the required length of time.
The encoder and verifier use the NomosDA cryptographic protocol to carry out their respective functions. These functions are implemented as abstracted and configurable software entities that allow the original data to be encoded and verified via high-level operations.
Commitment
bytes
Proof
ChunksMatrix
List[List[bytes]]
An encoder takes a set of parameters and the blob data, and creates a matrix of chunks that it uses to compute the necessary cryptographic data. It produces the set of Reed-Solomon (RS) encoded data, the commitments, and the proofs that are needed prior to dispersal.
flowchart LR - A[DaEncoderParams] -->|Input| B(Encoder) - I[31bytes-padded-input] -->|Input| B - B -->|Creates| D[Chunks matrix] - D --> |Input| C[NomosDA encoding] - C --> E{Encoded data📄} -
The encoder executes the encoding process as follows:
The encoder takes the following input parameters:
class DAEncoderParams: - column_count: usize - bytes_per_field_element: usize -
column_count
usize
int
bytes_per_field_element
The encoder also includes the blob data to be encoded, which must be of a size that is a multiple of bytes_per_field_element bytes. Clients are responsible for padding the data so it fits this constraint.
The encoder splits the data into bytes_per_field_element-sized chunks. It also arranges these chunks into rows and columns, creating a matrix. -a. The amount of columns of the matrix needs to fit with the column_count parameter, taking into account the rs_expansion_factor (currently fixed to 2). -i. This means that the size of each row in this matrix is (bytes_per_field_element*column_count)/rs_expansion_factor. -b. The amount of rows depends on the size of the data.
rs_expansion_factor
(bytes_per_field_element*column_count)/rs_expansion_factor
The data is encoded as per the cryptographic details.
The encoder provides the encoded data set:
chunked_data
extended_matrix
row_commitments
List[Commitment]
combined_column_proofs
List[Proof]
class EncodedData: - data: bytes - chunked_data: ChunksMatrix - extended_matrix: ChunksMatrix - row_commitments: List[Commitment] - combined_column_proofs: List[Proof] -
NomosDA does not impose a fixed limit on blob size at the encoding level. However, protocols that involve resource-intensive operations must include upper bounds to prevent abuse. In the case of NomosDA, blob size limits are expected to be enforced, as part of the protocol's broader responsibility for resource management and fairness.
Larger blobs naturally result in higher computational and bandwidth costs, particularly for the encoder, who must compute a proof for each column. Without size limits, malicious clients could exploit the system by attempting to stream unbounded data to DA nodes. Since payment is provided before blob dispersal, DA nodes are protected from performing unnecessary work. This enables the protocol to safely accept very large blobs, as the primary computational cost falls on the encoder. The protocol can accommodate generous blob sizes in practice, while rejecting only absurdly large blobs, such as those exceeding 1 GB, to prevent denial-of-service attacks and ensure network stability.
To mitigate this, the protocol define acceptable blob size limits, and DA implementations enforce local mitigation strategies, such as flagging or blacklisting clients that violate these constraints.
A verifier checks the proper encoding of data blobs it receives. A verifier executes the verification process as follows:
The verifier receives a DAShare with the required verification data:
DAShare
column
List[bytes]
column_idx
0..2047
subnetworks
u16
combined_column_proof
blob_id
Upon receiving the above data it verifies the column data as per the cryptographic details. If the verification is successful, the node triggers the replication protocol and stores the blob.
class DAShare: - column: Column - column_idx: u16 - combined_column_proof: Proof - row_commitments: List[Commitment] - - def blob_id(self) -> BlobId: - hasher = blake2b(digest_size=32) - for c in self.row_commitments: - hasher.update(bytes(c)) - return hasher.digest() -
sequenceDiagram - participant N as Node - participant S as Subnetwork Column N - loop For each incoming blob column - N-->>N: If blob is valid - N-->>S: Replication - N->>N: Stores blob - end -
NomosDA is the scalability solution protocol for data availability within the Nomos network. This document delineates the protocol's structure at the network level, identifies participants, @@ -19338,7 +18277,7 @@ and the data is split into a fixed number of portions (see the Overview +
The NomosDA network includes three categories of participants:
Entities wishing to participate in NomosDA must declare their role via SDP (Service Declaration Protocol). Once declared, they're accounted for in the subnetwork construction.
The NomosDA network is engineered for connection efficiency. Executors manage numerous open connections, @@ -19485,7 +18424,7 @@ triggering the specific protocol once established:
The Nomos network is designed to be inclusive and accessible across a wide range of hardware configurations. By defining clear hardware requirements for different node types, we enable:
Important Notice: These hardware requirements are preliminary and subject to revision based on implementation testing and real-world network performance data.
Hardware requirements vary based on the node's role and services:
Light Nodes provide network verification with minimal resource requirements, suitable for resource-constrained environments.
Target Use Cases:
Network Address Translation presents a critical challenge for Nomos participants, particularly those operating on consumer hardware without technical expertise. The Nomos network requires a NAT traversal solution that:
The solution must ensure that nodes can both establish outbound connections and accept inbound connections from other peers, maintaining network connectivity across diverse NAT configurations.
The Nomos P2P network bootstrapping strategy relies on a designated subset of bootstrap nodes to facilitate secure and efficient node onboarding. These nodes serve as the initial entry points for new network participants.
Bootstrap nodes operate under a minimal trust model:
The Nomos blockchain requires a reliable, scalable P2P network that can:
The Nomos P2P network addresses three critical challenges:
Original working document, from Nomos Notion: P2P Network Specification.
The requirements for the protocol are defined as follows:
The SDP enables nodes to declare their eligibility to serve a specific service in the system, and withdraw their declarations.
The protocol defines the following actions:
💡 The protocol messages are subject to a finality that means messages become part of the immutable ledger after a delay. The delay at which it happens is defined by the consensus.
In this section, we present the main constructions of the protocol. First, we start with data definitions. Second, we describe the protocol actions. Finally, we present part of the Bedrock Mantle design responsible for storing and processing SDP-related messages and data.
In this section, we discuss and define data types, messages, and their storage.
Refer to the Mantle Specification for a list of potential improvements to the protocol.
This document specifies Claro: a Byzantine, fault-tolerant, binary decision agreement algorithm that utilizes bounded memory for its execution. Claro is a novel variant of the Snow family providing a probabilistic @@ -20736,7 +19694,7 @@ in order to disambiguate from a previously released research endeavor by Amores-Sesar, Cachin, and Tedeschi. Their naming was coincidentally named the same as our work but is sufficiently differentiated from how ours works.
This work is a part of a larger research endeavor to explore highly scalable Byzantine Fault Tolerant (BFT) consensus protocols. Consensus lies at the heart of many decentralized protocols, and @@ -21271,8 +20229,8 @@ three possible values of the opinion:
the parity summations across network invariants often become easier to manipulate.
In practice, each honest node gossips its current opinion which reduces the number of messages that need to be gossiped for a given proposal. The resulting impact on the privacy of the node's opinion @@ -21371,695 +20329,34 @@ Move: a Language for Writing DAG Abstractions
json-ld
Copyright and related rights waived via -CC0
This document specifies Claro: a Byzantine, fault-tolerant, binary decision -agreement algorithm that utilizes bounded memory for its execution. -Claro is a novel variant of the Snow family providing a probabilistic -leaderless BFT consensus algorithm that achieves metastablity via -network sub-sampling. We present an application context of the use of -Claro in an efficient, leaderless, probabilistic permission-less -consensus mechanism. We outline a simple taxonomy of Byzantine -adversaries, leaving explicit explorations of to subsequent -publication.
NOTE: We have renamed this variant to Claro from Glacier -in order to disambiguate from a previously released research endeavor by -Amores-Sesar, Cachin, and Tedeschi. -Their naming was coincidentally named the same as our work but -is sufficiently differentiated from how ours works.
Claro
Glacier
This work is a part of a larger research endeavor to -explore highly scalable Byzantine Fault Tolerant (BFT) consensus protocols. -Consensus lies at the heart of many decentralized protocols, and -thus its characteristics and properties are inherited by applications built on top. -Thus, we seek to improve upon the current state of the art in two main directions: -base-layer scalability and censorship resistance.
Avalanche has shown to exibit the former in a production environment in a way -that is differentiated from Nakamoto consensus and -other Proof of Stake (PoS) protocols based in practical Byzantine Fault Tolerant -(pBFT) methodologies. -We aim to understand its limitations and improve upon them.
Our starting point is Avalanche’s Binary Byzantine Agreement algorithm, -called Snowball. -As long as modifications allow a DAG to be constructed later on, -this simplifies the design significantly. -The DAG stays the same in principle: it supports confidence, -but the core algorithm can be modeled without.
The concept of the Snowball algorithm is relatively simple. -Following is a simplified description (lacking some details, but giving an overview). -For further details, please refer to the Avalanche paper.
alpha
beta
Next, we will proceed to describe our new algorithm, based on Snowball.
We have identified a shortcoming of the Snowball algorithm -that was a perfect starting point for devising improvements. -The scenario is as follows:
This document only outlines the specification to Claro. -Subsequent analysis work on Claro -(both on its performance and how it differentiates with Snowball) -will be published shortly and this document will be updated.
The Claro consensus algorithm computes a boolean decision on a -proposition via a set of distributed computational nodes. Claro is -a leaderless, probabilistic, binary consensus algorithm with fast -finality that provides good reliability for network and Byzantine -fault tolerance.
Claro is an evolution of the Snowball Byzantine Binary Agreement (BBA) algorithm, -in which we tackle specifically the perceived weakness described above. -The main focus is going to be the counter and the triggering of the reset. -Following, we elaborate the different modifications and -features that have been added to the reference algorithm:
It’s worth delving a bit into the way the data is interpreted -in order to reach a decision. -Our approach is based conceptually on the paper Confidence as Higher-Order Uncertainty, -which describes a frequentist approach to decision certainty. -The first-order certainty, measured by frequency, -is caused by known positive evidence, and -the higher-order certainty is caused by potential positive evidence. -Because confidence is a relative measurement defined on evidence, -it naturally follows comparing the amount of evidence the system knows -with the amount that it will know in the near future (defining “near” as a constant).
Intuitively, we are looking for a function of evidence, w, -call it c for confidence, that satisfies the following conditions:
w
c
w = 0
c = 0
The paper describes also a set of operations for the evidence/confidence pairs, -so that different sources of knowledge could be combined. -However, we leave here the suggestion of a possible research line in the future -combining an algebra of evidence/confidence pairs with -swarm-propagation algorithm like the one described in -this paper.
A proposal is formulated to which consensus of truth or falsity is -desired. Each node that participates starts the protocol with an -opinion on the proposal, represented in the sequel as NO, NONE, -and YES.
NO
NONE
YES
A new proposition is discovered either by local creation or in -response to a query, a node checks its local opinion. If the node can -compute a justification of the proposal, it sets its opinion to one of -YES or NO. If it cannot form an opinion, it leaves its opinion as -NONE.
For now, we will ignore the proposal dissemination process and -assume all nodes participating have an initial opinion -to respond to within a given request. -Further research will relax this assumption and -analyze timing attacks on proposal propagation through the network.
The node then participates in a number of query rounds in which it -solicits other node's opinion in query rounds. Given a set of N -leaderless computational nodes, a gossip-based protocol is presumed to -exist which allows members to discover, join, and leave a weakly -transitory maximally connected graph. Joining this graph allows each -node to view a possibly incomplete node membership list of all other -nodes. This view may change as the protocol advances, as nodes join -and leave. Under generalized Internet conditions, the membership of -the graph would experience a churn rate varying across different -time-scales, as the protocol rounds progress. As such, a given node -may not have a view on the complete members participating in the -consensus on a proposal in a given round.
N
The algorithm is divided into 4 phases:
confidence
evidence
accumulated evidence
The node initializes the following integer ratios as constants:
# The following values are constants chosen with justification from experiments -# performed with the adversarial models - -# -confidence_threshold - <-- 1 - -# constant look ahead for number of rounds we expect to finalize a -# decision. Could be set dependent on number of nodes -# visible in the current gossip graph. -look_ahead - <-- 19 - -# the confidence weighting parameter (aka alpha_1) -certainty - <-- 4 / 5 -doubt ;; the lack of confidence weighting parameter (aka alpha_2) - <-- 2 / 5 - -k_multiplier ;; neighbor threshold multiplier - <-- 2 - -;;; maximal threshold multiplier, i.e. we will never exceed -;;; questioning k_initial * k_multiplier ^ max_k_multiplier_power peers -max_k_multiplier_power - <-- 4 - -;;; Initial number of nodes queried in a round -k_initial - <-- 7 - -;;; maximum query rounds before termination -max_rounds ;; placeholder for simulation work, no justification yet - <-- 100 -
The following variables are needed to keep the state of Claro:
;; current number of nodes to attempt to query in a round -k - <-- k_original - -;; total number of votes examined over all rounds -total_votes - <-- 0 -;; total number of YES (i.e. positive) votes for the truth of the proposal -total_positive - <-- 0 -;; the current query round, an integer starting from zero -round - <-- 0 -
A node selects k nodes randomly from the complete pool of peers in the -network. This query is can optionally be weighted, so the probability -of selecting nodes is proportional to their
k
Node Weighting -$$ -P(i) = \frac{w_i}{\sum_{j=0}^{j=N} w_j} -$$
where w is evidence. -The list of nodes is maintained by a separate protocol (the network layer), -and eventual consistency of this knowledge in the network -suffices. Even if there are slight divergences in the network view -from different nodes, the algorithm is resilient to those.
A query is sent to each neighbor with the node's current opinion of -the proposal.
opinion
Each node replies with their current opinion on the proposal.
See the wire protocol Interoperability section for -details on the semantics and syntax of the "on the wire" -representation of this query.
Adaptive querying. An additional optimization in the query -consists of adaptively growing the k constant in the event of -high confusion. We define high confusion as the situation in -which neither opinion is strongly held in a query (i.e. a -threshold is not reached for either yes or no). For this, we will -use the alpha threshold defined below. This adaptive growth of -the query size is done as follows:
Every time the threshold is not reached, we multiply k by a -constant. In our experiments, we found that a constant of 2 works -well, but what really matters is that it stays within that order of -magnitude.
The growth is capped at 4 times the initial k value. Again, this -is an experimental value, and could potentially be increased. This -depends mainly on complex factors such as the size of the query -messages, which could saturate the node bandwidth if the number of -nodes queried is too high.
When the query finishes, the node now initializes the following two -values:
new_votes - <-- |total vote replies received in this round to the current query| - positive_votes - <-- |YES votes received from the query| -
When the query returns, three ratios are used later on to compute the -transition function and the opinion forming. Confidence encapsulates -the notion of how much we know (as a node) in relation to how much we -will know in the near future (this being encoded in the look-ahead -parameter l.) Evidence accumulated keeps the ratio of total positive -votes vs the total votes received (positive and negative), whereas the -evidence per round stores the ratio of the current round only.
l
Parameters -$$ -\begin{array}{lc} -\text{Look-ahead parameter} & l = 20 \newline -\text{First evidence parameter} & \alpha_1 = 0.8 \newline -\text{Second evidence parameter} & \alpha_2 = 0.5 \newline -\end{array} -$$
Computation -$$ -\begin{array}{lc} -\text{Confidence} & c_{accum} \impliedby \frac{total\ votes} -{total\ votes + l} \newline -\text{Total accumulated evidence}& e_{accum} \impliedby \frac{total\ positive -votes}{total\ votes} \newline -\text{Evidence per round} & e_{round} \impliedby \frac{round\ positive -votes}{round\ votes} \newline -\end{array} -$$
The node runs the new_votes and positive_votes parameters received -in the query round through the following algorithm:
new_votes
positive_votes
- total_votes - +== new_votes - total_positive - +== positive_votes - confidence - <-- total_votes / (total_votes + look_ahead) - total_evidence - <-- total_positive / total_votes - new_evidence - <-- positive_votes / new_votes - evidence - <-- new_evidence * ( 1 - confidence ) + total_evidence * confidence - alpha - <-- doubt * ( 1 - confidence ) + certainty * confidence -
In order to eliminate the need for a step function (a conditional in -the code), we introduce a transition function from one regime to the -other. Our interest in removing the step function is twofold:
Simplify the algorithm. With this change the number of branches is -reduced, and everything is expressed as a set of equations.
The transition function makes the regime switch smooth, -making it harder to potentially exploit the sudden regime change in -some unforeseen manner. Such a swift change in operation mode could -potentially result in a more complex behavior than initially -understood, opening the door to elaborated attacks. The transition -function proposed is linear with respect to the confidence.
Transition Function -$$ -\begin{array}{cl} -evidence & \impliedby e_{round} (1 - c_{accum}) + e_{accum} c_{accum} \newline -\alpha & \impliedby \alpha_1 (1 - c_{accum}) + \alpha_2 c_{accum} \newline -\end{array} -$$
Since the confidence is modeled as a ratio that depends on the -constant l, we can visualize the transition function at -different values of l. Recall that this constant encapsulates -the idea of “near future” in the frequentist certainty model: the -higher it is, the more distant in time we consider the next -valuable input of evidence to happen.
We have observed via experiment that for a transition function to be -useful, we need establish two requirements:
The change has to be balanced and smooth, giving an -opportunity to the first regime to operate and not jump directly -to the second regime.
The convergence to 1.0 (fully operating in the second regime) -should happen within a reasonable time-frame. We’ve set this -time-frame experimentally at 1000 votes, which is in the order of -~100 queries given a k of 9.
[[ Note: Avalanche uses k = 20, as an experimental result from their -deployment. Due to the fundamental similarities between the -algorithms, it’s a good start for us. ]]
The node updates its local opinion on the consensus proposal by -examining the relationship between the evidence accumulated for a -proposal with the confidence encoded in the alpha parameter:
IF - evidence > alpha - THEN - opinion <-- YES - ELSE IF - evidence < 1 - alpha - THEN - opinion <-- NO -
If the opinion of the node is NONE after evaluating the relation -between evidence and alpha, adjust the number of uniform randomly -queried nodes by multiplying the neighbors k by the k_multiplier -up to the limit of k_max_multiplier_power query size increases.
k_multiplier
k_max_multiplier_power
- ;; possibly increase number nodes to uniformly randomly query in next round - WHEN - opinion is NONE - AND - k < k_original * k_multiplier ^ max_k_multiplier_power - THEN - k <-- k * k_multiplier -
The next step is a simple one: change our opinion if the threshold -alpha is reached. This needs to be done separately for the YES/NO -decision, checking both boundaries. The last step is then to decide -on the current opinion. For that, a confidence threshold is -employed. This threshold is derived from the network size, and is -directly related to the number of total votes received.
YES/NO
decide
Decision -$$ -\begin{array}{cl} -evidence > \alpha & \implies \text{opinion YES} \newline -evidence < 1 - \alpha & \implies \text{opinion NO} \newline -if\ \text{confidence} > c_{target} & THEN \ \text{finalize decision} \newline -\end{array} -$$
After the OPINION phase is executed, the current value of confidence -is considered: if confidence exceeds a threshold derived from the -network size and directly related to the total votes received, an -honest node marks the decision as final, and always returns this -opinion is response to further queries from other nodes on the -network.
OPINION
- IF - confidence > confidence_threshold - OR - round > max_rounds - THEN - finalized <-- T - QUERY LOOP TERMINATES - ELSE - round +== 1 - QUERY LOOP CONTINUES -
Thus, after the decision phase, either a decision has been finalized -and the local node becomes quiescent never initiating a new query, or -it initiates a new query.
A local round of Claro terminates in one of the following -execution model considerations:
No queries are received for any newly initiated round for temporal -periods observed via a locally computed passage of time. See the -following point on local time.
The confidence on the proposal exceeds our threshold for -finalization.
The number of rounds executed would be greater than -max_rounds.
rounds
max_rounds
After a local node has finalized an opinion into a decision, it enters a quiescent -state whereby it never solicits new votes on the proposal. The local -node MUST reply with the currently finalized decision.
decision
The algorithm only requires that nodes have computed the drift of -observation of the passage of local time, not that that they have -coordinated an absolute time with their peers. For an implementation -of a phase locked-loop feedback to measure local clock drift see -NTP.
In the query step, the node is envisioned as packing information into -the query to cut down on the communication overhead a query to each of -this k nodes containing the node's own current opinion on the -proposal (YES, NO, or NONE). The algorithm does not currently -specify how a given node utilizes this incoming information. A -possible use may be to count unsolicited votes towards a currently -active round, and discard the information if the node is in a -quiescent state.
If the view of other nodes is incomplete, then the sum of the optional -weighting will not be a probability distribution normalized to 1.
The current algorithm doesn't describe how the initial opinions are formed.
The following implementations have been created for various testing and -simulation purposes:
For interoperability we present a wire protocol semantics by requiring -the validity of the following statements expressed in Notation3 (aka -n3) about any query performed by a query node:
n3
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . -@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . -@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . - -@prefix Claro <https://rdf.logos.co/protocol/Claro#> . - -Claro:query - :holds ( - :_0 [ rdfs:label "round"; - a xsd:postitiveInteger; ], - rdfs:comment """ -The current round of this query - -A value of zero corresponds to the initial round. -""" ; - - :_1 [ rdfs:label "uri"; - rdfs:comment """ -A unique URI for the proposal. - -It MAY be possible to examine the proposal by resolving this resource, -and its associated URIs. -""" ; - a xsd:anyURI ], - - :_2 [ rdfs:label "opinion"; - rdfs:comment """ -The opinion on the proposal - -One of the strings "YES" "NO" or "NONE". -""" ; - # TODO constrain as an enumeration on three values efficiently - a xsd:string ] - ) . -
Nodes are advised to use Waku messages to include their own -metadata in serializations as needed.
The semantic description presented above can be reliably round-tripped -through a suitable serialization mechanism. JSON-LD provides a -canonical mapping to UTF-8 JSON.
At their core, the query messages are a simple enumeration of the -three possible values of the opinion:
-{ NO, NONE, YES } -
{ NO, NONE, YES }
When represented via integers, such as choosing
-{ -1, 0, +1 } -
{ -1, 0, +1 }
the parity summations across network invariants often become easier to -manipulate.
In practice, each honest node gossips its current opinion which -reduces the number of messages that need to be gossiped for a given -proposal. The resulting impact on the privacy of the node's opinion -is not currently analyzed.
Adversarial models have been tested for which the values for current -parameters of Claro have been tuned. Exposition of the -justification of this tuning need to be completed.
A random adversary optionally chooses to respond to all queries with a -random decision. Note that this adversary may be in some sense -Byzantine but not malicious. The random adversary also models some -software defects involved in not "understanding" how to derive a truth -value for a given proposition.
Like a petulant child, an infantile adversary responds with the -opposite vote of the honest majority on an opinion.
Omniscient adversaries have somehow gained an "unfair" participation in -consensus by being able to control f of N nodes with a out-of-band -"supra-liminal" coordination mechanism. Such adversaries use this -coordinated behavior to delay or sway honest majority consensus.
f
The passive network omniscient adversary is fully aware at all times -of the network state. Such an adversary can always chose to vote in -the most efficient way to block the distributed consensus from -finalizing.
An omniscient gossip adversary somehow not only controls f of N -nodes, but has also has corrupted communications between nodes such -that she may inspect, delay, and drop arbitrary messages. Such an -adversary uses capability to corrupt consensus away from honest -decisions to ones favorable to itself. This adversary will, of -course, choose to participate in an honest manner until defecting is -most advantageous.
Although we have proposed a normative description of the -implementation of the underlying binary consensus algorithm (Claro), -we believe we have prepared for analysis its adversarial performance -in a manner that is amenable to replacement by another member of the -snow* family.
We have presumed the existence of a general family of algorithms that -can be counted on to vote on nodes in the DAG in a fair manner. -Avalanche provides an example of the construction of votes on UTXO -transactions. One can express all state machine, i.e. account-based -models as checkpoints anchored in UTXO trust, so we believe that this -presupposition has some justification. We can envision a need for -tooling abstraction that allow one to just program the DAG itself, as -they should be of stable interest no matter if Claro isn't.
Logos
On BFT Consensus Evolution: From Monolithic to -DAG
snow-ipfs
snow* The Snow family of -algorithms
Move -Move: a Language for Writing DAG Abstractions
rdf
rdfs
xsd
n3-w3c-notes
ntp
Copyright and related rights waived via CC0
Specifications related the Codex decentralised data storage platform. Visit Codex specs to view the new Codex specifications currently under discussion.
Sections marked with notes indicate areas where implementation details may differ from this specification.
The Block Exchange (BE) is a core Codex component responsible for peer-to-peer content distribution across the network. It manages the sending and receiving of data blocks between nodes, @@ -22083,7 +20380,7 @@ fixed-length chunks of arbitrary data.
The Block Exchange module serves as the fundamental layer for content distribution in the Codex network. It provides primitives for requesting and delivering blocks of data @@ -23431,7 +21728,7 @@ to callers only after system-level retries are exhausted
Protocol Buffers: Using Protocol Buffers provides efficient serialization, forward compatibility, and wide language support.
The Block Exchange (BE) is a core Codex component responsible for -peer-to-peer content distribution across the network. -It manages the sending and receiving of data blocks between nodes, -enabling efficient data sharing and retrieval. -This specification defines both an internal service interface and a -network protocol for referring to and providing data blocks. -Blocks are uniquely identifiable by means of an address and represent -fixed-length chunks of arbitrary data.
The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", -"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this -document are to be interpreted as described in -RFC 2119.
The Block Exchange module serves as the fundamental layer for content -distribution in the Codex network. -It provides primitives for requesting and delivering blocks of data -between peers, supporting both standalone blocks and blocks that are -part of larger datasets. -The protocol is designed to work over libp2p streams and integrates -with Codex's discovery, storage, and payment systems.
When a peer wishes to obtain a block, it registers its unique address -with the Block Exchange, and the Block Exchange will then be in charge -of procuring it by finding a peer that has the block, if any, and then -downloading it. -The Block Exchange will also accept requests from peers which might -want blocks that the node has, and provide them.
Discovery Separation: Throughout this specification we assume that -if a peer wants a block, then the peer has the means to locate and -connect to peers which either: (1) have the block; or (2) are -reasonably expected to obtain the block in the future. -In practical implementations, the Block Exchange will typically require -the support of an underlying discovery service, e.g., the Codex DHT, -to look up such peers, but this is beyond the scope of this document.
The protocol supports two distinct block types to accommodate different -use cases: standalone blocks for independent data chunks and dataset -blocks for ordered collections of data that form larger structures.
The Block Exchange protocol supports two types of blocks:
Standalone blocks are self-contained pieces of data addressed by their -SHA256 content identifier (CID). -These blocks are independent and do not reference any larger structure.
Properties:
Dataset blocks are part of ordered sets and are addressed by a -(datasetCID, index) tuple. -The datasetCID refers to the Merkle tree root of the entire dataset, -and the index indicates the block's position within that dataset.
(datasetCID, index)
Formally, we can define a block as a tuple consisting of raw data and -its content identifier: (data: seq[byte], cid: Cid), where standalone -blocks are addressed by cid, and dataset blocks can be addressed -either by cid or a (datasetCID, index) tuple.
(data: seq[byte], cid: Cid)
cid
(treeCID, index)
All blocks in the Codex Block Exchange protocol adhere to the -following specifications:
codex-block
sha2-256
Note: *The multicodec value 0xCD02 is not currently registered in the official multiformats multicodec table. This may be a reserved/private code pending official registration.
To ensure network stability and prevent resource exhaustion, implementations -SHOULD enforce reasonable limits. The following are recommended values -(actual implementation limits may vary):
Note: These values are not verified from implementation and serve as -reasonable guidelines. Actual implementations MAY use different limits based -on their resource constraints and deployment requirements.
Enforcement:
The Block Exchange module exposes two core primitives for -block management:
requestBlock
async def requestBlock(address: BlockAddress) -> Block -
Registers a block address for retrieval and returns the block data -when available. -This function can be awaited by the caller until the block is retrieved -from the network or local storage.
Parameters:
address
Returns:
Block
cancelRequest
async def cancelRequest(address: BlockAddress) -> bool -
Cancels a previously registered block request.
bool
The Block Exchange module depends on and interacts with several other -Codex components:
The Block Exchange protocol uses the following libp2p protocol -identifier:
/codex/blockexc/1.0.0 -
The protocol version is negotiated through libp2p's multistream-select -protocol during connection establishment. The following describes standard -libp2p version negotiation behavior; actual Codex implementation details -may vary.
Version Format: /codex/blockexc/<major>.<minor>.<patch>
/codex/blockexc/<major>.<minor>.<patch>
Current Version: 1.0.0
1.0.0
1. Initiator opens stream -2. Initiator proposes: "/codex/blockexc/1.0.0" -3. Responder checks supported versions -4. If supported: - Responder accepts: "/codex/blockexc/1.0.0" - → Connection established -5. If not supported: - Responder rejects with: "na" (not available) - → Try fallback version or close connection -
Major Version Compatibility:
1.x.x
2.x.x
Minor Version Compatibility:
1.1.0
Patch Version Compatibility:
Implementations MAY support multiple protocol versions simultaneously:
Supported protocols (in preference order): - 1. /codex/blockexc/1.2.0 (preferred, latest features) - 2. /codex/blockexc/1.1.0 (fallback, stable) - 3. /codex/blockexc/1.0.0 (legacy support) -
Negotiation Strategy:
For optional features within same major.minor version:
Method 1: Message field presence - - Send message with optional field - - Peer ignores if not supported (protobuf default) - -Method 2: Capability exchange (future extension) - - Exchange capability bitmask in initial message - - Enable features only if both peers support -
Backward Compatibility:
Forward Compatibility:
The protocol operates over libp2p streams. -When a node wants to communicate with a peer:
The protocol handles peer lifecycle events:
This section illustrates typical message exchange sequences for common -block exchange scenarios.
Scenario: Node A requests a standalone block from Node B
Node A Node B - | | - |--- Message(wantlist) ------------------>| - | wantlist.entries[0]: | - | address.cid = QmABC123 | - | wantType = wantBlock | - | priority = 0 | - | | - |<-- Message(blockPresences, payload) ----| - | blockPresences[0]: | - | address.cid = QmABC123 | - | type = presenceHave | - | payload[0]: | - | cid = QmABC123 | - | data = <64 KiB block data> | - | address.cid = QmABC123 | - | | -
Steps:
wantType = wantBlock
Scenario: Node A requests a dataset block from Node B
Node A Node B - | | - |--- Message(wantlist) ------------------>| - | wantlist.entries[0]: | - | address.leaf = true | - | address.treeCid = QmTree456 | - | address.index = 42 | - | wantType = wantBlock | - | | - |<-- Message(payload) ---------------------| - | payload[0]: | - | cid = QmBlock789 | - | data = <64 KiB zero-padded data> | - | address.leaf = true | - | address.treeCid = QmTree456 | - | address.index = 42 | - | proof = <CodexProof bytes> | - | | -
Scenario: Node A checks if Node B has a block without requesting full data
Node A Node B - | | - |--- Message(wantlist) ------------------>| - | wantlist.entries[0]: | - | address.cid = QmCheck999 | - | wantType = wantHave | - | sendDontHave = true | - | | - |<-- Message(blockPresences) -------------| - | blockPresences[0]: | - | address.cid = QmCheck999 | - | type = presenceHave | - | price = 0x00 (free) | - | | -
wantType = wantHave
Scenario: Node A requests block Node B doesn't have
Node A Node B - | | - |--- Message(wantlist) ------------------>| - | wantlist.entries[0]: | - | address.cid = QmMissing111 | - | wantType = wantBlock | - | sendDontHave = true | - | | - |<-- Message(blockPresences) -------------| - | blockPresences[0]: | - | address.cid = QmMissing111 | - | type = presenceDontHave | - | | -
sendDontHave = true
presenceDontHave
Scenario: Node A cancels a previous block request
Node A Node B - | | - |--- Message(wantlist) ------------------>| - | wantlist.entries[0]: | - | address.cid = QmCancel222 | - | cancel = true | - | | -
cancel = true
Scenario: Node A adds requests to existing WantList
Node A Node B - | | - |--- Message(wantlist) ------------------>| - | wantlist.full = false | - | wantlist.entries[0]: | - | address.cid = QmNew1 | - | wantType = wantBlock | - | wantlist.entries[1]: | - | address.cid = QmNew2 | - | wantType = wantBlock | - | | -
full = false
These diagrams illustrate the complete flow of block exchange operations -including service interface, peer discovery, and network protocol interactions.
The protocol supports two strategies for WantBlock requests, -each with different trade-offs. -Implementations may choose the strategy based on network conditions, -peer availability, and resource constraints.
In this strategy, the requester sends wantType = wantBlock to all -discovered peers simultaneously. -This minimizes latency as the first peer to respond with the block -data wins, but it wastes bandwidth since multiple peers may send -the same block data.
Trade-offs:
sequenceDiagram - participant Client - participant BlockExchange - participant LocalStore - participant Discovery - participant PeerA - participant PeerB - participant PeerC - - Client->>BlockExchange: requestBlock(address) - BlockExchange->>LocalStore: checkBlock(address) - LocalStore-->>BlockExchange: Not found - - BlockExchange->>Discovery: findPeers(address) - Discovery-->>BlockExchange: [PeerA, PeerB, PeerC] - - par Send wantBlock to all peers - BlockExchange->>PeerA: Message(wantlist: wantBlock) - BlockExchange->>PeerB: Message(wantlist: wantBlock) - BlockExchange->>PeerC: Message(wantlist: wantBlock) - end - - Note over PeerA,PeerC: All peers start preparing block data - - PeerB-->>BlockExchange: Message(payload: BlockDelivery) - Note over BlockExchange: First response wins - - BlockExchange->>BlockExchange: Verify block - BlockExchange->>LocalStore: Store block - - par Cancel requests to other peers - BlockExchange->>PeerA: Message(wantlist: cancel) - BlockExchange->>PeerC: Message(wantlist: cancel) - end - - Note over PeerA,PeerC: May have already sent data (wasted bandwidth) - - BlockExchange-->>Client: Return block -
In this strategy, the requester first sends wantType = wantHave to -discover which peers have the block, then sends wantType = wantBlock -only to a single selected peer. -This conserves bandwidth but adds an extra round-trip of latency.
sequenceDiagram - participant Client - participant BlockExchange - participant LocalStore - participant Discovery - participant PeerA - participant PeerB - participant PeerC - - Client->>BlockExchange: requestBlock(address) - BlockExchange->>LocalStore: checkBlock(address) - LocalStore-->>BlockExchange: Not found - - BlockExchange->>Discovery: findPeers(address) - Discovery-->>BlockExchange: [PeerA, PeerB, PeerC] - - Note over BlockExchange: Phase 1: Discovery - - par Send wantHave to all peers - BlockExchange->>PeerA: Message(wantlist: wantHave) - BlockExchange->>PeerB: Message(wantlist: wantHave) - BlockExchange->>PeerC: Message(wantlist: wantHave) - end - - PeerA-->>BlockExchange: BlockPresence(presenceDontHave) - PeerB-->>BlockExchange: BlockPresence(presenceHave, price=X) - PeerC-->>BlockExchange: BlockPresence(presenceHave, price=Y) - - BlockExchange->>BlockExchange: Select best peer (PeerB: lower price) - - Note over BlockExchange: Phase 2: Retrieval - - BlockExchange->>PeerB: Message(wantlist: wantBlock) - PeerB-->>BlockExchange: Message(payload: BlockDelivery) - - BlockExchange->>BlockExchange: Verify block - BlockExchange->>LocalStore: Store block - BlockExchange-->>Client: Return block -
Implementations MAY combine both strategies:
flowchart TD - A[Block Request] --> B{Block Size?} - B -->|Small < 64 KiB| C[Parallel Strategy] - B -->|Large >= 64 KiB| D{Paid Content?} - D -->|Yes| E[Two-Phase Discovery] - D -->|No| F{Network Condition?} - F -->|Reliable| E - F -->|Unreliable| C - C --> G[Return Block] - E --> G -
sequenceDiagram - participant Requester - participant Provider - participant Verifier - - Requester->>Provider: WantList(leaf=true, treeCid, index) - Provider->>Provider: Load block at index - Provider->>Provider: Generate CodexProof - Provider->>Requester: BlockDelivery(data, proof) - - Requester->>Verifier: Verify proof - - alt Proof valid - Verifier-->>Requester: Valid - Requester->>Requester: Verify CID - alt CID matches - Requester->>Requester: Store block - Requester-->>Requester: Success - else CID mismatch - Requester->>Requester: Reject block - Requester->>Provider: Disconnect - end - else Proof invalid - Verifier-->>Requester: Invalid - Requester->>Requester: Reject block - Requester->>Provider: Disconnect - end -
sequenceDiagram - participant Buyer - participant Seller - participant StateChannel - - Buyer->>Seller: Message(wantlist) - Seller->>Seller: Check block availability - Seller->>Buyer: BlockPresence(price) - - alt Buyer accepts price - Buyer->>StateChannel: Create update - StateChannel-->>Buyer: Signed state - Buyer->>Seller: Message(payment: StateChannelUpdate) - Seller->>StateChannel: Verify update - - alt Payment valid - StateChannel-->>Seller: Valid - Seller->>Buyer: BlockDelivery(data) - Buyer->>Buyer: Verify block - Buyer->>StateChannel: Finalize - else Payment invalid - StateChannel-->>Seller: Invalid - Seller->>Buyer: BlockPresence(price) - end - else Buyer rejects price - Buyer->>Seller: Message(wantlist.cancel) - end -
sequenceDiagram - participant Network - participant BlockExchange - participant PeerStore - participant Peer - - Network->>BlockExchange: PeerJoined(Peer) - BlockExchange->>PeerStore: AddPeer(Peer) - BlockExchange->>Peer: Open stream - - loop Active exchange - BlockExchange->>Peer: Message(wantlist/payload) - Peer->>BlockExchange: Message(payload/presence) - end - - alt Graceful disconnect - Peer->>BlockExchange: Close stream - BlockExchange->>PeerStore: RemovePeer(Peer) - else Connection failure - Network->>BlockExchange: PeerDropped(Peer) - BlockExchange->>PeerStore: RemovePeer(Peer) - BlockExchange->>BlockExchange: Requeue pending requests - end -
All messages use Protocol Buffers encoding for serialization. -The main message structure supports multiple operation types in a -single message.
message Message { - Wantlist wantlist = 1; - // Field 2 reserved for future use - repeated BlockDelivery payload = 3; - repeated BlockPresence blockPresences = 4; - int32 pendingBytes = 5; - AccountMessage account = 6; - StateChannelUpdate payment = 7; -} -
Fields:
wantlist
blockPresences
pendingBytes
account
payment
Note on Missing Field 2:
Field number 2 is intentionally skipped in the Message protobuf definition. -This is a common protobuf practice for several reasons:
The gap does not affect protocol operation. Protobuf field numbers need not be -sequential, and skipping numbers is standard practice for protocol evolution.
The BlockAddress structure supports both standalone and dataset -block addressing:
message BlockAddress { - bool leaf = 1; - bytes treeCid = 2; // Present when leaf = true - uint64 index = 3; // Present when leaf = true - bytes cid = 4; // Present when leaf = false -} -
leaf
treeCid
leaf = true
index
leaf = false
Addressing Modes:
The WantList communicates which blocks a peer desires to receive:
message Wantlist { - enum WantType { - wantBlock = 0; - wantHave = 1; - } - - message Entry { - BlockAddress address = 1; - int32 priority = 2; - bool cancel = 3; - WantType wantType = 4; - bool sendDontHave = 5; - } - - repeated Entry entries = 1; - bool full = 2; -} -
WantType Values:
wantBlock (0)
wantHave (1)
Entry Fields:
priority
cancel
wantType
sendDontHave
Priority Field Clarification:
The priority field is currently fixed at 0 in all implementations and is -reserved for future protocol extensions. Originally intended for request -prioritization, this feature is not yet implemented.
Current Behavior:
priority = 0
Future Extensions:
The priority field is reserved for:
Implementation Notes:
WantList Fields:
entries
full
Delta Updates:
WantLists support delta updates for efficiency. -When full = false, entries represent additions or modifications to -the existing WantList rather than a complete replacement.
Block deliveries contain the actual block data along with verification -information:
message BlockDelivery { - bytes cid = 1; - bytes data = 2; - BlockAddress address = 3; - bytes proof = 4; -} -
proof
Merkle Proof Verification:
When delivering dataset blocks (address.leaf = true):
address.leaf = true
Block presence messages indicate whether a peer has or does not have a -requested block:
enum BlockPresenceType { - presenceHave = 0; - presenceDontHave = 1; -} - -message BlockPresence { - BlockAddress address = 1; - BlockPresenceType type = 2; - bytes price = 3; -} -
type
price
UInt256 Price Format:
The price field encodes a 256-bit unsigned integer representing the cost in -wei (the smallest Ethereum denomination, where 1 ETH = 10^18 wei).
Encoding Specification:
0x0000000000000000000000000000000000000000000000000000000000000000
Free (0 wei): - 0x0000000000000000000000000000000000000000000000000000000000000000 - -1 wei: - 0x0000000000000000000000000000000000000000000000000000000000000001 - -1 gwei (10^9 wei): - 0x000000000000000000000000000000000000000000000000000000003b9aca00 - -0.001 ETH (10^15 wei): - 0x00000000000000000000000000000000000000000000000000038d7ea4c68000 - -1 ETH (10^18 wei): - 0x0000000000000000000000000000000000000000000000000de0b6b3a7640000 - -Maximum (2^256 - 1): - 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -
Conversion Logic:
# Wei to bytes (big-endian) -def wei_to_bytes(amount_wei: int) -> bytes: - return amount_wei.to_bytes(32, byteorder='big') - -# Bytes to wei -def bytes_to_wei(price_bytes: bytes) -> int: - return int.from_bytes(price_bytes, byteorder='big') - -# ETH to wei to bytes -def eth_to_price_bytes(amount_eth: float) -> bytes: - amount_wei = int(amount_eth * 10**18) - return wei_to_bytes(amount_wei) -
Payment-related messages for micropayments using Nitro state channels.
Account Message:
message AccountMessage { - bytes address = 1; // Ethereum address to which payments should be made -} -
This section provides real-world examples of protobuf messages for different -block exchange scenarios.
Scenario: Request a single standalone block
Protobuf (wire format representation):
Message { - wantlist: Wantlist { - entries: [ - Entry { - address: BlockAddress { - leaf: false - cid: 0x0155a0e40220b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 // CID bytes - } - priority: 0 - cancel: false - wantType: wantBlock // 0 - sendDontHave: true - } - ] - full: true - } -} -
Hex representation (sample):
0a2e 0a2c 0a24 0001 5512 2012 20b9 4d27 -b993 4d3e 08a5 2e52 d7da 7dab fac4 84ef -e37a 5380 ee90 88f7 ace2 efcd e910 0018 -0020 0028 011201 01 -
Scenario: Request block at index 100 from dataset
Protobuf:
Message { - wantlist: Wantlist { - entries: [ - Entry { - address: BlockAddress { - leaf: true - treeCid: 0x0155a0e40220c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 // Tree CID - index: 100 - } - priority: 0 - cancel: false - wantType: wantBlock - sendDontHave: true - } - ] - full: false // Delta update - } -} -
Scenario: Provider sends dataset block with Merkle proof
Message { - payload: [ - BlockDelivery { - cid: 0x0155a0e40220a1b2c3d4e5f6071829... // Block CID - data: <65536 bytes of block data> // 64 KiB - address: BlockAddress { - leaf: true - treeCid: 0x0155a0e40220c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 - index: 100 - } - proof: <CodexProof bytes> // Merkle proof data - // Contains: path indices, sibling hashes, tree height - // Format: Implementation-specific (e.g., [height][index][hash1][hash2]...[hashN]) - // Size varies by tree depth (illustrative: ~1KB for depth-10 tree) - } - ] -} -
Scenario: Provider indicates block availability with price
Message { - blockPresences: [ - BlockPresence { - address: BlockAddress { - leaf: false - cid: 0x0155a0e40220b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 - } - type: presenceHave // 0 - price: 0x00000000000000000000000000000000000000000000000000038d7ea4c68000 // 0.001 ETH in wei - } - ] -} -
Scenario: Send payment via state channel update
Message { - account: AccountMessage { - address: 0x742d35Cc6634C0532925a3b844200a717C48D6d9 // 20 bytes Ethereum address - } - payment: StateChannelUpdate { - update: <JSON bytes> - // Contains signed Nitro state as UTF-8 JSON string - // Example: {"channelId":"0x1234...","nonce":42,...} - } -} -
Scenario: Combined WantList, BlockPresence, and Delivery
Message { - wantlist: Wantlist { - entries: [ - Entry { - address: BlockAddress { - leaf: false - cid: 0x0155a0e40220... // Requesting new block - } - wantType: wantBlock - priority: 0 - cancel: false - sendDontHave: true - } - ] - full: false - } - blockPresences: [ - BlockPresence { - address: BlockAddress { - leaf: false - cid: 0x0155a0e40220... // Response to previous request - } - type: presenceHave - price: 0x00 // Free - } - ] - payload: [ - BlockDelivery { - cid: 0x0155a0e40220... // Delivering another block - data: <65536 bytes> - address: BlockAddress { - leaf: false - cid: 0x0155a0e40220... - } - } - ] - pendingBytes: 131072 // 128 KiB more data pending -} -
Scenario: Cancel multiple pending requests
Message { - wantlist: Wantlist { - entries: [ - Entry { - address: BlockAddress { - leaf: false - cid: 0x0155a0e40220abc123... - } - cancel: true // Cancellation flag - }, - Entry { - address: BlockAddress { - leaf: true - treeCid: 0x0155a0e40220def456... - index: 50 - } - cancel: true - } - ] - full: false - } -} -
CID Structure:
CID v1 format (multibase + multicodec + multihash): -[0x01] [0x55] [0xa0] [0xe4] [0x02] [0x20] [<32 bytes SHA256 hash>] - │ │ │ │ │ │ │ - │ │ │ │ │ │ └─ Hash digest - │ │ │ │ │ └───────── Hash length (32) - │ │ │ │ └──────────────── Hash algorithm (SHA2-256) - │ │ │ └─────────────────────── Codec size - │ │ └────────────────────────────── Codec (raw = 0x55) - │ └───────────────────────────────────── Multicodec prefix - └──────────────────────────────────────────── CID version (1) - -Actual: 0x01 55 a0 e4 02 20 <hash bytes> -
Example Block CID Breakdown:
Full CID: 0x0155a0e40220b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 - -Parts: - Version: 0x01 (CID v1) - Multicodec: 0x55 (raw) - Codec Size: 0xa0e402 (codex-block = 0xCD02, varint encoded)* - Hash Type: 0x20 (SHA2-256) - Hash Len: 0x12 (20) (32 bytes) - Hash: b94d27b993... (32 bytes SHA256) -
State Channel Update:
message StateChannelUpdate { - bytes update = 1; // Signed Nitro state, serialized as JSON -} -
update
The Block Exchange protocol integrates with Nitro state channels to enable -micropayments for block delivery.
When Payment is Required:
Free Blocks:
price = 0x00
Initial Price Advertisement:
Price Format:
price: bytes (32 bytes, big-endian UInt256) -Example: 0x0000000000000000000000000000000000000000000000000de0b6b3a7640000 - represents 1 ETH = 10^18 wei -
Requester → Provider: Message(wantlist: wantHave) -Provider → Requester: BlockPresence(type=presenceHave, price=<amount>) -
Requester evaluates price:
If accepted:
Requester: - 1. Load existing state channel with Provider - 2. Create new state with updated balance - 3. Sign state update - 4. Encode as JSON - -Requester → Provider: Message(payment: StateChannelUpdate(update=<signed JSON>)) -
Provider: - 1. Decode state channel update - 2. Verify signatures - 3. Check balance increase matches price - 4. Verify state channel validity - 5. Check nonce/sequence number - -If valid: - Provider → Requester: BlockDelivery(data, proof) -Else: - Provider → Requester: BlockPresence(price) // Retry with correct payment -
Requester: - 1. Receive and verify block - 2. Store block locally - 3. Finalize state channel update - 4. Update peer credit balance -
Note: The following state machine represents a design specification for -payment flow logic. Actual implementation may differ.
State: INIT - → Send wantHave - → Transition to PRICE_DISCOVERY - -State: PRICE_DISCOVERY - ← Receive BlockPresence(price) - → If price acceptable: Transition to PAYMENT_CREATION - → If price rejected: Transition to CANCELLED - -State: PAYMENT_CREATION - → Create state channel update - → Send payment message - → Transition to PAYMENT_PENDING - -State: PAYMENT_PENDING - ← Receive BlockDelivery: Transition to DELIVERY_VERIFICATION - ← Receive BlockPresence(price): Transition to PAYMENT_FAILED - -State: PAYMENT_FAILED - → Retry with corrected payment: Transition to PAYMENT_CREATION - → Abort: Transition to CANCELLED - -State: DELIVERY_VERIFICATION - → Verify block - → If valid: Transition to COMPLETED - → If invalid: Transition to DISPUTE - -State: COMPLETED - → Finalize state channel - → End - -State: CANCELLED - → Send cancellation - → End - -State: DISPUTE - → Reject block - → Dispute state channel update - → End -
Account Message Usage:
Sent early in connection to establish payment address:
Message { - account: AccountMessage { - address: 0x742d35Cc6634C0532925a3b8... // Ethereum address - } -} -
State Channel Update Format:
{ - "channelId": "0x1234...", - "nonce": 42, - "balances": { - "0x742d35Cc...": "1000000000000000000", // Seller balance - "0x8ab5d2F3...": "500000000000000000" // Buyer balance - }, - "signatures": [ - "0x789abc...", // Buyer signature - "0x456def..." // Seller signature - ] -} -
Insufficient Funds:
Invalid Signature:
Nonce Mismatch:
Channel Expired:
The Block Exchange protocol defines error handling for common failure scenarios:
Merkle Proof Verification Failure:
CID Mismatch:
Stream Disconnection:
Missing Blocks:
Request Timeout:
Oversized Messages:
Invalid WantList:
Payment Failures:
The protocol defines a clear separation between system-level and caller-level -retry responsibilities:
System-Level Retry (Automatic):
The Block Exchange module automatically retries in these scenarios:
The caller's requestBlock call remains pending during system-level retries. -This is transparent to the caller.
Caller-Level Retry (Manual):
The caller is responsible for retry decisions when:
In these cases, requestBlock returns an error and the caller decides -whether to retry, perhaps after waiting or refreshing the peer list -via discovery.
Retry Flow:
requestBlock(address) - │ - ├─► System tries Peer A ──► Fails - │ │ - │ └─► System tries Peer B ──► Fails (automatic, transparent) - │ │ - │ └─► System tries Peer C ──► Success ──► Return block - │ - └─► All peers failed ──► Return error to caller - │ - └─► Caller decides: retry? wait? abort? -
Peer Rotation:
When a peer fails to deliver blocks:
Graceful Degradation:
Error Propagation:
Two-Tier Block Addressing: -The protocol supports both standalone and dataset blocks to accommodate -different use cases. -Standalone blocks are simpler and don't require Merkle proofs, while -dataset blocks enable efficient verification of large datasets without -requiring the entire dataset.
WantList Delta Updates: -Supporting delta updates reduces bandwidth consumption when peers only -need to modify a small portion of their wants, which is common in -long-lived connections.
Separate Presence Messages: -Decoupling presence information from block delivery allows peers to -quickly assess availability without waiting for full block transfers.
Fixed Block Size: -The 64 KiB default block size balances efficient network transmission -with manageable memory overhead.
Zero-Padding Requirement: -Requiring zero-padding for incomplete dataset blocks ensures uniform -block sizes within datasets, simplifying Merkle tree construction and -verification.
Protocol Buffers: -Using Protocol Buffers provides efficient serialization, forward -compatibility, and wide language support.
Copyright and related rights waived via -CC0.
The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in 2119.
The Codex network aims to create a peer-to-peer storage engine with robust data durability, data persistence guarantees, and a comprehensive incentive structure.
The marketplace is a critical component of the Codex network, serving as a platform where all involved parties interact to ensure data persistence. It provides mechanisms to enforce agreements and facilitate data repair when SPs fail to fulfill their duties.
Implemented as a smart contract on an EVM-compatible blockchain, the marketplace enables various scenarios where nodes assume one or more roles to maintain a reliable persistence layer for users. This specification details these interactions.
CancelledError
nim-chronos
CatchableError
SaleErrored
Protocol Compliance Note: The Client implementation described above is specific to nim-codex. The only normative requirements for Clients are defined in the Client Role section of Part I. Implementations must satisfy those protocol requirements but may use completely different internal designs.
Status is a communication tool providing privacy features for the user. Specifications can also be viewed at Status.
60fcdd5
de29833
This specification is a voting protocol for peers to submit votes to a smart contract. Voting is immutable, this will help avoid sabotage from malicious peers.
In open p2p protocol there is an issue with voting off-chain as there is much room for malicious peers to only include votes that support their case when submitting votes to chain.
Once the vote deadline has expired, the smart contract will not accept votes anymore. Also directory will be updated according to vote results (community added to directory, removed etc.)
1255162
86cafd8
This specification describes a voting method to feature different active Status Communities.
When there is a active community that is seeking new members, current users of community should be able to feature their community so that it will be accessible to larger audience. @@ -25746,28 +22612,36 @@ only the vote with highest timestamp is considered valid. it can't be featured in current week. - In a current week top 5 (or 10) communities with highest amount of SNT votes up to previous Sunday 23:59:59 UTC are considered featured.
slug: 55 -title: 55/STATUS-1TO1-CHAT -name: Status 1-to-1 Chat -status: draft -category: Standards Track -tags: waku-application -description: A chat protocol to send public and private messages to a single recipient by the Status app. -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors:
0b4d151
e95c5c6
44baefd
e105bea
4a8585b
This specification describes how the Status 1-to-1 chat protocol is implemented on top of the Waku v2 protocol. This protocol can be used to send messages to a single recipient.
This document describes how 2 peers communicate with each other to send messages in a 1-to-1 chat, with privacy and authenticity guarantees.
This protocol MAY use any key-exchange mechanism previously discussed -
COLOR_CHANGED
To change the display image of the group chat, group admins MUST use an IMAGE_CHANGED event.
IMAGE_CHANGED
slug: 56 -title: 56/STATUS-COMMUNITIES -name: Status Communities that run over Waku v2 -status: draft -category: Standards Track -tags: waku-application -description: Status Communities allow multiple users to communicate in a discussion space. This is a key feature of the Status application. -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors:
f4b34af
9bed57e
11bdc3b
8350742
a786356
This document describes the design of Status Communities over Waku v2, allowing for multiple users to communicate in a discussion space. This is a key feature for the Status messaging app.
Due to the nature of communities, the following requirements are necessary for the design of communities -
The following cryptographic primitives are used in the design -
The clock used in the wire format refers to the Lamport timestamp of the message. The Lamport timestamp is a logical clock that is used to determine the order of events in a distributed system. This allows ordering of messages in an asynchronous network where messages may be received out of order.
The Community owner is a single point of failure. @@ -26507,9 +23392,9 @@ The following document describes this method in more detail - since members of the community don't need to receive all the control messages.
slug: 61 -title: 61/STATUS-Community-History-Service -name: Status Community History Service -status: draft -category: Standards Track -description: Explains how new members of a Status community can request historical messages from archive nodes. -editor: r4bbit r4bbit@status.im -contributors:
d8ba50e
ad72c49
Messages are stored permanently by store nodes (13/WAKU2-STORE) for up to a certain configurable period of time, @@ -26602,7 +23495,7 @@ older than 30 days.
These assumptions are less than ideal and will be enhanced in future work. This forum discussion provides more details.
The following is a high-level overview of the user flow and features this specification describes. For more detailed descriptions, read the dedicated sections in this specification.
slug: 62 -title: 62/STATUS-PAYLOADS -name: Status Message Payloads -status: draft -description: Describes the payload of each message in Status. -editor: r4bbit r4bbit@status.im -contributors:
ad80a59
1abf2c9
e2b9e32
20e9a66
488ce9b
This specification describes how the payload of each message in Status looks like. It is primarily centered around chat and chat-related use cases.
Released August 25, 2020
Released July 16, 2020
Released May 22, 2020
slug: 63 -title: 63/STATUS-Keycard-Usage -name: Status Keycard Usage -status: draft -category: Standards Track -description: Describes how an application can use the Status Keycard to create, store and transact with different account addresses. -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors:
928173d
68e6d45
100e0e8
This specification describes how an application can use the Status Keycard to -
More documentation on the Status Keycard can be found here
The Status Keycard is a hardware wallet that can be used to store and sign transactions. For the purpose of the Status App, @@ -28231,37 +25142,45 @@ MAY implement the following flows according to the actions listed above.
/unblock-pin
Inherits the security considerations of Status Keycard
Inherits the privacy considerations of Status Keycard
slug: 65 -title: 65/STATUS-ACCOUNT-ADDRESS -name: Status Account Address -status: draft -category: Standards Track -description: Details of what a Status account address is and how account addresses are created and used. -editor: Aaryamann Challani p1ge0nh8er@proton.me -contributors:
67a1221
91874da
ae04f02
This specification details what a Status account address is and how account addresses are created and used.
The core concept of an account in Status is a set of cryptographic keypairs. Namely, the combination of the following:
The above payload is broadcasted when 2 devices that belong to a user need to be paired.
slug: 71 -title: 71/STATUS-PUSH-NOTIFICATION-SERVER -name: Push Notification Server -status: draft -category: Standards Track -description: A set of methods to allow Status clients to use push notification services in mobile environments. -editor: Jimmy Debe jimmy@status.im -contributors:
3e21cc0
5bce327
8df3f00
eb7c5bf
A push notification server implementation for IOS devices and Android devices. This specification provides a set of methods that allow clients to use push notification services in mobile environments.
Push notification for iOS and Android devices can only be implemented by relying on APN, @@ -28420,11 +25349,11 @@ Status provides a set of methods to acheive push notification services.
Since this can not be safely implemented in a privacy-preserving manner, clients need to be given an option to opt-in to receive and send push notifications. They are disabled by default.
shake-256
chat_id
title: STATUS-SIMPLE-SCALING -name: Status Simple Scaling -status: raw -category: Informational -tags: waku/application -description: Describes how to scale Status Communities and Status 1-to-1 chats using Waku v2 protocol and components. -editor: Daniel Kaiser danielkaiser@status.im -contributors:
Early-stage Status specifications that precede draft or stable status.
9b5e219
a189a72
61a39e2
18a16ae
f19a136
27fae4f
fa8c750
5919040
f7a51b9
This document describes how to scale 56/STATUS-COMMUNITIES as well as 55/STATUS-1TO1-CHAT using Waku v2 protocol and components. @@ -29417,7 +26363,7 @@ one register query per shard.
A discovery query for nodes that are part of this shard would look like
DISCOVER{ns: "rs/16/2"}
Hereunder we describe the "opt-in message signing for DoS prevention" solution, designed ad hoc for Status MVP.
Since publishing messages to pubsub topics has no limits, @@ -29575,9 +26521,9 @@ It could be rate-limited with RLN.
This document describes how to scale -56/STATUS-COMMUNITIES as well as 55/STATUS-1TO1-CHAT -using Waku v2 protocol and components. -It also adds a few new aspects, -where more sophisticated components are not yet researched and evaluated.
-Note: (Parts of) this RFC will be deprecated in the future -as we continue research to scale specific components -in a way that aligns better with our principles of decentralization and -protecting anonymity. -This document informs about scaling at the current stage of research and -shows it is practically possible. -Practical feasibility is also a core goal for us. -We believe in incremental improvement, i.e. -having a working decentralized scaling solution with trade-offs -is better than a fully centralized solution. -
Note: (Parts of) this RFC will be deprecated in the future -as we continue research to scale specific components -in a way that aligns better with our principles of decentralization and -protecting anonymity. -This document informs about scaling at the current stage of research and -shows it is practically possible. -Practical feasibility is also a core goal for us. -We believe in incremental improvement, i.e. -having a working decentralized scaling solution with trade-offs -is better than a fully centralized solution.
56/STATUS-COMMUNITIES as well as -55/STATUS-1TO1-CHAT use Waku v2 protocols. -Both use Waku content topics -(see 23/WAKU2-TOPICS) -for content based filtering.
Waku v2 currently has scaling limitations in two dimensions:
Messages that are part of a specific content topic -have to be disseminated in a single mesh network (i.e. pubsub topic). -This limits scaling the number of messages disseminated in a specific content topic, -and by extension, the number of active nodes that are part of this content topic.
Scaling a large set of content topics requires distributing these over several -mesh networks (which this document refers to as pubsub topic shards).
This document focuses on the second scaling dimension. -With the scaling solutions discussed in this document, -each content topics can have a large set of active users, -but still has to fit in a single pubsub mesh.
-Note: While it is possible to use the same content topic name on several shards, -each node that is interested in this content topic -has to be subscribed to all respective shards, which does not scale. -Splitting content topics in a more sophisticated and -efficient way will be part of a future document. -
Note: While it is possible to use the same content topic name on several shards, -each node that is interested in this content topic -has to be subscribed to all respective shards, which does not scale. -Splitting content topics in a more sophisticated and -efficient way will be part of a future document.
Sharding the 11/WAKU2-RELAY -network is an integral part of scaling the Status app.
WAKU2-RELAY-SHARDING -specifies shards clusters, which are sets of 1024 shards -(separate pubsub mesh networks). -Content topics specified by application protocols can be distributed over these shards. -The Status app protocols are assigned to shard cluster 16, -as defined in WAKU2-RELAY-STATIC-SHARD-ALLOC.
1024
16
WAKU2-RELAY-SHARDING -specifies three sharding methods. -This document uses static sharding, -which leaves the distribution of content topics to application protocols, -but takes care of shard discovery.
The 1024 shards within the main Status shard cluster are allocated as follows.
Shard indices are mapped to pubsub topic names as follows (specified in WAKU2-RELAY-SHARDING).
/waku/2/rs/<cluster_id>/<shard_number>
an example for the shard with index 18 in the Status shard cluster:
18
/waku/2/rs/16/18
In other words, the mesh network with the pubsub topic name /waku/2/rs/16/18, -carries messages associated with shard 18 in the Status shard cluster.
The Waku implementation should offer an interface that -allows Status nodes to subscribe to Status specific content topics like
subscribe("/status/xyz", 16, 18) -
The shard cluster index 16 can be kept in the Status app configuration, -so that Status nodes can simply use
subscribe("/status/xyz", 18) -
which means: connect to the "status/xyz" content topic on shard 18 -within the Status shard cluster.
"status/xyz"
In order to associate a community with a shard, -the community description protobuf is extended by the field -uint16 relay_shard_index = 15:
uint16 relay_shard_index = 15
-syntax = "proto3"; - -message CommunityDescription { - // The Lamport timestamp of the message - uint64 clock = 1; - // A mapping of members in the community to their roles - map<string,CommunityMember> members = 2; - // The permissions of the Community - CommunityPermissions permissions = 3; - // The metadata of the Community - ChatIdentity identity = 5; - // A mapping of chats to their details - map<string,CommunityChat> chats = 6; - // A list of banned members - repeated string ban_list = 7; - // A mapping of categories to their details - map<string,CommunityCategory> categories = 8; - // The admin settings of the Community - CommunityAdminSettings admin_settings = 10; - // If the community is encrypted - bool encrypted = 13; - // The list of tags - repeated string tags = 14; - // index of the community's shard within the Status shard cluster - uint16 relay_shard_index = 15 -} -
-Note: Currently, Status app has allocated shared cluster 16 in WAKU2-RELAY-STATIC-SHARD-ALLOC. -Status app could allocate more shard clusters, for instance to establish a test net. -We could add the shard cluster index to the community description as well. -The recommendation for now, -is to keep it as a configuration option of the Status app. -Note: Once this RFC moves forward, -the new community description protobuf fields should be mentioned in 56/STATUS-COMMUNITIES. -
Note: Currently, Status app has allocated shared cluster 16 in WAKU2-RELAY-STATIC-SHARD-ALLOC. -Status app could allocate more shard clusters, for instance to establish a test net. -We could add the shard cluster index to the community description as well. -The recommendation for now, -is to keep it as a configuration option of the Status app. -Note: Once this RFC moves forward, -the new community description protobuf fields should be mentioned in 56/STATUS-COMMUNITIES.
Status communities can be mapped to shards in two ways: static, and owner-based.
With static mapping, -communities are assigned a specific shard index within the Status shard cluster. -This mapping is similar in nature to the shard cluster allocation in WAKU2-RELAY-STATIC-SHARD-ALLOC. -Shard indices allocated in that way are in the range 16 - 127. -The Status CC community uses index 16 -(not to confuse with shard cluster index 16, which is the Status shard cluster).
16 - 127
-Note: This way of mapping will be specified post-MVP. -
Note: This way of mapping will be specified post-MVP.
Community owners can choose to map their communities to any shard within -the index range 128 - 767.
128 - 767
55/STATUS-1TO1-CHAT -uses partitioned topics to map 1:1 chats to a set of 5000 content topics. -This document extends this mapping to 8192 content topics that are, in turn, -mapped to 128 shards in the index range of 768 - 895.
768 - 895
contentPartitionsNum = 8192 -contentPartition = mod(publicKey, contentPartitionsNum) -partitionContentTopic = "contact-discovery-" + contentPartition - -partitionContentTopic = keccak256(partitionContentTopic) - -shardNum = 128 -shardIndex = 768 + mod(publicKey, shardNum) - -
As described in 30/ADAPTIVE-NODES, -Waku supports a continuum of node types with respect to available resources. -Infrastructure nodes are powerful nodes that have a high bandwidth connection and -a high up-time.
This document, which informs about simple ways of scaling Status over Waku, -assumes the presence of a set of such infrastructure nodes in each shard. -Infrastructure nodes are especially important for -providing connectivity in the roll-out phase.
Infrastructure nodes are not limited to Status fleets, or -nodes run by community owners. -Anybody can run infrastructure nodes.
Infrastructure nodes are provided by the community owner, -or by members of the respective community.
Infrastructure nodes are part of a subset of the shards in the range 128 - 767. -Recommendations on choosing this subset will be added -in a future version of this document.
Status fleet nodes make up a part of these infrastructure nodes.
Infrastructure nodes are part of a subset of the shards in the range 768 - 985 -(similar to owner-mapped communities). -Recommendations on choosing this subset will be added -in a future version of this document.
768 - 985
Desktop clients can choose to only use filter and lightpush.
-Note: Discussion: I'd suggest to set this as the default for the MVP. -The load on infrastructure nodes would not be higher, because -they have to receive and relay each message anyways. -This comes as a trade-off to anonymity and decentralization, -but can significantly improve scaling. -We still have k-anonymity because -several chat pairs are mapped into one content topic. -We could improve on this in the future, and research the applicability of PIR -(private information retrieval) techniques in the future. -
Note: Discussion: I'd suggest to set this as the default for the MVP. -The load on infrastructure nodes would not be higher, because -they have to receive and relay each message anyways. -This comes as a trade-off to anonymity and decentralization, -but can significantly improve scaling. -We still have k-anonymity because -several chat pairs are mapped into one content topic. -We could improve on this in the future, and research the applicability of PIR -(private information retrieval) techniques in the future.
Waku messages are typically relayed in larger mesh networks -comprised of nodes with varying resource profiles -(see 30/ADAPTIVE-NODES). -To maximise scaling, relaying of specific message types can be dedicated to shards -where only infrastructure nodes with very strong resource profiles relay messages. -This comes as a trade-off to decentralization.
To get the maximum scaling for select large communities for the Status scaling MVP, -specific control messages that cause significant load -(at a high user number) SHOULD be moved to a separate control message shard. -These control messages comprise:
37b3edf
The relay functionality of control messages shards SHOULD -be provided by infrastructure nodes. -Desktop clients should use light protocols as the default for control message shards. -Strong Desktop clients MAY opt in to support the relay network.
Each large community (in the index range of 16 - 127) -can get its dedicated control message shard -(in the index range 896 - 1023) if deemed necessary. -The Status CC community uses shard 896 as its control message shard. -This comes with trade-offs to decentralization and anonymity -(see Security Considerations section).
896 - 1023
896
Similar to control messages, media-heavy communities should use separate media shards -(in the index range 896 - 1023) for disseminating messages with large media data. -The Status CC community uses shard 897 as its media shard.
897
Large communities MAY choose to mainly rely on infrastructure nodes -for all message transfers (not limited to control, and media messages). -Desktop clients of such communities should use light protocols as the default. -Strong Desktop clients MAY opt in to support the relay network.
-Note: This is not planned for the MVP. -
Note: This is not planned for the MVP.
Light protocols may be used to save bandwidth, -at the (global) cost of not contributing to the network. -Using light protocols is RECOMMENDED for resource restricted nodes, -e.g. browsers, -and devices that (temporarily) -have a low bandwidth connection or a connection with usage-based billing.
Light protocols comprise
Archive nodes are Waku nodes that offer the Waku archive service via -the Waku store protocol (13/WAKU2-STORE). -They are part of a set of shards and store all messages disseminated in these shards. -Nodes can request history messages via the 13/WAKU2-STORE.
The store service is not limited to a Status fleet. -Anybody can run a Waku Archive node in the Status shards.
-Note: There is no specification for discovering archive nodes -associated with specific shards yet. -Nodes expect archive nodes to store all messages, regardless of shard association. -
Note: There is no specification for discovering archive nodes -associated with specific shards yet. -Nodes expect archive nodes to store all messages, regardless of shard association.
The recommendation for the allocation of archive nodes to shards is similar to the -allocation of infrastructure nodes to shards described above. -In fact, the archive service can be offered by infrastructure nodes.
Shard discovery is covered by WAKU2-RELAY-SHARDING. -This allows the Status app to abstract from the discovery process and -simply address shards by their index.
To make nodes behind restrictive NATs discoverable, -this document suggests using libp2p rendezvous. -Nodes can check whether they are behind a restrictive NAT using the -libp2p AutoNAT protocol.
-Note: The following will move into WAKU2-RELAY-SHARDING, -or 33/WAKU2-DISCV5: -Nodes behind restrictive NATs SHOULD not announce their publicly unreachable address -via 33/WAKU2-DISCV5 discovery. -
Note: The following will move into WAKU2-RELAY-SHARDING, -or 33/WAKU2-DISCV5: -Nodes behind restrictive NATs SHOULD not announce their publicly unreachable address -via 33/WAKU2-DISCV5 discovery.
It is RECOMMENDED that nodes that are part of the relay network also -act as rendezvous points. -This includes accepting register queries from peers, -as well as answering rendezvous discover queries. -Nodes MAY opt-out of the rendezvous functionality.
To allow nodes to initiate connections to peers behind restrictive NATs -(after discovery via rendezvous), -it is RECOMMENDED that nodes that are part of the Waku relay network also offer -libp2p circuit relay -functionality.
To minimize the load on circuit-relay nodes, nodes SHOULD
Nodes that do not announce themselves at all and only plan to use light protocols, -MAY use rendezvous discovery instead of or along-side WAKU2-PEER-EXCHANGE. -For these nodes, rendezvous and -WAKU2-PEER-EXCHANGE -offer the same functionality, -but return node sets sampled in different ways. -Using both can help increasing connectivity.
Nodes that are not behind restrictive NATs MAY register at rendezvous points, too; -this helps increasing discoverability, and by extension connectivity. -Such nodes SHOULD, however, not register at circuit relays.
Registering a namespace via lib-p2p rendezvous -is done via a register query:
REGISTER{my-app, {QmA, AddrA}} -
The app name, my-app contains the encoding of a single shard in string form:
my-app
"rs/"| to_string(<2-byte shard cluster index>) | "/" | to_string(<2-byte shard index>) -
The string conversion SHOULD remove leading zeros.
-Note: Since the ns -field is of type string, a more efficient byte encoding is not utilized. -
Note: Since the ns -field is of type string, a more efficient byte encoding is not utilized.
Registering shard 2 in the Status shard cluster (with shard cluster index 16, -see WAKU2-RELAY-STATIC-SHARD-ALLOC, -the register query would look like
REGISTER{"rs/16/2", {QmA, AddrA}} -
Participation in further shards is registered with further queries; -one register query per shard.
DISCOVER{ns: "rs/16/2"} -
Hereunder we describe the "opt-in message signing for DoS prevention" solution, -designed ad hoc for Status MVP.
Since publishing messages to pubsub topics has no limits, -anyone can publish messages at a very high rate and DoS the network. -This would elevate the bandwidth consumption of all nodes subscribed -to said pubsub topic, making it prohibitive (in terms of bandwidth) -to be subscribed to it. -In order to scale, we need some mechanism to prevent this from happening, -otherwise all scaling efforts will be in vain. -Since RLN is not ready yet, -hereunder we describe a simpler approach designed ad hoc for Status use case, -feasible to implement for the MVP and -that validates some of the ideas that will evolve to solutions such as RLN.
With this approach, certain pubsub topics can be optionally configured -to only accept messages signed with a given key, -that only trusted entities know. -This key can be pre-shared among a set of participants, -that are trusted to make fair usage of the network, -publishing messages at a reasonable rate/size. -Note that this key can be shared/reused among multiple participants, and -only one key is whitelisted per pubsub topic. -This is an opt-in solution that operators can choose to deploy in their shards -(i.e. pubsub topics), but it's not enforced in the default one. -Operators can freely choose how they want to generate, and -distribute the public keys. -It's also their responsibility to handle the private key, -sharing it with only trusted parties and keeping proper custody of it.
The following concepts are introduced:
private-key-topic
protected-pubsub-topic
app-message-hash
sha256(concat(pubsubTopic, payload, contentTopic, timestamp, ephemeral))
message-signature
application-message-hash
public-key-topic
verify(message-signature, app-message-hash, public-key-topic)
This solution introduces two roles:
A publisher that wants to send messages -that are relayed in the network for a given protected-pubsub-topic shall:
meta
The app-message-hash of the message shall be calculated as the sha256 hash -of the following fields of the message:
sha256
sha256(concat(pubsubTopic, payload, contentTopic, timestamp, ephemeral)) -
Where fields are serialized into bytes using little-endian. -Note that ephemeral is a boolean that is serialized to 0 if false and -1 if true.
false
Requirements for the relay are listed below:
Requirements on the gossipsub validator:
Accept
Reject
abs(current_timestamp-timestamp) > MessageWindowInSec
Other requirements:
P4
This solution is designed to be backward compatible so -that nodes validating messages can coexist in the same topic -with other nodes that don't perform validation. -But note that only nodes that perform message validation -will be protected against DoS. -Nodes wishing to opt-in this DoS protection feature shall:
Relay nodes complying with this specification -shall accept the following message in the configured pubsub topic.
Given the following key pair:
private-key-topic = 5526a8990317c9b7b58d07843d270f9cd1d9aaee129294c1c478abf7261dd9e6 -public-key-topic = 049c5fac802da41e07e6cdf51c3b9a6351ad5e65921527f2df5b7d59fd9b56ab02bab736cdcfc37f25095e78127500da371947217a8cd5186ab890ea866211c3f6 -
And the following message to send:
protected-pubsub-topic = pubsub-topic -contentTopic = content-topic -payload = 1A12E077D0E89F9CAC11FBBB6A676C86120B5AD3E248B1F180E98F15EE43D2DFCF62F00C92737B2FF6F59B3ABA02773314B991C41DC19ADB0AD8C17C8E26757B -timestamp = 1683208172339052800 -ephemeral = true -
The message hash and meta (aka signature) are calculated as follows.
app-message-hash = 662F8C20A335F170BD60ABC1F02AD66F0C6A6EE285DA2A53C95259E7937C0AE9 -message.meta = 127FA211B2514F0E974A055392946DC1A14052182A6ABEFB8A6CD7C51DA1BF2E40595D28EF1A9488797C297EED3AAC45430005FB3A7F037BDD9FC4BD99F59E63 -
Using message.meta, the relay node shall calculate the app-message-hash -of the received message using public-key-topic, -and with the values above, the signature should be verified, -making the node Accept the message and relaying it to other nodes in the network.
message.meta
Basic idea: -Tokenized load.
An idea we plan to explore in the future: -Map 1:1 chats to community shards, if both A and B are part of the respective community. -This increases k-anonymity and benefits from community DoS protection. -It could be rate-limited with RLN.
This document makes several trade-offs to privacy and anonymity. -Todo: elaborate. -See WAKU2-ADVERSARIAL-MODELS -for information on Waku Anonymity.
title: STATUS-PROTOCOLS -name: Status Protocol Stack -status: raw -category: Standards Track -description: Specifies the Status application protocol stack. -editor: Hanno Cornelius hanno@status.im -contributors:
This specification describes the Status Application protocol stack. It focuses on elements and features in the protocol stack for all application-level functions:
For the purposes of the rest of this document, clients in full mode will be referred to as "full clients" and clients in light mode will be referred to as "light clients".
The application MUST make use of at least one discovery method to discover and connect to Waku peers useful for the user functions specific to that instance of the application.
The specific Waku discovery protocol used for discovery depends on the use case and resource-availability of the client.
751a01e
This document lists the types of messages that are using MVDS in the Status application.
Status app uses MVDS to ensure messages going through Waku are acknolwedged by the recipient. This is to ensure that the messages are not missed by any interested parties.
title: STATUS-URL-DATA -name: Status URL Data -status: raw -category: Standards Track -tags: -editor: Felicio Mununga felicio@status.im -contributors:
36f64f0
This document specifies serialization, compression, and encoding techniques used to transmit data within URLs in the context of Status protocols.
When sharing URLs, link previews often expose metadata to the websites behind those links. To reduce reliance on external servers for providing appropriate link previews, @@ -30712,9 +27150,9 @@ raw_data = deserialized_data.content
a519e67
89cac77
This document describes URL scheme for previewing and deep linking content as well as for triggering actions.
title: 3RD-PARTY -name: 3rd party -status: deprecated -description: This specification discusses 3rd party APIs that Status relies on. -editor: Filip Dimitrijevic filip@status.im -contributors:
Deprecated Status specifications maintained for archival purposes.
614348a
This specification discusses 3rd party APIs that Status relies on. These APIs provide various capabilities, including:
Concerns If Iubenda becomes unavailable, users will be unable to view the app's privacy policy.
This specification discusses 3rd party APIs that Status relies on. -These APIs provide various capabilities, including:
Relying on 3rd party APIs conflicts with Status’s censorship-resistance principle. -Since Status aims to avoid suppression of information, -it is important to minimize reliance on 3rd parties that are critical to app functionality.
What is it? -Infura hosts a collection of Ethereum full nodes and provides an API -to access the Ethereum and IPFS networks without requiring a full node.
How Status Uses It -Since Status operates on mobile devices, -it cannot rely on a local node. -Therefore, all Ethereum network communication happens via Infura.
Concerns -Making an HTTP request can reveal user metadata, -which could be exploited in attacks if Infura is compromised. -Infura uses centralized hosting providers; -if these providers fail or cut off service, -Ethereum-dependent features in Status would be affected.
What is it? -Etherscan is a service that allows users to explore the Ethereum blockchain -for transactions, addresses, tokens, prices, -and other blockchain activities.
How Status Uses It -The Status Wallet allows users to view address and transaction details on Etherscan.
Concerns -If Etherscan becomes unavailable, -users won’t be able to view address or transaction details through Etherscan. -However, in-app information will still be accessible.
What is it? -CryptoCompare provides live crypto prices, charts, and analysis from major exchanges.
How Status Uses It -Status regularly fetches crypto prices from CryptoCompare, -using this information to calculate fiat values -for transactions or wallet assets.
Concerns -HTTP requests can reveal metadata, -which could be exploited if CryptoCompare is compromised. -If CryptoCompare becomes unavailable, -Status won’t be able to show fiat equivalents for crypto in the wallet.
Various services provide information on collectibles:
Concerns -HTTP requests can reveal metadata, -which could be exploited if these services are compromised.
What is it? -Iubenda helps create compliance documents for websites and apps across jurisdictions.
How Status Uses It -Status’s privacy policy is hosted on Iubenda.
Concerns -If Iubenda becomes unavailable, -users will be unable to view the app's privacy policy.
title: ACCOUNT -name: Account -status: deprecated -description: This specification explains what a Status account is, and how a node establishes trust. -editor: Filip Dimitrijevic filip@status.im -contributors:
This specification explains what a Status account is, and how a node establishes trust.
For the user, the deserialization process is exactly the same as serialization with the exception that the user MUST provide a serialized public key for deserialization. Else the deserialization algorithm will fail.
For further guidance on the implementation of public key de/serialization consult the status-go implementation and tests.
status-go
Released June 24, 2020
Mailserver
title: CLIENT -name: Client -status: deprecated -description: This specification describes how to write a Status client for communicating with other Status clients. -editor: Filip Dimitrijevic filip@status.im -contributors:
This specification describes how to write a Status client for communicating with other Status clients. This specification presents a reference implementation of the protocol @@ -31419,7 +27779,7 @@ used in a command-line client and a mobile app.
This document consists of two parts. The first outlines the specifications required to be a full Status client. The second provides a design rationale and answers some common questions.
Implementing a Status clients largely means implementing the following layers. Additionally, there are separate specifications for things like key management and account lifecycle.
These bootstrap nodes MAY change and are not guaranteed to stay this way forever and at some point circumstances might force them to change.
A Status client MUST discover or have a list of peers to connect to. Status uses a light discovery mechanism based on a combination of Discovery v5 and Rendezvous Protocol, @@ -31547,7 +27907,7 @@ various degrees of standardization. Please refer to BIPs and EIPs Standards support
For a list of EIPs and BIPs that SHOULD be supported by Status client, please see EIPS.
See Appendix A
P2P Overlay
There are several security considerations to take into account when running Status. Chief among them are: scalability, DDoS-resistance and privacy. These also vary depending on what capabilities are used, such as Mailserver, light node, and so on.
In version 1 of Status, bandwidth usage is likely to be an issue. In Status version 1.1 this is partially addressed with Waku usage, see the theoretical scaling model.
Status currently lacks incentives to run nodes, which means node operators are more likely to create centralized choke points.
The main privacy concern with light nodes is that directly connected peers will know that a message originates from them (as it are the only ones it sends). This means nodes can make assumptions about what messages (topics) their peers are interested in.
Bloom filter privacy:
Mailserver trusted connection:
A Mailserver has a direct TCP connection, which means they are trusted to send traffic. This means a malicious or malfunctioning Mailserver can overwhelm an individual node.
By default Devp2p runs on port 30303, which is not commonly used for any other service. This means it is easy to censor, e.g. airport WiFi. This can be mitigated somewhat by running on e.g. port 80 or 443, but there are still outstanding issues. See libp2p and Tor's Pluggable Transport for how this can be improved.
See https://github.com/status-im/status-mobile/issues/6351 for some discussion.
Jacek Sieka
This document describes requirements that an application must fulfill in order to provide a proper environment for Dapps running inside a browser. A description of the Status Dapp API is provided, along with an overview of bidirectional communication underlying the API implementation. The document also includes a list of EIPs that this API implements.
window.ethereum
The application should expose an Ethereum Provider object (window.ethereum) to JS code running inside the browser. It is important to have the window.ethereum object available before the page loads, otherwise Dapps might not work correctly.
Additionally, the browser component should also provide bidirectional communication between JS code and the application.
isStatus
Returns true. Can be used by the Dapp to find out whether it's running inside Status.
Returns a StatusAPI object. For now it supports one method: getContactCode that sends a contact-code request to Status.
StatusAPI
getContactCode
contact-code
isConnected
eth_requestAccounts
connect
disconnect
chainChanged
accountsChanged
This specification describes how Status relates with EIPs.
Status should follow all standards as possible. Whenever the Status app needs a feature, it should be first checked if there is a standard for that, if not, Status should propose a standard.
This specification documents all the interactions that the Status client has with the Ethereum blockchain.
All the interactions are made through JSON-RPC. Currently Infura is used. The client assumes high-availability, @@ -32203,9 +28590,9 @@ It is used in status to check if a token transfer was made to the user address.<
ENS names are propagated through ChatMessage and ContactUpdate payload. A client SHOULD verify ens names against the public key of the sender on receiving the message against the ENS contract
ChatMessage
ContactUpdate
title: GROUP-CHAT -name: Group Chat -status: deprecated -description: This document describes the group chat protocol used by the Status application. -editor: Filip Dimitrijevic filip@status.im -contributors:
This document describes the group chat protocol used by the Status application. The node uses pairwise encryption among members so a message is exchanged between each participant, similarly to a one-to-one message.
chatId
If the event is valid a client MUST remove the member from the list of admins of the chat.
admins
title: IPFS-gateway-for-Sticker-Pack -name: IPFS gateway for Sticker Pack -status: deprecated -description: This specification describes how Status uses the IPFS gateway to store stickers. -editor: Filip Dimitrijevic filip@status.im -contributors:
This specification describes how Status uses the IPFS gateway to store stickers. The specification explores image format, @@ -32372,7 +28771,7 @@ and how an end user can see them inside the Status app.
Accepted image file types are PNG, JPG/JPEG and GIF, with a maximum allowed size of 300kb. @@ -32440,9 +28839,9 @@ This method will return an uint256 which is the id of the owned sti
PNG
JPG/JPEG
GIF
uint256
To buy a sticker pack call approveAndCall(address,uint256,bytes) where address is the address of buyer,uint256 is the price and third parameters bytes is the callback called if approved. In the callback, call buyToken(uint256,address,uint256), first parameter is sticker pack id, second buyers address, and the last is the price.
approveAndCall(address,uint256,bytes)
buyToken(uint256,address,uint256)
title: Keycard Usage for Wallet and Chat Keys -name: Keycard Usage for Wallet and Chat Keys -status: deprecated -description: In this specification, we describe how Status communicates with Keycard to create, store and use multiaccount. -editor: Filip Dimitrijevic filip@status.im -contributors:
In this specification, we describe how Status communicates with Keycard to create, store and use multiaccount.
encryption-public-key
status-im.hardwallet.card/get-keys
status-im.hardwallet.card/generate-and-load-keys
title: NOTIFICATIONS -name: Notifications -status: deprecated -description: A client should implement local notifications to offer notifications for any event in the app without the privacy cost and dependency on third party services. -editor: Filip Dimitrijevic filip@status.im -contributors:
A client should implement local notifications to offer notifications for any event in the app without the privacy cost and dependency on third party services. @@ -32766,32 +29177,36 @@ The system decides when the background updates are triggered and the heuristics
Push Notifications, as offered by Apple and Google are a privacy concern, they require a centralized service that is aware of who the notification needs to be delivered to.
title: PAYLOADS -name: Payloads -status: deprecated -description: Payload of messages in Status, regarding chat and chat-related use cases. -editor: Filip Dimitrijevic filip@status.im -contributors:
The payloads aims to be flexible enough to support messaging but also cases described in the Status Whitepaper as well as various clients created using different technologies.
This document describes the payload format and some special considerations.
The node wraps all payloads in a protobuf record:
Status Whitepaper protobuf record Protobuf @@ -33084,17 +29499,23 @@ The details are in the Lamport timestamps Group chats specs May 22, 2020 change commit
title: PUSH-NOTIFICATION-SERVER -name: Push notification server -status: deprecated -description: Status provides a set of Push notification services that can be used to achieve this functionality. -editor: Filip Dimitrijevic filip@status.im -contributors:
Push notifications for iOS devices and some Android devices can only be implemented by relying on APN service for iOS or Firebase.
This is useful for Android devices that do not support foreground services @@ -33118,7 +29539,7 @@ The party releasing the app, Status in this case, needs to run its own Gorush instance
A gorush instance MUST be publicly available, this will be used only by push notification servers.
A push notification server used by clients to register for receiving and sending push notifications.
A Status client that wants to receive push notifications
This can be mitigated by device syncing, but not completely addressed.
If no anonymous mode is used, when registering with a push notification service a client discloses:
Push notification servers can be run by anyone. Gorush can be run by anyone I take, but we are in charge of the certificate, so they would not be able to notify status-clients.
Released
title: SECURE-TRANSPORT -name: Secure Transport -status: deprecated -description: This document describes how Status provides a secure channel between two peers, providing confidentiality, integrity, authenticity, and forward secrecy. -editor: Filip Dimitrijevic filip@status.im -contributors:
This document describes how Status provides a secure channel between two peers, and thus provide confidentiality, integrity, authenticity and forward secrecy. It is transport-agnostic and works over asynchronous networks.
It builds on the X3DH and Double Ratchet specifications, with some adaptations to operate in a decentralized environment.
This document describes how nodes establish a secure channel, and how various conversational security properties are achieved.
Perfect Forward Secrecy is a feature of specific key-agreement protocols @@ -33679,7 +30102,7 @@ Specifically, past messages cannot be decrypted by a third-party who manages to
Secret channel describes a communication channel where Double Ratchet algorithm is in use.
DirectMessageProtocol
installa - otherwise, payload encrypted with output key of DH exchange (no Perfect Forward Secrecy).
The same considerations apply as in section 4 of the X3DH spec and section 6 of the Double Ratchet spec, with some additions detailed below.
Being mostly offline is an intrinsic property of mobile clients. They need to save network transfer and battery consumption to avoid spending too much money or constant charging. Waku protocol, on the other hand, is an online protocol. @@ -34228,7 +30655,7 @@ it SHOULD handle P2P Request Complete code (0x7d). This code is fol
0x7d
If Cursor is not empty, it means that not all messages were sent due to the set Limit in the request. One or more consecutive requests MAY be sent with Cursor field filled in order to receive the rest of the messages.
The node encrypts all Waku envelopes. A Mailserver node can not inspect their contents.
Since a Mailserver is delivering expired envelopes and has a direct TCP connection with the recipient, the recipient is vulnerable to DoS attacks from a malicious Mailserver node.
MailserverChange to keep Mailserver term consistent Replaced Whisper references with Waku
title: WAKU-USAGE -name: Waku Usage -status: deprecated -description: Status uses Waku to provide privacy-preserving routing and messaging on top of devP2P. -editor: Filip Dimitrijevic filip@status.im -contributors:
Status uses Waku to provide privacy-preserving routing and messaging on top of devP2P. Waku uses topics to partition its messages, @@ -34322,7 +30752,7 @@ Hence, all clients MUST use the following Whisper node settings:
0.000002
10
Handshake is a RLP-encoded packet sent to a newly connected peer. It MUST start with a Status Code (0x00) and follow up with items:
[ [ pow-requirement-key pow-requirement ] @@ -34542,8 +30972,8 @@ To move further back in time, use cursor and limit.Boolean - returns true if the request was sent. The above topics is then converted into a bloom filter and then and sent to the Mailserver. -Changelog -Version 0.1 +Changelog +Version 0.1 Released May 22, 2020
[ [ pow-requirement-key pow-requirement ] @@ -34542,8 +30972,8 @@ To move further back in time, use cursor and limit.Boolean
cursor
limit
The above topics is then converted into a bloom filter and then and sent to the Mailserver.
title: WHISPER-MAILSERVER -name: Whisper mailserver -status: deprecated -description: Whisper Mailserver is a Whisper extension that allows to store messages permanently and deliver them to the clients even though they are already not available in the network and expired. -editor: Filip Dimitrijevic filip@status.im -contributors:
Being mostly offline is an intrinsic property of mobile clients. They need to save network transfer and battery consumption to avoid spending too much money or constant charging. @@ -34655,7 +31090,7 @@ it SHOULD handle P2P Request Complete code (0x7d). This code is fol Cursor: an array of a cursor returned from the previous request (optional)
The node encrypts all Whisper envelopes. A Mailserver node can not inspect their contents.
MailserverWaku V1 May 22, 2020 change commit
title: WHISPER-USAGE -name: Whisper Usage -status: deprecated -description: Status uses Whisper to provide privacy-preserving routing and messaging on top of devP2P. -editor: Filip Dimitrijevic filip@status.im -contributors:
Status uses Whisper to provide privacy-preserving routing and messaging on top of devP2P. Whisper uses topics to partition its messages, @@ -34993,16 +31431,16 @@ To move further back in time, use cursor and limit.