rfc/content/docs/rfcs/17/README.md

190 lines
10 KiB
Markdown
Raw Normal View History

---
Merge repo with rfc.vac.dev (#310) * Hugo init * Init Hugo book * Add basic README and title * Import RFC: 1/COSS * Move example content to dedicated folder * Basic menu * Tweak single layout * Fix base url and permalink * Basic index tweaks * Add netifly config * gitignore * 1/COSS: Add COSS lifecycle * Remove public artifact * Add basic numbers in menu * Empty READMEs init * Import mvds spec raw * 2/MVDS: Simplify * 3/REMOTE-LOG: Import * 3/REMOTE-LOG: Simplify * 4/MVDS-META: Import * 4/MVDS-META Simplify * Tweaks * 5/WAKU0: Import * 5: Simplify * 6/WAKU1: Import * 6/WAKU1: Simplify * 7/WAKU-DATA: Import * 7/WAKU-DATA: Simplify * 8/WAKU-MAIL: Import * 8/WAKU-MAIL: Simplify * Tweak * 9/WAKU-RPC: Import * 9/WAKU-RPC: Simplify * 10/WAKU2: Import * 10/WAKU2: Simplify * 11/WAKU-RELAY: Import * Tweaks * 11/WAKU-RELAY: Simplify * 12/WAKU-FILTER: Import * 12/WAKU2-FILTER: Simplify * 13/WAKU-STORE: Import * 13/WAKU-STORE: Simplify * 14/WAKU-MESSAGE: Import * 14/WAKU-MESSAGE: Simplify * 15/WAKU-BRIDGE: Import * 15: Simplify * 16: Import * 16: Simplify * 17: Import * 17: Simplify * 18: Import * 18: Simplify * 12: Bump update * 14: Bump update * 11: Bump update * 17: Bump update * 18: Bump update * 16: Bump update * Fix slug for 18 * Editor changes for 11, 12, 15 * Revert "Editor changes for 11, 12, 15" This reverts commit 5c32fe791bec57ca1d5326e0d2724339f12a784a. * Revert "Revert "Editor changes for 11, 12, 15"" This reverts commit ccd75131d72a1f1c43b701f445fe66ebd6857fc4. * Editor changes for 13, 2, 4 * Move current specs to archive * Update README * bump
2021-04-01 04:03:14 +00:00
slug: 17
title: 17/WAKU-RLN-RELAY
Merge repo with rfc.vac.dev (#310) * Hugo init * Init Hugo book * Add basic README and title * Import RFC: 1/COSS * Move example content to dedicated folder * Basic menu * Tweak single layout * Fix base url and permalink * Basic index tweaks * Add netifly config * gitignore * 1/COSS: Add COSS lifecycle * Remove public artifact * Add basic numbers in menu * Empty READMEs init * Import mvds spec raw * 2/MVDS: Simplify * 3/REMOTE-LOG: Import * 3/REMOTE-LOG: Simplify * 4/MVDS-META: Import * 4/MVDS-META Simplify * Tweaks * 5/WAKU0: Import * 5: Simplify * 6/WAKU1: Import * 6/WAKU1: Simplify * 7/WAKU-DATA: Import * 7/WAKU-DATA: Simplify * 8/WAKU-MAIL: Import * 8/WAKU-MAIL: Simplify * Tweak * 9/WAKU-RPC: Import * 9/WAKU-RPC: Simplify * 10/WAKU2: Import * 10/WAKU2: Simplify * 11/WAKU-RELAY: Import * Tweaks * 11/WAKU-RELAY: Simplify * 12/WAKU-FILTER: Import * 12/WAKU2-FILTER: Simplify * 13/WAKU-STORE: Import * 13/WAKU-STORE: Simplify * 14/WAKU-MESSAGE: Import * 14/WAKU-MESSAGE: Simplify * 15/WAKU-BRIDGE: Import * 15: Simplify * 16: Import * 16: Simplify * 17: Import * 17: Simplify * 18: Import * 18: Simplify * 12: Bump update * 14: Bump update * 11: Bump update * 17: Bump update * 18: Bump update * 16: Bump update * Fix slug for 18 * Editor changes for 11, 12, 15 * Revert "Editor changes for 11, 12, 15" This reverts commit 5c32fe791bec57ca1d5326e0d2724339f12a784a. * Revert "Revert "Editor changes for 11, 12, 15"" This reverts commit ccd75131d72a1f1c43b701f445fe66ebd6857fc4. * Editor changes for 13, 2, 4 * Move current specs to archive * Update README * bump
2021-04-01 04:03:14 +00:00
name: Waku v2 RLN Relay
status: raw
tags: waku-core
Merge repo with rfc.vac.dev (#310) * Hugo init * Init Hugo book * Add basic README and title * Import RFC: 1/COSS * Move example content to dedicated folder * Basic menu * Tweak single layout * Fix base url and permalink * Basic index tweaks * Add netifly config * gitignore * 1/COSS: Add COSS lifecycle * Remove public artifact * Add basic numbers in menu * Empty READMEs init * Import mvds spec raw * 2/MVDS: Simplify * 3/REMOTE-LOG: Import * 3/REMOTE-LOG: Simplify * 4/MVDS-META: Import * 4/MVDS-META Simplify * Tweaks * 5/WAKU0: Import * 5: Simplify * 6/WAKU1: Import * 6/WAKU1: Simplify * 7/WAKU-DATA: Import * 7/WAKU-DATA: Simplify * 8/WAKU-MAIL: Import * 8/WAKU-MAIL: Simplify * Tweak * 9/WAKU-RPC: Import * 9/WAKU-RPC: Simplify * 10/WAKU2: Import * 10/WAKU2: Simplify * 11/WAKU-RELAY: Import * Tweaks * 11/WAKU-RELAY: Simplify * 12/WAKU-FILTER: Import * 12/WAKU2-FILTER: Simplify * 13/WAKU-STORE: Import * 13/WAKU-STORE: Simplify * 14/WAKU-MESSAGE: Import * 14/WAKU-MESSAGE: Simplify * 15/WAKU-BRIDGE: Import * 15: Simplify * 16: Import * 16: Simplify * 17: Import * 17: Simplify * 18: Import * 18: Simplify * 12: Bump update * 14: Bump update * 11: Bump update * 17: Bump update * 18: Bump update * 16: Bump update * Fix slug for 18 * Editor changes for 11, 12, 15 * Revert "Editor changes for 11, 12, 15" This reverts commit 5c32fe791bec57ca1d5326e0d2724339f12a784a. * Revert "Revert "Editor changes for 11, 12, 15"" This reverts commit ccd75131d72a1f1c43b701f445fe66ebd6857fc4. * Editor changes for 13, 2, 4 * Move current specs to archive * Update README * bump
2021-04-01 04:03:14 +00:00
editor: Sanaz Taheri <sanaz@status.im>
---
The current specification embodies the details of the spam-protected version of `relay` protocol empowered by Rate Limiting Nullifiers (RLN).
<!-- More details on RLN can be found in [this spec]() (TODO: to link the spec). -->
The security objective is to control the number of PubSub messages that each peer can publish per epoch where epoch is a system design parameter, regardless of the published topic.
**Protocol identifier***: `/vac/waku/waku-rln-relay/2.0.0-alpha1`
# Motivation
In open p2p messaging networks, one big problem is spam-resistance.
Existing solutions, such as Whispers proof of work, are insufficient, especially for heterogeneous nodes.
Other reputation-based approaches might not be desirable, due to issues around arbitrary exclusion and privacy.
We augment the `relay` protocol with a novel, light, and effective spam prevention mechanism which also suits the resource-constrained nodes.
<!-- TODO: Fill in more -->
# Flow
## SetUp and Registration
A peer willing to publish a message is required to register.
Registration is moderated through a smart contract deployed on the Ethereum blockchain.
The state of the contract contains the list of registered members.
An overview of registration is illustrated in Figure 1.
For the registration, a peer creates a transaction that sends x (TODO to be specified) ETH to the contract.
The peer who has the "private key" `sk` associated with that deposit would be able to withdraw x ETH by providing valid proof.
Note that `sk` is initially only known by the owning peer however it may get exposed to other peers in case the owner attempts spamming the system i.e., sending more than one message per epoch.
<!-- TODO: the interaction with the contract is subject to change depending on the final implementation -->
<!-- Once registered, the peer obtains the root of the tree (after the registration of the current peer) i.e., `root` as well as the authenticity path `authPath`. A peer can prove her membership using the `authPath`. -->
<!-- `sk` and `authPath` are secret data and MUST be permanently and locally stored by the peer. -->
<!-- TODO: To specify the details of protobuf messages for the interaction with the contract -->
Adds the sequence diagram of rln relay (#264) * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * Feature/add json rpc api spec (#265) * Minor improvements; added polling for latest messages * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Add Admin API (#267) * Add Admin API * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers Co-authored-by: Hanno Cornelius <68783915+jm-clius@users.noreply.github.com> Co-authored-by: Oskar Thorén <ot@oskarthoren.com>
2020-12-07 04:52:31 +00:00
<!-- diagram -->
![Figure 1: Registration.](../../../../static/rfcs/17/rln-relay.png)
Adds the sequence diagram of rln relay (#264) * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * Feature/add json rpc api spec (#265) * Minor improvements; added polling for latest messages * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Add Admin API (#267) * Add Admin API * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers Co-authored-by: Hanno Cornelius <68783915+jm-clius@users.noreply.github.com> Co-authored-by: Oskar Thorén <ot@oskarthoren.com>
2020-12-07 04:52:31 +00:00
<!-- TODO: the function calls in this figure as well as messages are subject to change -->
Adds the sequence diagram of rln relay (#264) * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * Feature/add json rpc api spec (#265) * Minor improvements; added polling for latest messages * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Add Admin API (#267) * Add Admin API * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers Co-authored-by: Hanno Cornelius <68783915+jm-clius@users.noreply.github.com> Co-authored-by: Oskar Thorén <ot@oskarthoren.com>
2020-12-07 04:52:31 +00:00
## Publishing
In order to publish at a given `epoch`, the publishing peer proceeds based on the regular relay protocol.
However, in order to protect against spamming, each PubSub message must carry a `proof`.
At a high level, the `proof` is a zero-knowledge proof signifying that the publishing peer is a registered member, and she has not exceeded the messaging rate at the given `epoch`.
<!-- TODO: to clarify what a zero-knowledge proof means -->
The `proof` is embedded inside the `data` field of the PubSub message, which, in the [11/WAKU2-RELAY](/spec/11) protocol, corresponds to the [14/WAKU2-MESSAGE](/spec/14).
The proof generation relies on the knowledge of two pieces of private information i.e., `sk` and `authPath`.
`authPath` is the information by which one can prove its membership in the group. <!-- TODO explain what is atuh path -->
To construct `authPath`, peers need to locally store a Merkle tree out of the group members public keys.
Peers need to keep the tree updated with the recent state of the group.
Further inputs to the proof generation which are public are tree's `root`, `epoch` and `payload||contentTopic` where `payload` and `contentTopic` come from the `WakuMessage`.
The tree `root` can be obtained from the locally maintained Merkle tree.
The proof generation results in the following data items which are encoded inside the `proof`:
1. `share_x`
2. `share_y`
Adds the sequence diagram of rln relay (#264) * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * Feature/add json rpc api spec (#265) * Minor improvements; added polling for latest messages * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Add Admin API (#267) * Add Admin API * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers Co-authored-by: Hanno Cornelius <68783915+jm-clius@users.noreply.github.com> Co-authored-by: Oskar Thorén <ot@oskarthoren.com>
2020-12-07 04:52:31 +00:00
3. `nullifier`
4. `zkSNARKs`
The preceding values as well as the tree `root` (based on which the proof is generated) are encoded inside the `proof` as `|zkSNARKs<256>|root<32>|epoch<32>|share_x<32>|share_y<32>|nullifier<32>|`.
The numbers enclosed in angle brackets indicate the bit length of the corresponding data item.
The tuple of (`nullifier`, `share_x`, `share_y`) can be seen as partial disclosure of peer's `sk` for the intended `epoch`.
Given two such tuples with identical `nullifier` but distinct `share_x`, `share_y` results in full disclosure of peer's `sk` and hence burning the associated deposit.
Note that the `nullifier` is a deterministic value derived from `sk` and `epoch` therefore any two messages issued by the same peer (i.e., sing the same `sk`) for the same `epoch` are guaranteed to have identical `nullifier`s.
Note that the `authPath` of each peer depends on the current status of the registration tree (hence changes when new peers register).
As such, it is recommended (and necessary for anonymity) that the publisher updates her `authPath` based on the latest status of the group and attempts the proof using her updated `authPath`.
## Routing
Upon the receipt of a PubSub message, the routing peer needs to extract and parse the `proof` from the `data` field.
If the `epoch` attached to the message has a non-reasonable gap (TODO: the gap should be defined) with the routing peer's current `epoch` then the message must be dropped (this is to prevent a newly registered peer spamming the system by messaging for all the past epochs).
Furthermore, the routing peers MUST check whether the `proof` is valid and the message is not spam.
If both checks are passed successfully, then the message is relayed.
If `proof` is invalid then the message is dropped.
If spamming is detected, the publishing peer gets slashed.
An overview of routing procedure is depicted in Figure 2.
### Spam Detection and Slashing
In order to enable local spam detection and slashing, routing peers MUST record the `nullifier`, `share_x`, and `share_y` of any incoming message conditioned that it is not spam and has valid proof.
To do so, the peer should follow the following steps.
1. The routing peer first verifies the `zkSNARKs` and drops the message if not verified.
Adds the sequence diagram of rln relay (#264) * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * Feature/add json rpc api spec (#265) * Minor improvements; added polling for latest messages * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Add Admin API (#267) * Add Admin API * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers Co-authored-by: Hanno Cornelius <68783915+jm-clius@users.noreply.github.com> Co-authored-by: Oskar Thorén <ot@oskarthoren.com>
2020-12-07 04:52:31 +00:00
2. Otherwise, it checks whether a message with an identical `nullifier` has already been relayed.
1. If such message exists and its `share_x` and `share_y` components are different from the incoming message, then slashing takes place (if the `share_x` and `share_y` fields of the previously relayed message is identical to the incoming message, then the message is a duplicate and shall be dropped).
2. If none found, then the message gets relayed.
Adds the sequence diagram of rln relay (#264) * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * Feature/add json rpc api spec (#265) * Minor improvements; added polling for latest messages * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Add Admin API (#267) * Add Admin API * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers Co-authored-by: Hanno Cornelius <68783915+jm-clius@users.noreply.github.com> Co-authored-by: Oskar Thorén <ot@oskarthoren.com>
2020-12-07 04:52:31 +00:00
An overview of slashing procedure is provided in Figure 2.
<!-- TODO: may shorten or delete the Spam detection and slashing process -->
<!-- TODO: may consider [validator functions](https://github.com/libp2p/specs/tree/master/pubsub#topic-validation) or [extended validators](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md#extended-validators) for the spam detection -->
![Figure 2: Publishing, Routing and Slashing workflow.](../../../../static/rfcs/17/rln-message-verification.png)
Adds the sequence diagram of rln relay (#264) * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * Feature/add json rpc api spec (#265) * Minor improvements; added polling for latest messages * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Add Admin API (#267) * Add Admin API * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers Co-authored-by: Hanno Cornelius <68783915+jm-clius@users.noreply.github.com> Co-authored-by: Oskar Thorén <ot@oskarthoren.com>
2020-12-07 04:52:31 +00:00
<!-- TODO: the function calls in this figure as well as messages are subject to change -->
Adds the sequence diagram of rln relay (#264) * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * Feature/add json rpc api spec (#265) * Minor improvements; added polling for latest messages * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Add Admin API (#267) * Add Admin API * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers * adds the registration image * Updates the registration seq diagram with more descriotions * WIP: the message verification diagram * fixes some spacing issues * minor * adds the routing and publishing figure * minor * fixes a format issue * adds nullifier map init for all the relay nodes * removes box borders * returns the borders * fixes spacing issues * internalNullifier -> nullifier, and edits on the msc figures * edits the slash part * updates spacing of the rln-relay figure * edits on entities * Update waku-rln-relay.md * adds references to the figures in the text * minor * adds one more relay node to the registration fig * Update assets/rln-relay/rln-relay.msc Co-authored-by: Oskar Thorén <ot@oskarthoren.com> * changes the width of figure 2 * some spacing edits and file headers Co-authored-by: Hanno Cornelius <68783915+jm-clius@users.noreply.github.com> Co-authored-by: Oskar Thorén <ot@oskarthoren.com>
2020-12-07 04:52:31 +00:00
# Security Considerations
<!-- TODO: add discussion about the anonymity (e.g., the `StrictNoSign` policy) -->
<!-- TODO: discuss about the economic spam guarantees -->
-------
# Payloads
Payloads are protobuf messages implemented using [protocol buffers v3](https://developers.google.com/protocol-buffers/).
Nodes MAY extend the [14/WAKU2-MESSAGE](/spec/14) with a `proof` field to indicate that their message is not a spam.
```diff
syntax = "proto3";
message RateLimitProof {
bytes proof = 1;
bytes merkle_root = 2;
bytes epoch = 3;
bytes share_x = 4;
bytes share_y = 5;
bytes nullifier = 6;
}
message WakuMessage {
bytes payload = 1;
string contentTopic = 2;
uint32 version = 3;
double timestamp = 4;
+ RateLimitProof rate_limit_proof = 21;
}
```
## WakuMessage
`rate_limit_proof` holds the information required to prove that the message owner has not exceeded the message rate limit.
## RateLimitProof
The `proof` field is an array of 256 bytes and carries the zkSNARK proof as explained in the [Publishing process](##Publishing).
The proof asserts that:
1. The message publisher is the current member of the group i.e., her/his identity commitment key is part of the membership group Merkle tree with the root `merkleRoot`.
2. `share_x` and `share_y` are correctly computed.
3. The `nullifier` is constructed correctly.
Other fields of the `RateLimitProof` message are the public inputs to the rln circuit and used for the generation of the `proof`.
The `merkleRoot` is an array of 32 bytes which holds the root of membership group Merkle tree at the time of publishing the message.
The `epoch` is an array of 32 bytes that represents the epoch in which the message is published.
<!-- TODO epoch is going to change to a different type -->
`share_x` and `share_y` are shares of the user's identity key.
These shares are created using [Shamir secret sharing scheme](##Publishing).
`share_x` is an array of 32 bytes and contains the hash of the `WakuMessage`'s `payload` concatenated with its `contentTopic`.
<!-- TODO hash other fields if necessary-->
`share_y` is also an array of 32 bytes which is calculated using [Shamir secret sharing scheme](##Publishing).
The `nullifier` is an internal nullifier which allows specifying whether two messages are published by the same publisher during the same `epoch`.
It is an array of 32 bytes.
<!-- TODO to reflect this change on WakuMessage spec once the PR gets mature -->
2021-10-16 02:49:57 +00:00
# Copyright
Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
# References
1. [RLN documentation](https://hackmd.io/tMTLMYmTR5eynw2lwK9n1w?view)
2. [Public inputs to the rln circuit](https://hackmd.io/tMTLMYmTR5eynw2lwK9n1w?view#Public-Inputs)
3. [Shamir secret sharing scheme used in RLN](https://hackmd.io/tMTLMYmTR5eynw2lwK9n1w?view#Linear-Equation-amp-SSS)
4. [RLN internal nullifier](https://hackmd.io/tMTLMYmTR5eynw2lwK9n1w?view#Nullifiers)