# Building a local network of spam-protected chat2 clients This document is a tutorial on how to locally set up a small network of chat2 clients in a spam-protected mode using the waku-RLN-Relay protocol. In the provided test scenario, you will set up three chat2 clients. For ease of explanation, we will refer to them as `Alice`, `Bob`, and `Carol`. `Bob` and `Carol` are directly connected to `Alice` so that their message will be routed via `Alice`. In this setting, if `Bob` or `Carol` attempts to spam the network by violating the message rate limit then `Alice` will detect their spamming activity, and does not relay the spam messages. The message rate is one per epoch. At the time of this tutorial, the epoch duration is set to `10` seconds. You can inspect its current value by checking the following [constant variable](https://github.com/waku-org/nwaku/blob/44c543129ee4149255a00a05f1e7d21f8fa28626/waku/v2/waku_rln_relay/constants.nim#L51) in the nim-waku codebase. # Set up ## Build chat2 First, build chat2 with the RLN flag set to true. ``` make chat2 RLN=true ``` ## Create a local network of chat2 clients Next, set up the following three chat2 clients in order. As `Alice` is going to be the only connection point between `Bob` and `Carol`, you need to set it up first before `Bob` and `Carol`. **Alice setup**: Run the following command to set up the first chat2 client. In this command, the `rln-relay` flag is set to true to enable RLN-Relay protocol for the spam protection. The `rln-relay-membership-index` is used to pick one RLN key out of the 100 available hardcoded RLN keys. We use the first RLN key of the list for `Alice` i.e., `--rln-relay-membership-index:1`. ``` ./build/chat2 --staticnode:/ip4/127.0.0.1/tcp/60010/p2p/16Uiu2HAmKdCdP89q6CwLc6PeFDJnVR1EmM7fTgtphHiacSNBnuAz --content-topic:/toy-chat/3/mingde/proto --ports-shift=1 --fleet:none --nodekey=f157b19b13e9ee818acfc9d3d7eec6b81f70c0a978dec19def261172acbe26e6 --rln-relay:true --rln-relay-membership-index:1 ``` Next, you will be prompted with a message to choose a nickname, set it to `Alice`: ``` Choose a nickname >> Alice ``` Wait for the chat prompt `>>` to appear. Now your first chat2 client is ready. **Bob setup**: Set up the second chat2 client using the command below. Choose `Bob` as the nickname. ``` ./build/chat2 --staticnode:/ip4/127.0.0.1/tcp/60001/p2p/16Uiu2HAkyTos6LeGrj1YJyA3WYzp9qKQGCsxbtvyoBRHSu9PCrQZ --content-topic:/toy-chat/3/mingde/proto --ports-shift=2 --fleet:none --nodekey=9ab635854ffe8fed32b17d7ef38e0b2f354ca1f3283b7f78fb77227004d2cbe6 --rln-relay:true --rln-relay-membership-index:2 Choose a nickname >> Bob ``` **Carol setup**: Run the following command to set up the third chat2 client, and choose `Carol` as the nickname. ``` ./build/chat2 --staticnode:/ip4/127.0.0.1/tcp/60001/p2p/16Uiu2HAkyTos6LeGrj1YJyA3WYzp9qKQGCsxbtvyoBRHSu9PCrQZ --content-topic:/toy-chat/3/mingde/proto --ports-shift=3 --fleet:none --nodekey=0aa89d7f27300c9fb4e119acc225c8873a3bf96bbb4c82045c94934bcc6a6af8 --rln-relay:true --rln-relay-membership-index:3 Choose a nickname >> Carol ``` # Run the test Now that the network is formed, you can start chatting. For a better illustration of spam protection, use `Bob` and `Carol` clients for chatting and let `Alice` act only as a router. Once you type a chat line and hit enter, you will see a message that indicates the epoch at which the message is sent e.g., ``` >> Hi! --rln epoch: 164495684 Bob: Hi! ``` The numerical value `164495684` indicates the epoch of the message `Hi!`. You will see a different value than `164495684` on your screen. If two messages sent by the same chat2 client happen to have the same RLN epoch value, then one of them will be detected as spam and won't be routed (by Alice in this test setting). At the time of this tutorial, the epoch duration is set to `10` seconds. Thus, if you send two messages less than `10` seconds apart, they are likely to get the same `rln epoch` values. After sending a chat message, you may experience some delay before the next chat prompt appears. The reason is that under the hood a zero-knowledge proof is being generated and attached to your message. Once you are done with the test, make sure you close all the chat2 clients by typing `/exit` command. ``` >> /exit quitting... ``` # Sample test output In the following sample test, `Bob` sends three messages namely, `message1`, `message2`, and `message3`. The two messages `message2` and `message3` have identical RLN epoch value of `164504930`, so, one of them will be discarded by `Alice` as a spam message. You can check this fact by looking at the `Alice` console, where `A spam message is found and discarded : Bob: message3` is presented. `Alice` does not relay `message3` further, hence `Carol` never receives it. Bob ``` ./build/chat2 --staticnode:/ip4/127.0.0.1/tcp/60001/p2p/16Uiu2HAkyTos6LeGrj1YJyA3WYzp9qKQGCsxbtvyoBRHSu9PCrQZ --content-topic:/toy-chat/3/mingde/proto --ports-shift=2 --fleet:none --nodekey=9ab635854ffe8fed32b17d7ef38e0b2f354ca1f3283b7f78fb77227004d2cbe6 --rln-relay:true --rln-relay-membership-index:2 Choose a nickname >> Bob Welcome, Bob! Connecting to nodes Listening on /ip4/75.157.120.249/tcp/60002/p2p/16Uiu2HAmKdCdP89q6CwLc6PeFDJnVR1EmM7fTgtphHiacSNBnuAz >> message1 --rln epoch: 164504929 Bob: message1 >> message2 --rln epoch: 164504930 Bob: message2 >> message3 --rln epoch: 164504930 Bob: message3 >> message4 --rln epoch: 164504973 Bob: message4 >> /exit quitting... ``` Alice ``` ./build/chat2 --staticnode:/ip4/127.0.0.1/tcp/60010/p2p/16Uiu2HAmKdCdP89q6CwLc6PeFDJnVR1EmM7fTgtphHiacSNBnuAz --content-topic:/toy-chat/3/mingde/proto --ports-shift=1 --fleet:none --nodekey=f157b19b13e9ee818acfc9d3d7eec6b81f70c0a978dec19def261172acbe26e6 --rln-relay:true --rln-relay-membership-index:1 Choose a nickname >> Alice Welcome, Alice! Connecting to nodes Listening on /ip4/75.157.120.249/tcp/60001/p2p/16Uiu2HAkyTos6LeGrj1YJyA3WYzp9qKQGCsxbtvyoBRHSu9PCrQZ >> Bob: message1 >> Bob: message2 >> A spam message is found and discarded : Bob: message3 Bob: message4 >> /exit quitting... ``` Carol ``` ./build/chat2 --staticnode:/ip4/127.0.0.1/tcp/60001/p2p/16Uiu2HAkyTos6LeGrj1YJyA3WYzp9qKQGCsxbtvyoBRHSu9PCrQZ --content-topic:/toy-chat/3/mingde/proto --ports-shift=3 --fleet:none --nodekey=0aa89d7f27300c9fb4e119acc225c8873a3bf96bbb4c82045c94934bcc6a6af8 --rln-relay:true --rln-relay-membership-index:3 Choose a nickname >> Carol Welcome, Carol! Connecting to nodes Listening on /ip4/75.157.120.249/tcp/60003/p2p/16Uiu2HAm1bEDWZqjxfYRvGo1UpjaejkenJVmMFMPMDmgWWGkREJu >> Bob: message1 >> Bob: message2 >> Bob: message4 >> /exit quitting... ```