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 in the nim-waku codebase.
First, build chat2 with the RLN flag set to true.
make chat2 RLN=true
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/2/luzhou/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/2/luzhou/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/2/luzhou/proto --ports-shift=3 --fleet:none --nodekey=0aa89d7f27300c9fb4e119acc225c8873a3bf96bbb4c82045c94934bcc6a6af8 --rln-relay:true --rln-relay-membership-index:3
Choose a nickname >> Carol
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
<Feb 15, 12:27> 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...
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 : <Feb 16, 14:08> 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/2/luzhou/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
<Feb 16, 14:08> Bob: message1
>> message2
--rln epoch: 164504930
<Feb 16, 14:08> Bob: message2
>> message3
--rln epoch: 164504930
<Feb 16, 14:08> Bob: message3
>> message4
--rln epoch: 164504973
<Feb 16, 14:15> Bob: message4
>> /exit
quitting...
Alice
./build/chat2 --staticnode:/ip4/127.0.0.1/tcp/60010/p2p/16Uiu2HAmKdCdP89q6CwLc6PeFDJnVR1EmM7fTgtphHiacSNBnuAz --content-topic:/toy-chat/2/luzhou/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
>> <Feb 16, 14:08> Bob: message1
>> <Feb 16, 14:08> Bob: message2
>> A spam message is found and discarded : <Feb 16, 14:08> Bob: message3
<Feb 16, 14:15> Bob: message4
>> /exit
quitting...
Carol
./build/chat2 --staticnode:/ip4/127.0.0.1/tcp/60001/p2p/16Uiu2HAkyTos6LeGrj1YJyA3WYzp9qKQGCsxbtvyoBRHSu9PCrQZ --content-topic:/toy-chat/2/luzhou/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
>> <Feb 16, 14:08> Bob: message1
>> <Feb 16, 14:08> Bob: message2
>> <Feb 16, 14:15> Bob: message4
>> /exit
quitting...