2022-09-06 20:43:46 +02:00
{. used . }
import
2023-06-19 13:46:05 +05:30
std / [ sequtils , tempfiles ] ,
2022-09-06 20:43:46 +02:00
stew / byteutils ,
2022-11-04 10:52:08 +01:00
stew / shims / net as stewNet ,
2022-09-06 20:43:46 +02:00
testutils / unittests ,
2022-11-04 10:52:08 +01:00
chronicles ,
chronos ,
2022-09-06 20:43:46 +02:00
libp2p / switch ,
2023-09-06 13:48:02 +05:30
libp2p / protocols / pubsub / pubsub
2022-09-06 20:43:46 +02:00
import
2023-08-09 18:11:50 +01:00
.. / .. / .. / waku / waku_core ,
.. / .. / .. / waku / waku_node ,
.. / .. / .. / waku / waku_rln_relay ,
2023-04-05 16:01:51 +02:00
.. / testlib / wakucore ,
2024-03-12 16:20:30 +05:30
.. / testlib / wakunode ,
. / rln / waku_rln_relay_utils
2022-09-06 20:43:46 +02:00
from std / times import epochTime
procSuite " WakuNode - RLN relay " :
2024-03-12 16:20:30 +05:30
# NOTE: we set the rlnRelayUserMessageLimit to 1 to make the tests easier to reason about
2022-09-06 20:43:46 +02:00
asyncTest " testing rln-relay with valid proof " :
let
# publisher node
2023-02-13 11:43:49 +01:00
nodeKey1 = generateSecp256k1Key ( )
2023-12-14 07:16:39 +01:00
node1 = newTestWakuNode ( nodeKey1 , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) )
2022-09-06 20:43:46 +02:00
# Relay node
2023-02-13 11:43:49 +01:00
nodeKey2 = generateSecp256k1Key ( )
2023-12-14 07:16:39 +01:00
node2 = newTestWakuNode ( nodeKey2 , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) )
2022-09-06 20:43:46 +02:00
# Subscriber
2023-02-13 11:43:49 +01:00
nodeKey3 = generateSecp256k1Key ( )
2023-12-14 07:16:39 +01:00
node3 = newTestWakuNode ( nodeKey3 , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) )
2022-09-06 20:43:46 +02:00
contentTopic = ContentTopic ( " /waku/2/default-content/proto " )
# set up three nodes
# node1
2023-08-21 08:55:34 +02:00
await node1 . mountRelay ( @ [ DefaultPubsubTopic ] )
2022-11-04 08:30:42 +05:30
2022-09-06 20:43:46 +02:00
# mount rlnrelay in off-chain mode
2024-03-12 16:20:30 +05:30
when defined ( rln_v2 ) :
let wakuRlnConfig1 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 1 . uint ) ,
rlnRelayUserMessageLimit : 1 ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode " ) )
else :
let wakuRlnConfig1 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 1 . uint ) ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode " ) )
await node1 . mountRlnRelay ( wakuRlnConfig1 )
2022-11-04 08:30:42 +05:30
2022-09-06 20:43:46 +02:00
await node1 . start ( )
# node 2
2023-08-21 08:55:34 +02:00
await node2 . mountRelay ( @ [ DefaultPubsubTopic ] )
2022-09-06 20:43:46 +02:00
# mount rlnrelay in off-chain mode
2024-03-12 16:20:30 +05:30
when defined ( rln_v2 ) :
let wakuRlnConfig2 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 2 . uint ) ,
rlnRelayUserMessageLimit : 1 ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_2 " ) )
else :
let wakuRlnConfig2 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 2 . uint ) ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_2 " ) )
await node2 . mountRlnRelay ( wakuRlnConfig2 )
2022-11-04 08:30:42 +05:30
2022-09-06 20:43:46 +02:00
await node2 . start ( )
# node 3
2023-08-21 08:55:34 +02:00
await node3 . mountRelay ( @ [ DefaultPubsubTopic ] )
2022-11-04 08:30:42 +05:30
2024-03-12 16:20:30 +05:30
when defined ( rln_v2 ) :
let wakuRlnConfig3 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 3 . uint ) ,
rlnRelayUserMessageLimit : 1 ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_3 " ) )
else :
let wakuRlnConfig3 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 3 . uint ) ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_3 " ) )
await node3 . mountRlnRelay ( wakuRlnConfig3 )
2022-11-04 08:30:42 +05:30
2022-09-06 20:43:46 +02:00
await node3 . start ( )
# connect them together
await node1 . connectToNodes ( @ [ node2 . switch . peerInfo . toRemotePeerInfo ( ) ] )
await node3 . connectToNodes ( @ [ node2 . switch . peerInfo . toRemotePeerInfo ( ) ] )
var completionFut = newFuture [ bool ] ( )
2023-06-06 19:28:47 +02:00
proc relayHandler ( topic : PubsubTopic , msg : WakuMessage ) : Future [ void ] {. async , gcsafe . } =
debug " The received topic: " , topic
2023-08-21 08:55:34 +02:00
if topic = = DefaultPubsubTopic :
2023-06-06 19:28:47 +02:00
completionFut . complete ( true )
2022-09-06 20:43:46 +02:00
# mount the relay handler
2023-09-26 07:33:52 -04:00
node3 . subscribe ( ( kind : PubsubSub , topic : DefaultPubsubTopic ) , some ( relayHandler ) )
2022-09-06 20:43:46 +02:00
await sleepAsync ( 2000 . millis )
# prepare the message payload
let payload = " Hello " . toBytes ( )
# prepare the epoch
var message = WakuMessage ( payload : @ payload , contentTopic : contentTopic )
2024-03-12 16:20:30 +05:30
doAssert ( node1 . wakuRlnRelay . unsafeAppendRLNProof ( message , epochTime ( ) ) . isOk ( ) )
2022-09-06 20:43:46 +02:00
## node1 publishes a message with a rate limit proof, the message is then relayed to node2 which in turn
## verifies the rate limit proof of the message and relays the message to node3
## verification at node2 occurs inside a topic validator which is installed as part of the waku-rln-relay mount proc
2024-01-18 13:49:13 +01:00
discard await node1 . publish ( some ( DefaultPubsubTopic ) , message )
2022-09-06 20:43:46 +02:00
await sleepAsync ( 2000 . millis )
check :
( await completionFut . withTimeout ( 10 . seconds ) ) = = true
await node1 . stop ( )
await node2 . stop ( )
await node3 . stop ( )
2023-02-13 11:43:49 +01:00
2023-08-21 08:55:34 +02:00
asyncTest " testing rln-relay is applied in all rln pubsub/content topics " :
# create 3 nodes
2023-12-14 07:16:39 +01:00
let nodes = toSeq ( 0 .. < 3 ) . mapIt ( newTestWakuNode ( generateSecp256k1Key ( ) , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) ) )
2023-08-21 08:55:34 +02:00
await allFutures ( nodes . mapIt ( it . start ( ) ) )
let pubsubTopics = @ [
PubsubTopic ( " /waku/2/pubsubtopic-a/proto " ) ,
PubsubTopic ( " /waku/2/pubsubtopic-b/proto " ) ]
let contentTopics = @ [
ContentTopic ( " /waku/2/content-topic-a/proto " ) ,
ContentTopic ( " /waku/2/content-topic-b/proto " ) ]
# set up three nodes
await allFutures ( nodes . mapIt ( it . mountRelay ( pubsubTopics ) ) )
# mount rlnrelay in off-chain mode
for index , node in nodes :
2024-03-12 16:20:30 +05:30
when defined ( rln_v2 ) :
let wakuRlnConfig = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( index . uint + 1 ) ,
rlnRelayUserMessageLimit : 1 ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_ " & $ ( index + 1 ) ) )
else :
let wakuRlnConfig = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( index . uint + 1 ) ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_ " & $ ( index + 1 ) ) )
await node . mountRlnRelay ( wakuRlnConfig )
2023-08-21 08:55:34 +02:00
# start them
await allFutures ( nodes . mapIt ( it . start ( ) ) )
# connect them together
await nodes [ 0 ] . connectToNodes ( @ [ nodes [ 1 ] . switch . peerInfo . toRemotePeerInfo ( ) ] )
await nodes [ 2 ] . connectToNodes ( @ [ nodes [ 1 ] . switch . peerInfo . toRemotePeerInfo ( ) ] )
var rxMessagesTopic1 = 0
var rxMessagesTopic2 = 0
proc relayHandler ( topic : PubsubTopic , msg : WakuMessage ) : Future [ void ] {. async , gcsafe . } =
info " relayHandler. The received topic: " , topic
if topic = = pubsubTopics [ 0 ] :
rxMessagesTopic1 = rxMessagesTopic1 + 1
elif topic = = pubsubTopics [ 1 ] :
rxMessagesTopic2 = rxMessagesTopic2 + 1
# mount the relay handlers
2023-09-26 07:33:52 -04:00
nodes [ 2 ] . subscribe ( ( kind : PubsubSub , topic : pubsubTopics [ 0 ] ) , some ( relayHandler ) )
nodes [ 2 ] . subscribe ( ( kind : PubsubSub , topic : pubsubTopics [ 1 ] ) , some ( relayHandler ) )
2023-08-21 08:55:34 +02:00
await sleepAsync ( 1000 . millis )
2023-08-31 12:24:41 +02:00
# generate some messages with rln proofs first. generating
# the proof takes some time, so this is done before publishing
# to avoid blocking the test
var messages1 : seq [ WakuMessage ] = @ [ ]
var messages2 : seq [ WakuMessage ] = @ [ ]
let epochTime = epochTime ( )
2023-08-22 10:10:54 +02:00
for i in 0 .. < 3 :
2023-08-31 12:24:41 +02:00
var message = WakuMessage ( payload : ( " Payload_ " & $ i ) . toBytes ( ) , contentTopic : contentTopics [ 0 ] )
2024-03-12 16:20:30 +05:30
nodes [ 0 ] . wakuRlnRelay . unsafeAppendRLNProof ( message , epochTime ) . isOkOr :
raiseAssert $ error
2023-08-31 12:24:41 +02:00
messages1 . add ( message )
2023-08-21 08:55:34 +02:00
2023-08-22 10:10:54 +02:00
for i in 0 .. < 3 :
2023-08-31 12:24:41 +02:00
var message = WakuMessage ( payload : ( " Payload_ " & $ i ) . toBytes ( ) , contentTopic : contentTopics [ 1 ] )
2024-03-12 16:20:30 +05:30
nodes [ 1 ] . wakuRlnRelay . unsafeAppendRLNProof ( message , epochTime ) . isOkOr :
raiseAssert $ error
2023-08-31 12:24:41 +02:00
messages2 . add ( message )
# publish 3 messages from node[0] (last 2 are spam, window is 10 secs)
# publish 3 messages from node[1] (last 2 are spam, window is 10 secs)
2024-01-18 13:49:13 +01:00
for msg in messages1 : discard await nodes [ 0 ] . publish ( some ( pubsubTopics [ 0 ] ) , msg )
for msg in messages2 : discard await nodes [ 1 ] . publish ( some ( pubsubTopics [ 1 ] ) , msg )
2023-08-21 08:55:34 +02:00
# wait for gossip to propagate
2023-08-22 10:10:54 +02:00
await sleepAsync ( 5000 . millis )
2023-08-21 08:55:34 +02:00
# check that node[2] got messages from both topics
2023-08-22 10:10:54 +02:00
# and that rln was applied (just 1 msg is rx, rest are spam)
2023-08-21 08:55:34 +02:00
check :
rxMessagesTopic1 = = 1
rxMessagesTopic2 = = 1
await allFutures ( nodes . mapIt ( it . stop ( ) ) )
2022-09-06 20:43:46 +02:00
asyncTest " testing rln-relay with invalid proof " :
let
# publisher node
2023-02-13 11:43:49 +01:00
nodeKey1 = generateSecp256k1Key ( )
2023-12-14 07:16:39 +01:00
node1 = newTestWakuNode ( nodeKey1 , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) )
2022-09-06 20:43:46 +02:00
# Relay node
2023-02-13 11:43:49 +01:00
nodeKey2 = generateSecp256k1Key ( )
2023-12-14 07:16:39 +01:00
node2 = newTestWakuNode ( nodeKey2 , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) )
2022-09-06 20:43:46 +02:00
# Subscriber
2023-02-13 11:43:49 +01:00
nodeKey3 = generateSecp256k1Key ( )
2023-12-14 07:16:39 +01:00
node3 = newTestWakuNode ( nodeKey3 , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) )
2022-09-06 20:43:46 +02:00
contentTopic = ContentTopic ( " /waku/2/default-content/proto " )
# set up three nodes
# node1
2023-08-21 08:55:34 +02:00
await node1 . mountRelay ( @ [ DefaultPubsubTopic ] )
2022-11-04 08:30:42 +05:30
2022-09-06 20:43:46 +02:00
# mount rlnrelay in off-chain mode
2024-03-12 16:20:30 +05:30
when defined ( rln_v2 ) :
let wakuRlnConfig1 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 1 . uint ) ,
rlnRelayUserMessageLimit : 1 ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_4 " ) )
else :
let wakuRlnConfig1 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 1 . uint ) ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_4 " ) )
await node1 . mountRlnRelay ( wakuRlnConfig1 )
2022-12-13 14:56:24 +05:30
2022-09-06 20:43:46 +02:00
await node1 . start ( )
# node 2
2023-08-21 08:55:34 +02:00
await node2 . mountRelay ( @ [ DefaultPubsubTopic ] )
2022-09-06 20:43:46 +02:00
# mount rlnrelay in off-chain mode
2024-03-12 16:20:30 +05:30
when defined ( rln_v2 ) :
let wakuRlnConfig2 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 2 . uint ) ,
rlnRelayUserMessageLimit : 1 ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_5 " ) )
else :
let wakuRlnConfig2 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 2 . uint ) ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_5 " ) )
await node2 . mountRlnRelay ( wakuRlnConfig2 )
2022-12-13 14:56:24 +05:30
2022-09-06 20:43:46 +02:00
await node2 . start ( )
# node 3
2023-08-21 08:55:34 +02:00
await node3 . mountRelay ( @ [ DefaultPubsubTopic ] )
2022-11-04 08:30:42 +05:30
2024-03-12 16:20:30 +05:30
when defined ( rln_v2 ) :
let wakuRlnConfig3 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 3 . uint ) ,
rlnRelayUserMessageLimit : 1 ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_6 " ) )
else :
let wakuRlnConfig3 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 3 . uint ) ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_6 " ) )
await node3 . mountRlnRelay ( wakuRlnConfig3 )
2022-09-06 20:43:46 +02:00
await node3 . start ( )
# connect them together
await node1 . connectToNodes ( @ [ node2 . switch . peerInfo . toRemotePeerInfo ( ) ] )
await node3 . connectToNodes ( @ [ node2 . switch . peerInfo . toRemotePeerInfo ( ) ] )
# define a custom relay handler
var completionFut = newFuture [ bool ] ( )
2023-06-06 19:28:47 +02:00
proc relayHandler ( topic : PubsubTopic , msg : WakuMessage ) : Future [ void ] {. async , gcsafe . } =
debug " The received topic: " , topic
2023-08-21 08:55:34 +02:00
if topic = = DefaultPubsubTopic :
2023-06-06 19:28:47 +02:00
completionFut . complete ( true )
2022-09-06 20:43:46 +02:00
# mount the relay handler
2023-09-26 07:33:52 -04:00
node3 . subscribe ( ( kind : PubsubSub , topic : DefaultPubsubTopic ) , some ( relayHandler ) )
2022-09-06 20:43:46 +02:00
await sleepAsync ( 2000 . millis )
# prepare the message payload
let payload = " Hello " . toBytes ( )
# prepare the epoch
2024-02-28 17:19:20 +01:00
let epoch = node1 . wakuRlnRelay . getCurrentEpoch ( )
2022-09-06 20:43:46 +02:00
# prepare the proof
let
contentTopicBytes = contentTopic . toBytes
input = concat ( payload , contentTopicBytes )
2023-02-10 17:55:47 +01:00
extraBytes : seq [ byte ] = @ [ byte ( 1 ) , 2 , 3 ]
2024-03-01 14:15:40 +05:30
when defined ( rln_v2 ) :
let nonceManager = node1 . wakuRlnRelay . nonceManager
2024-03-12 16:20:30 +05:30
let rateLimitProofRes = node1 . wakuRlnRelay . groupManager . generateProof ( concat ( input , extraBytes ) ,
2024-03-01 14:15:40 +05:30
epoch ,
MessageId ( 0 ) )
else :
let rateLimitProofRes = node1 . wakuRlnRelay . groupManager . generateProof ( concat ( input , extraBytes ) , # we add extra bytes to invalidate proof verification against original payload
epoch )
2024-03-12 16:20:30 +05:30
assert rateLimitProofRes . isOk ( ) , $ rateLimitProofRes . error # check the proof is generated correctly outside when block to avoid duplication
2022-11-22 18:29:43 +01:00
let rateLimitProof = rateLimitProofRes . get ( ) . encode ( ) . buffer
2022-09-06 20:43:46 +02:00
let message = WakuMessage ( payload : @ payload ,
contentTopic : contentTopic ,
proof : rateLimitProof )
## node1 publishes a message with an invalid rln proof, the message is then relayed to node2 which in turn
## attempts to verify the rate limit proof and fails hence does not relay the message to node3, thus the relayHandler of node3
## never gets called
## verification at node2 occurs inside a topic validator which is installed as part of the waku-rln-relay mount proc
2024-01-18 13:49:13 +01:00
discard await node1 . publish ( some ( DefaultPubsubTopic ) , message )
2022-09-06 20:43:46 +02:00
await sleepAsync ( 2000 . millis )
check :
# the relayHandler of node3 never gets called
( await completionFut . withTimeout ( 10 . seconds ) ) = = false
await node1 . stop ( )
await node2 . stop ( )
await node3 . stop ( )
asyncTest " testing rln-relay double-signaling detection " :
let
# publisher node
2023-02-13 11:43:49 +01:00
nodeKey1 = generateSecp256k1Key ( )
2023-12-14 07:16:39 +01:00
node1 = newTestWakuNode ( nodeKey1 , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) )
2022-09-06 20:43:46 +02:00
# Relay node
2023-02-13 11:43:49 +01:00
nodeKey2 = generateSecp256k1Key ( )
2023-12-14 07:16:39 +01:00
node2 = newTestWakuNode ( nodeKey2 , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) )
2022-09-06 20:43:46 +02:00
# Subscriber
2023-02-13 11:43:49 +01:00
nodeKey3 = generateSecp256k1Key ( )
2023-12-14 07:16:39 +01:00
node3 = newTestWakuNode ( nodeKey3 , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) )
2022-09-06 20:43:46 +02:00
contentTopic = ContentTopic ( " /waku/2/default-content/proto " )
# set up three nodes
# node1
2023-08-21 08:55:34 +02:00
await node1 . mountRelay ( @ [ DefaultPubsubTopic ] )
2022-12-13 14:56:24 +05:30
2022-09-06 20:43:46 +02:00
# mount rlnrelay in off-chain mode
2024-03-12 16:20:30 +05:30
when defined ( rln_v2 ) :
let wakuRlnConfig1 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 1 . uint ) ,
rlnRelayUserMessageLimit : 1 ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_7 " ) )
else :
let wakuRlnConfig1 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 1 . uint ) ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_7 " ) )
await node1 . mountRlnRelay ( wakuRlnConfig1 )
2022-11-04 08:30:42 +05:30
2022-09-06 20:43:46 +02:00
await node1 . start ( )
# node 2
2023-08-21 08:55:34 +02:00
await node2 . mountRelay ( @ [ DefaultPubsubTopic ] )
2022-12-13 14:56:24 +05:30
2022-09-06 20:43:46 +02:00
# mount rlnrelay in off-chain mode
2024-03-12 16:20:30 +05:30
when defined ( rln_v2 ) :
let wakuRlnConfig2 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 2 . uint ) ,
rlnRelayUserMessageLimit : 1 ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_8 " ) )
else :
let wakuRlnConfig2 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 2 . uint ) ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_8 " ) )
await node2 . mountRlnRelay ( wakuRlnConfig2 )
2022-09-06 20:43:46 +02:00
await node2 . start ( )
# node 3
2023-08-21 08:55:34 +02:00
await node3 . mountRelay ( @ [ DefaultPubsubTopic ] )
2022-12-13 14:56:24 +05:30
2022-09-06 20:43:46 +02:00
# mount rlnrelay in off-chain mode
2024-03-12 16:20:30 +05:30
when defined ( rln_v2 ) :
let wakuRlnConfig3 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 3 . uint ) ,
rlnRelayUserMessageLimit : 1 ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_9 " ) )
else :
let wakuRlnConfig3 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 3 . uint ) ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_9 " ) )
await node3 . mountRlnRelay ( wakuRlnConfig3 )
2022-11-04 08:30:42 +05:30
2022-09-06 20:43:46 +02:00
await node3 . start ( )
# connect the nodes together node1 <-> node2 <-> node3
await node1 . connectToNodes ( @ [ node2 . switch . peerInfo . toRemotePeerInfo ( ) ] )
await node3 . connectToNodes ( @ [ node2 . switch . peerInfo . toRemotePeerInfo ( ) ] )
# get the current epoch time
let time = epochTime ( )
# create some messages with rate limit proofs
var
wm1 = WakuMessage ( payload : " message 1 " . toBytes ( ) , contentTopic : contentTopic )
# another message in the same epoch as wm1, it will break the messaging rate limit
wm2 = WakuMessage ( payload : " message 2 " . toBytes ( ) , contentTopic : contentTopic )
# wm3 points to the next epoch
wm3 = WakuMessage ( payload : " message 3 " . toBytes ( ) , contentTopic : contentTopic )
wm4 = WakuMessage ( payload : " message 4 " . toBytes ( ) , contentTopic : contentTopic )
2024-03-12 16:20:30 +05:30
node3 . wakuRlnRelay . unsafeAppendRLNProof ( wm1 , time ) . isOkOr :
raiseAssert $ error
node3 . wakuRlnRelay . unsafeAppendRLNProof ( wm2 , time ) . isOkOr :
raiseAssert $ error
node3 . wakuRlnRelay . unsafeAppendRLNProof ( wm3 , time + float64 ( node3 . wakuRlnRelay . rlnEpochSizeSec ) ) . isOkOr :
raiseAssert $ error
2022-09-06 20:43:46 +02:00
# relay handler for node3
var completionFut1 = newFuture [ bool ] ( )
var completionFut2 = newFuture [ bool ] ( )
var completionFut3 = newFuture [ bool ] ( )
var completionFut4 = newFuture [ bool ] ( )
2023-06-06 19:28:47 +02:00
proc relayHandler ( topic : PubsubTopic , msg : WakuMessage ) : Future [ void ] {. async , gcsafe . } =
debug " The received topic: " , topic
2023-08-21 08:55:34 +02:00
if topic = = DefaultPubsubTopic :
2023-06-06 19:28:47 +02:00
if msg = = wm1 :
completionFut1 . complete ( true )
if msg = = wm2 :
completionFut2 . complete ( true )
if msg = = wm3 :
completionFut3 . complete ( true )
if msg = = wm4 :
completionFut4 . complete ( true )
2022-09-06 20:43:46 +02:00
# mount the relay handler for node3
2023-09-26 07:33:52 -04:00
node3 . subscribe ( ( kind : PubsubSub , topic : DefaultPubsubTopic ) , some ( relayHandler ) )
2022-09-06 20:43:46 +02:00
await sleepAsync ( 2000 . millis )
## node1 publishes and relays 4 messages to node2
## verification at node2 occurs inside a topic validator which is installed as part of the waku-rln-relay mount proc
## node2 relays either of wm1 or wm2 to node3, depending on which message arrives at node2 first
## node2 should detect either of wm1 or wm2 as spam and not relay it
## node2 should relay wm3 to node3
## node2 should not relay wm4 because it has no valid rln proof
2024-01-18 13:49:13 +01:00
discard await node1 . publish ( some ( DefaultPubsubTopic ) , wm1 )
discard await node1 . publish ( some ( DefaultPubsubTopic ) , wm2 )
discard await node1 . publish ( some ( DefaultPubsubTopic ) , wm3 )
discard await node1 . publish ( some ( DefaultPubsubTopic ) , wm4 )
2022-09-06 20:43:46 +02:00
await sleepAsync ( 2000 . millis )
let
res1 = await completionFut1 . withTimeout ( 10 . seconds )
res2 = await completionFut2 . withTimeout ( 10 . seconds )
check :
( res1 and res2 ) = = false # either of the wm1 and wm2 is found as spam hence not relayed
( await completionFut3 . withTimeout ( 10 . seconds ) ) = = true
( await completionFut4 . withTimeout ( 10 . seconds ) ) = = false
await node1 . stop ( )
await node2 . stop ( )
2023-02-10 17:55:47 +01:00
await node3 . stop ( )
2023-09-06 13:48:02 +05:30
asyncTest " clearNullifierLog: should clear epochs > MaxEpochGap " :
2023-12-15 10:26:17 +01:00
2023-09-06 13:48:02 +05:30
let
# publisher node
nodeKey1 = generateSecp256k1Key ( )
2023-12-14 07:16:39 +01:00
node1 = newTestWakuNode ( nodeKey1 , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) )
2023-09-06 13:48:02 +05:30
# Relay node
nodeKey2 = generateSecp256k1Key ( )
2023-12-14 07:16:39 +01:00
node2 = newTestWakuNode ( nodeKey2 , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) )
2023-09-06 13:48:02 +05:30
# Subscriber
nodeKey3 = generateSecp256k1Key ( )
2023-12-14 07:16:39 +01:00
node3 = newTestWakuNode ( nodeKey3 , parseIpAddress ( " 0.0.0.0 " ) , Port ( 0 ) )
2023-09-06 13:48:02 +05:30
contentTopic = ContentTopic ( " /waku/2/default-content/proto " )
# set up 2 nodes
# node1
await node1 . mountRelay ( @ [ DefaultPubsubTopic ] )
# mount rlnrelay in off-chain mode
2024-03-12 16:20:30 +05:30
when defined ( rln_v2 ) :
let wakuRlnConfig1 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 1 . uint ) ,
rlnRelayUserMessageLimit : 1 ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_10 " ) )
else :
let wakuRlnConfig1 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 1 . uint ) ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_10 " ) )
await node1 . mountRlnRelay ( wakuRlnConfig1 )
2023-09-06 13:48:02 +05:30
await node1 . start ( )
# node 2
await node2 . mountRelay ( @ [ DefaultPubsubTopic ] )
# mount rlnrelay in off-chain mode
2024-03-12 16:20:30 +05:30
when defined ( rln_v2 ) :
let wakuRlnConfig2 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 2 . uint ) ,
rlnRelayUserMessageLimit : 1 ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_11 " ) )
else :
let wakuRlnConfig2 = WakuRlnConfig ( rlnRelayDynamic : false ,
rlnRelayCredIndex : some ( 2 . uint ) ,
rlnEpochSizeSec : 1 ,
rlnRelayTreePath : genTempPath ( " rln_tree " , " wakunode_11 " ) )
await node2 . mountRlnRelay ( wakuRlnConfig2 )
2023-09-06 13:48:02 +05:30
await node2 . start ( )
await node1 . connectToNodes ( @ [ node2 . switch . peerInfo . toRemotePeerInfo ( ) ] )
# get the current epoch time
let time = epochTime ( )
# create some messages with rate limit proofs
var
wm1 = WakuMessage ( payload : " message 1 " . toBytes ( ) , contentTopic : contentTopic )
# another message in the same epoch as wm1, it will break the messaging rate limit
wm2 = WakuMessage ( payload : " message 2 " . toBytes ( ) , contentTopic : contentTopic )
# wm3 points to the next epoch
wm3 = WakuMessage ( payload : " message 3 " . toBytes ( ) , contentTopic : contentTopic )
2024-03-12 16:20:30 +05:30
node1 . wakuRlnRelay . unsafeAppendRLNProof ( wm1 , time ) . isOkOr :
raiseAssert $ error
node1 . wakuRlnRelay . unsafeAppendRLNProof ( wm2 , time ) . isOkOr :
raiseAssert $ error
node1 . wakuRlnRelay . unsafeAppendRLNProof ( wm3 , time + float64 ( node1 . wakuRlnRelay . rlnEpochSizeSec * 2 ) ) . isOkOr :
raiseAssert $ error
2023-12-15 10:26:17 +01:00
2023-09-06 13:48:02 +05:30
# relay handler for node2
var completionFut1 = newFuture [ bool ] ( )
var completionFut2 = newFuture [ bool ] ( )
var completionFut3 = newFuture [ bool ] ( )
proc relayHandler ( topic : PubsubTopic , msg : WakuMessage ) : Future [ void ] {. async , gcsafe . } =
debug " The received topic: " , topic
if topic = = DefaultPubsubTopic :
if msg = = wm1 :
completionFut1 . complete ( true )
if msg = = wm2 :
completionFut2 . complete ( true )
if msg = = wm3 :
completionFut3 . complete ( true )
2023-12-15 10:26:17 +01:00
2023-09-06 13:48:02 +05:30
# mount the relay handler for node2
2023-09-26 07:33:52 -04:00
node2 . subscribe ( ( kind : PubsubSub , topic : DefaultPubsubTopic ) , some ( relayHandler ) )
2023-09-06 13:48:02 +05:30
await sleepAsync ( 2000 . millis )
2024-01-18 13:49:13 +01:00
discard await node1 . publish ( some ( DefaultPubsubTopic ) , wm1 )
discard await node1 . publish ( some ( DefaultPubsubTopic ) , wm2 )
discard await node1 . publish ( some ( DefaultPubsubTopic ) , wm3 )
2023-12-15 10:26:17 +01:00
2023-09-06 13:48:02 +05:30
let
res1 = await completionFut1 . withTimeout ( 10 . seconds )
res2 = await completionFut2 . withTimeout ( 10 . seconds )
res3 = await completionFut3 . withTimeout ( 10 . seconds )
check :
2023-12-15 10:26:17 +01:00
res1 = = true
res2 = = false
res3 = = true
node2 . wakuRlnRelay . nullifierLog . len ( ) = = 2
2023-09-06 13:48:02 +05:30
await node1 . stop ( )
await node2 . stop ( )