feat(17/WAKU2-RLN-RELAY): multiple acceptable roots (#539)

* feat(17/WAKU2-RLN-RELAY): multiple acceptable roots

* chore(17/WAKU2-RLN-RELAY): fix inconsistency with naming

* fix(17/WAKU2-RLN-RELAY): waku-relay naming

Co-authored-by: fryorcraken.eth <110212804+fryorcraken@users.noreply.github.com>

* chore(17/WAKU2-RLN-RELAY): naming

Co-authored-by: Hanno Cornelius <68783915+jm-clius@users.noreply.github.com>

* fix(17/WAKU2-RLN-RELAY): clear reasoning behind why nodes have diff roots

* fix(17/WAKU2-RLN-RELAY): sembr and wording

* chore(17/WAKU2-RLN-RELAY): s/merkle/Merkle/ and network delay

* chore(17/WAKU2-RLN-RELAY): contributor notes

* fix(17/WAKU2-RLN-RELAY): formula for window size

* chore(17/WAKU2-RLN-RELAY): add explanation of formula

* chore(17/WAKU2-RLN-RELAY): address review

Co-authored-by: Sanaz Taheri <35961250+staheri14@users.noreply.github.com>

* chore(17/WAKU2-RLN-RELAY): block_time var

Co-authored-by: fryorcraken.eth <110212804+fryorcraken@users.noreply.github.com>
Co-authored-by: Hanno Cornelius <68783915+jm-clius@users.noreply.github.com>
Co-authored-by: Sanaz Taheri <35961250+staheri14@users.noreply.github.com>
This commit is contained in:
Aaryamann Challani 2022-10-19 11:16:26 +05:30 committed by GitHub
parent 977955ebfd
commit c8e14ed836
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 35 additions and 14 deletions

View File

@ -124,7 +124,7 @@ Waku is using gossiping to disseminate messages throughout the network.
See [11/WAKU2-RELAY](/spec/11) spec for more details.
For an experimental privacy-preserving economic spam protection mechanism, see [17/WAKU2-RLNRELAY](/spec/17).
For an experimental privacy-preserving economic spam protection mechanism, see [17/WAKU2-RLN-RELAY](/spec/17).
See [23/WAKU2-TOPICS](/spec/23) for more information about recommended topic usage.
@ -373,7 +373,7 @@ This includes Waku v1 specs, as they are used for bridging between the two netwo
|[14/WAKU2-MESSAGE](/spec/14)|✔|✔|✔|✔|
|[15/WAKU2-BRIDGE](/spec/15)|✔|||
|[16/WAKU2-RPC](/spec/16)|✔|||
|[17/WAKU2-RLNRELAY](/spec/17)|🚧|||
|[17/WAKU2-RLN-RELAY](/spec/17)|🚧|||
|[18/WAKU2-SWAP](/spec/18)|🚧|||
|[19/WAKU2-LIGHTPUSH](/spec/19)|✔|✔|✔\**|✔\**|
|[21/WAKU2-FAULT-TOLERANT-STORE](/spec/21)|✔|✔||
@ -407,7 +407,7 @@ The following features are currently experimental and under research and initial
**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-RLNRELAY](/spec/17).
More details on this can be found in [17/WAKU2-RLN-RELAY](/spec/17).
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**:
@ -455,7 +455,7 @@ Copyright and related rights waived via [CC0](https://creativecommons.org/public
14. [14/WAKU2-MESSAGE spec](/spec/14)
15. [14/WAKU2-RLNRELAY spec](/spec/17)
15. [17/WAKU2-RLN-RELAY spec](/spec/17)
16. [18/WAKU2-SWAP spec](/spec/18)

View File

@ -151,7 +151,7 @@ Spam protection is partly provided by GossipSub v1.1 through [scoring mechanism]
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` aims at enabling an advanced spam protection mechanism with economic disincentives by utilizing Rate Limiting Nullifiers.
In a nutshell, peers must conform to a certain message publishing rate per a system-defined epoch, otherwise, they get financially penalized for exceeding the rate.
More details on this new technique can be found in [`17/WAKU-RLN-RELAY`](/spec/17).
More details on this new technique can be found in [`17/WAKU2-RLN-RELAY`](/spec/17).
<!-- TODO havn't checked if all the measures in libp2p GossipSub v1.1 are taken in the nim-libp2p as well, may need to audit the code -->
- Providing **Unlinkability**, **Integrity** and **Authenticity** simultaneously:

View File

@ -1,15 +1,16 @@
---
slug: 17
title: 17/WAKU-RLN-RELAY
title: 17/WAKU2-RLN-RELAY
name: Waku v2 RLN Relay
status: draft
tags: waku-core
editor: Sanaz Taheri <sanaz@status.im>
contributors:
- Oskar Thorén <oskar@status.im>
- Aaryamann Challani <aaryamann@status.im>
---
The `17/WAKU-RLN-RELAY` protocol is an extension of `11/WAKU-RELAY` which additionally provides spam protection using [Rate Limiting Nullifiers (RLN)](/spec/32).
The `17/WAKU2-RLN-RELAY` protocol is an extension of `11/WAKU2-RELAY` which additionally provides spam protection using [Rate Limiting Nullifiers (RLN)](/spec/32).
The security objective is to contain spam activity in a GossipSub network by enforcing a global messaging rate to all the peers.
Peers that violate the messaging rate are considered spammers and their message is considered spam.
@ -35,7 +36,7 @@ We define an `epoch` as $\lceil$ `unix_time` / `period` $\rceil$. For example, i
Note that `epoch` refers to epoch in RLN and not Unix epoch. This means a message can only be sent every period, where period is up to the application.
See see section [Recommended System Parameters](#recommended-system-parameters) for some recommended ways to set a sensible `period` value depending on the application.
Peers subscribed to a spam-protected `pubsubTopic` are only allowed to send one message per `epoch`.
The higher-level layers adopting `17/WAKU-RLN-RELAY` MAY choose to enforce the messaging rate for `WakuMessages` with a specific `contentTopic` published on a `pubsubTopic`.
The higher-level layers adopting `17/WAKU2-RLN-RELAY` MAY choose to enforce the messaging rate for `WakuMessages` with a specific `contentTopic` published on a `pubsubTopic`.
@ -85,7 +86,7 @@ For more details about the proof generation check [RLN](/spec/32)
The proof generation relies on the knowledge of two pieces of private information i.e., `sk` and `authPath`.
The `authPath` is a subset of Merkle tree nodes by which a peer can prove the inclusion of its `pk` in the group. <!-- TODO refer to RLN RFC for authPath def -->
The proof generation also requires a set of public inputs which are: the Merkle tree root `merkle_root`, the current `epoch`, and the message for which the proof is going to be generated.
In `17/WAKU-RLN-RELAY`, the message is the concatenation of `WakuMessage`'s `payload` filed and its `contentTopic` i.e., `payload||contentTopic`.
In `17/WAKU2-RLN-RELAY`, the message is the concatenation of `WakuMessage`'s `payload` filed and its `contentTopic` i.e., `payload||contentTopic`.
## Group Synchronization
@ -110,6 +111,13 @@ If the `epoch` attached to the message is more than `max_epoch_gap` apart from t
This is to prevent a newly registered peer from spamming the system by messaging for all the past epochs.
`max_epoch_gap` is a system parameter for which we provide some recommendations in section [Recommended System Parameters](#recommended-system-parameters).
**Merkle Root Validation**
The routing peers MUST check whether the provided Merkle root in the `RateLimitProof` is valid.
It can do so by maintaining a local set of valid Merkle roots, which consist of `acceptable_root_window_size` past roots.
This allows peers which are not well connected to the network to be able to send messages, accounting for network delay.
This network delay is related to the nature of asynchronous network conditions, which means that peers see membership changes asynchronously, and therefore may have differing local Merkle trees.
See [Recommended System Parameters](#recommended-system-parameters) on choosing an appropriate `acceptable_root_window_size`.
**Proof Verification**
The routing peers MUST check whether the zero-knowledge proof `proof` is valid.
It does so by running the zk verification algorithm as explained in [RLN](/spec/32).
@ -181,15 +189,16 @@ The system parameters are summarized in the following table, and the recommended
| Parameter | Description |
| ----: |----------- |
| `period` | the length of `epoch` in seconds |
| `staked_fund` | the amount of ether to be staked by peers at the registration |
| `staked_fund` | the amount of wei to be staked by peers at the registration |
| `reward_portion` | the percentage of `staked_fund` to be rewarded to the slashers |
| `max_epoch_gap` | the maximum allowed gap between the `epoch` of a routing peer and the incoming message |
| `acceptable_root_window_size` | The maximum number of past Merkle roots to store |
## Epoch Length
A sensible value for the `period` depends on the application for which the spam protection is going to be used.
For example, while the `period` of `1` second i.e., messaging rate of `1` per second, might be acceptable for a chat application, might be too low for communication among Ethereum network validators.
One should look at the desired throughput of the application to decide on a proper `period` value.
In the proof of concept implementation of `17/WAKU-RLN-RELAY` protocol which is available in [nim-waku](https://github.com/status-im/nim-waku), the `period` is set to `1` second.
In the proof of concept implementation of `17/WAKU2-RLN-RELAY` protocol which is available in [nim-waku](https://github.com/status-im/nim-waku), the `period` is set to `1` second.
Nevertheless, this value is also subject to change depending on user experience.
## Maximum Epoch Gap
@ -203,6 +212,18 @@ With a reasonable approximation of the preceding values, one can set `max_epoch
`Network_Delay` and `Clock_Asynchrony` MUST have the same resolution as `period` .
By this formulation, `max_epoch_gap` indeed measures the maximum number of `epoch`s that can elapse since a message gets routed from its origin to all the other peers in the network.
`acceptable_root_window_size` depends upon the underlying chain's average blocktime, `block_time`
The lower bound for the `acceptable_root_window_size` SHOULD be set as $acceptable_root_window_size=(Network_Delay)/block_time$
`Network_Delay` MUST have the same resolution as `block_time`.
By this formulation, `acceptable_root_window_size` will provide a lower bound 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 and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
@ -212,4 +233,4 @@ Copyright and related rights waived via [CC0](https://creativecommons.org/public
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)
4. [RLN internal nullifier](https://hackmd.io/tMTLMYmTR5eynw2lwK9n1w?view#Nullifiers)

View File

@ -23,7 +23,7 @@ RLN guarantees a messaging rate is enforced cryptographically while preserving t
A wide range of applications can benefit from RLN and provide desirable security features.
For example, an e-voting system can integrate RLN to contain the voting rate while protecting the voters-vote unlinkability.
Another use case is to protect an anonymous messaging system against DDoS and spam attacks by containing messaging rate of users.
This latter use case is explained in [17/Waku-RLN-Relay RFC](/spec/17).
This latter use case is explained in [17/WAKU2-RLN-RELAY RFC](/spec/17).
# Flow

View File

@ -24,7 +24,7 @@ bookMenuLevels: 1
- [14/WAKU2-MESSAGE]({{< relref "/docs/rfcs/14/README.md" >}})
- [15/WAKU2-BRIDGE]({{< relref "/docs/rfcs/15/README.md" >}})
- [16/WAKU2-RPC]({{< relref "/docs/rfcs/16/README.md" >}})
- [17/WAKU2-RLNRELAY]({{< relref "/docs/rfcs/17/README.md" >}})
- [17/WAKU2-RLN-RELAY]({{< relref "/docs/rfcs/17/README.md" >}})
- [18/WAKU2-SWAP]({{< relref "/docs/rfcs/18/README.md" >}})
- [19/WAKU2-LIGHTPUSH]({{< relref "/docs/rfcs/19/README.md" >}})
- [21/WAKU2-FTSTORE]({{< relref "/docs/rfcs/21/README.md" >}})