diff --git a/tests/v2/test_waku_rln_relay.nim b/tests/v2/test_waku_rln_relay.nim index 102d0ac50..d7dfe3ad7 100644 --- a/tests/v2/test_waku_rln_relay.nim +++ b/tests/v2/test_waku_rln_relay.nim @@ -8,13 +8,16 @@ import libp2p/crypto/crypto, json, ../../waku/v2/protocol/waku_message, - ../../waku/v2/protocol/waku_rln_relay/[rln, waku_rln_relay_utils, - waku_rln_relay_types], + ../../waku/v2/protocol/waku_rln_relay/[rln, + waku_rln_relay_utils, + waku_rln_relay_types, + waku_rln_relay_constants, + waku_rln_relay_metrics], ../../waku/v2/node/wakunode2, ../test_helpers -const RLNRELAY_PUBSUB_TOPIC = "waku/2/rlnrelay/proto" -const RLNRELAY_CONTENT_TOPIC = "waku/2/rlnrelay/proto" +const RlnRelayPubsubTopic = "waku/2/rlnrelay/proto" +const RlnRelayContentTopic = "waku/2/rlnrelay/proto" procSuite "Waku rln relay": asyncTest "mount waku-rln-relay in the off-chain mode": @@ -45,12 +48,12 @@ procSuite "Waku rln relay": let index = MembershipIndex(5) # -------- mount rln-relay in the off-chain mode - await node.mountRelay(@[RLNRELAY_PUBSUB_TOPIC]) + await node.mountRelay(@[RlnRelayPubsubTopic]) node.mountRlnRelayStatic(group = groupIDCommitments, memKeyPair = groupKeyPairs[index], memIndex = index, - pubsubTopic = RLNRELAY_PUBSUB_TOPIC, - contentTopic = RLNRELAY_CONTENT_TOPIC) + pubsubTopic = RlnRelayPubsubTopic, + contentTopic = RlnRelayContentTopic) # get the root of Merkle tree which is constructed inside the mountRlnRelay proc let calculatedRoot = node.wakuRlnRelay.rlnInstance.getMerkleRoot().value().toHex @@ -446,10 +449,10 @@ suite "Waku rln relay": check: list.len == groupSize # check the number of keys - root.len == HASH_HEX_SIZE # check the size of the calculated tree root + root.len == HashHexSize # check the size of the calculated tree root test "check correctness of toMembershipKeyPairs and calcMerkleRoot": - let groupKeys = STATIC_GROUP_KEYS + let groupKeys = StaticGroupKeys # create a set of MembershipKeyPair objects from groupKeys let groupKeyPairs = groupKeys.toMembershipKeyPairs() @@ -466,7 +469,7 @@ suite "Waku rln relay": # check that the correct number of key pairs is created groupKeyPairs.len == StaticGroupSize # compare the calculated root against the correct root - root == STATIC_GROUP_MERKLE_ROOT + root == StaticGroupMerkleRoot when defined(rln) or (not defined(rln) and not defined(rlnzerokit)): test "RateLimitProof Protobuf encode/init test": @@ -928,7 +931,7 @@ suite "Waku rln relay": proofAdded2 = wakuRlnRelay.appendRLNProof(wm2, time) # wm3 points to the next epoch wm3 = WakuMessage(payload: "Valid message".toBytes()) - proofAdded3 = wakuRlnRelay.appendRLNProof(wm3, time+EPOCH_UNIT_SECONDS) + proofAdded3 = wakuRlnRelay.appendRLNProof(wm3, time+EpochUnitSeconds) wm4 = WakuMessage(payload: "Invalid message".toBytes()) # checks proofs are added @@ -1008,5 +1011,10 @@ suite "Waku rln relay": check: credentials.membershipKeyPair == k credentials.rlnIndex == index - + + test "histogram static bucket generation": + let buckets = generateBucketsForHistogram(10) + check: + buckets.len == 5 + buckets == [2.0, 4.0, 6.0, 8.0, 10.0] diff --git a/tests/v2/test_waku_rln_relay_onchain.nim b/tests/v2/test_waku_rln_relay_onchain.nim index 7571e4a2f..5bf443292 100644 --- a/tests/v2/test_waku_rln_relay_onchain.nim +++ b/tests/v2/test_waku_rln_relay_onchain.nim @@ -9,13 +9,15 @@ import libp2p/crypto/crypto, eth/keys, ../../waku/v2/protocol/waku_rln_relay/[waku_rln_relay_utils, - waku_rln_relay_types, rln_relay_contract], + waku_rln_relay_constants, + waku_rln_relay_types, + rln_relay_contract], ../../waku/v2/node/wakunode2, ../test_helpers, ./test_utils -const RLNRELAY_PUBSUB_TOPIC = "waku/2/rlnrelay/proto" -const RLNRELAY_CONTENT_TOPIC = "waku/2/rlnrelay/proto" +const RlnRelayPubsubTopic = "waku/2/rlnrelay/proto" +const RlnRelayContentTopic = "waku/2/rlnrelay/proto" # contract ABI contract(MembershipContract): @@ -26,7 +28,7 @@ contract(MembershipContract): # proc withdrawBatch( secrets: seq[Uint256], pubkeyIndex: seq[Uint256], receiver: seq[Address]) # a util function used for testing purposes -# it deploys membership contract on Ganache (or any Eth client available on ETH_CLIENT address) +# it deploys membership contract on Ganache (or any Eth client available on EthClient address) # must be edited if used for a different contract than membership contract proc uploadRLNContract*(ethClientAddress: string): Future[Address] {.async.} = let web3 = await newWeb3(ethClientAddress) @@ -43,15 +45,15 @@ proc uploadRLNContract*(ethClientAddress: string): Future[Address] {.async.} = # deploy the poseidon hash contract and gets its address let - hasherReceipt = await web3.deployContract(POSEIDON_HASHER_CODE) + hasherReceipt = await web3.deployContract(PoseidonHasherCode) hasherAddress = hasherReceipt.contractAddress.get debug "hasher address: ", hasherAddress # encode membership contract inputs to 32 bytes zero-padded let - membershipFeeEncoded = encode(MEMBERSHIP_FEE).data - depthEncoded = encode(MERKLE_TREE_DEPTH.u256).data + membershipFeeEncoded = encode(MembershipFee).data + depthEncoded = encode(MerkleTreeDepth.u256).data hasherAddressEncoded = encode(hasherAddress).data # this is the contract constructor input contractInput = membershipFeeEncoded & depthEncoded & hasherAddressEncoded @@ -63,7 +65,7 @@ proc uploadRLNContract*(ethClientAddress: string): Future[Address] {.async.} = debug "encoded contract input:", contractInput # deploy membership contract with its constructor inputs - let receipt = await web3.deployContract(MEMBERSHIP_CONTRACT_CODE, + let receipt = await web3.deployContract(MembershipContractCode, contractInput = contractInput) var contractAddress = receipt.contractAddress.get debug "Address of the deployed membership contract: ", contractAddress @@ -80,7 +82,7 @@ proc uploadRLNContract*(ethClientAddress: string): Future[Address] {.async.} = proc createEthAccount(): Future[(keys.PrivateKey, Address)] {.async.} = let theRNG = keys.newRng() - let web3 = await newWeb3(ETH_CLIENT) + let web3 = await newWeb3(EthClient) let accounts = await web3.provider.eth_accounts() let gasPrice = int(await web3.provider.eth_gasPrice()) web3.defaultAccount = accounts[0] @@ -104,11 +106,11 @@ proc createEthAccount(): Future[(keys.PrivateKey, Address)] {.async.} = procSuite "Waku-rln-relay": asyncTest "event subscription": # preparation ------------------------------ - debug "ethereum client address", ETH_CLIENT - let contractAddress = await uploadRLNContract(ETH_CLIENT) + debug "ethereum client address", EthClient + let contractAddress = await uploadRLNContract(EthClient) # connect to the eth client - let web3 = await newWeb3(ETH_CLIENT) - debug "web3 connected to", ETH_CLIENT + let web3 = await newWeb3(EthClient) + debug "web3 connected to", EthClient # fetch the list of registered accounts let accounts = await web3.provider.eth_accounts() @@ -148,7 +150,7 @@ procSuite "Waku-rln-relay": echo "Error from subscription: ", err.msg # register a member - let tx = await contractObj.register(pk).send(value = MEMBERSHIP_FEE) + let tx = await contractObj.register(pk).send(value = MembershipFee) debug "a member is registered", tx = tx # wait for the event to be received @@ -158,11 +160,11 @@ procSuite "Waku-rln-relay": await web3.close() asyncTest "dynamic group management": # preparation ------------------------------ - debug "ethereum client address", ETH_CLIENT - let contractAddress = await uploadRLNContract(ETH_CLIENT) + debug "ethereum client address", EthClient + let contractAddress = await uploadRLNContract(EthClient) # connect to the eth client - let web3 = await newWeb3(ETH_CLIENT) - debug "web3 connected to", ETH_CLIENT + let web3 = await newWeb3(EthClient) + debug "web3 connected to", EthClient # fetch the list of registered accounts let accounts = await web3.provider.eth_accounts() @@ -190,7 +192,7 @@ procSuite "Waku-rln-relay": # initialize the WakuRLNRelay var rlnPeer = WakuRLNRelay(membershipKeyPair: keyPair.get(), membershipIndex: MembershipIndex(0), - ethClientAddress: ETH_CLIENT, + ethClientAddress: EthClient, ethAccountAddress: accounts[0], membershipContractAddress: contractAddress, rlnInstance: rln) @@ -217,11 +219,11 @@ procSuite "Waku-rln-relay": await rlnPeer.handleGroupUpdates(handler) # register a member to the contract - let tx = await contractObj.register(pk).send(value = MEMBERSHIP_FEE) + let tx = await contractObj.register(pk).send(value = MembershipFee) debug "a member is registered", tx = tx # register another member to the contract - let tx2 = await contractObj.register(pk2).send(value = MEMBERSHIP_FEE) + let tx2 = await contractObj.register(pk2).send(value = MembershipFee) debug "a member is registered", tx2 = tx2 # wait for all the events to be received by the rlnPeer @@ -232,11 +234,11 @@ procSuite "Waku-rln-relay": asyncTest "insert a key to the membership contract": # preparation ------------------------------ - debug "ethereum client address", ETH_CLIENT - let contractAddress = await uploadRLNContract(ETH_CLIENT) + debug "ethereum client address", EthClient + let contractAddress = await uploadRLNContract(EthClient) # connect to the eth client - let web3 = await newWeb3(ETH_CLIENT) - debug "web3 connected to", ETH_CLIENT + let web3 = await newWeb3(EthClient) + debug "web3 connected to", EthClient # fetch the list of registered accounts let accounts = await web3.provider.eth_accounts() @@ -250,26 +252,26 @@ procSuite "Waku-rln-relay": # send takes the following parameters, c: ContractCallBase, value = 0.u256, gas = 3000000'u64 gasPrice = 0 # should use send proc for the contract functions that update the state of the contract - let tx = await sender.register(20.u256).send(value = MEMBERSHIP_FEE) # value is the membership fee + let tx = await sender.register(20.u256).send(value = MembershipFee) # value is the membership fee debug "The hash of registration tx: ", tx # var members: array[2, uint256] = [20.u256, 21.u256] - # debug "This is the batch registration result ", await sender.registerBatch(members).send(value = (members.len * MEMBERSHIP_FEE)) # value is the membership fee + # debug "This is the batch registration result ", await sender.registerBatch(members).send(value = (members.len * MembershipFee)) # value is the membership fee let balance = await web3.provider.eth_getBalance(web3.defaultAccount, "latest") debug "Balance after registration: ", balance await web3.close() - debug "disconnected from", ETH_CLIENT + debug "disconnected from", EthClient asyncTest "registration procedure": # preparation ------------------------------ # deploy the contract - let contractAddress = await uploadRLNContract(ETH_CLIENT) + let contractAddress = await uploadRLNContract(EthClient) # prepare rln-relay peer inputs let - web3 = await newWeb3(ETH_CLIENT) + web3 = await newWeb3(EthClient) accounts = await web3.provider.eth_accounts() # choose one of the existing accounts for the rln-relay peer ethAccountAddress = accounts[0] @@ -292,7 +294,7 @@ procSuite "Waku-rln-relay": # initialize the WakuRLNRelay var rlnPeer = WakuRLNRelay(membershipKeyPair: membershipKeyPair.get(), membershipIndex: MembershipIndex(0), - ethClientAddress: ETH_CLIENT, + ethClientAddress: EthClient, ethAccountPrivateKey: some(ethPrivKey), ethAccountAddress: ethacc, membershipContractAddress: contractAddress) @@ -346,12 +348,12 @@ procSuite "Waku-rln-relay": # test ------------------------------ # start rln-relay - await node.mountRelay(@[RLNRELAY_PUBSUB_TOPIC]) + await node.mountRelay(@[RlnRelayPubsubTopic]) node.mountRlnRelayStatic(group = group, memKeyPair = keypair.get(), memIndex = index, - pubsubTopic = RLNRELAY_PUBSUB_TOPIC, - contentTopic = RLNRELAY_CONTENT_TOPIC) + pubsubTopic = RlnRelayPubsubTopic, + contentTopic = RlnRelayContentTopic) let calculatedRoot = node.wakuRlnRelay.rlnInstance.getMerkleRoot().value().toHex debug "calculated root ", calculatedRoot @@ -368,11 +370,11 @@ procSuite "Waku-rln-relay": await node.start() # deploy the contract - let contractAddress = await uploadRLNContract(ETH_CLIENT) + let contractAddress = await uploadRLNContract(EthClient) # prepare rln-relay inputs let - web3 = await newWeb3(ETH_CLIENT) + web3 = await newWeb3(EthClient) accounts = await web3.provider.eth_accounts() # choose one of the existing accounts for the rln-relay peer ethAccountAddress = accounts[0] @@ -414,11 +416,11 @@ procSuite "Waku-rln-relay": contractAddress) # creates a Sender object with a web3 field and contract address of type Address # register the members to the contract - let tx1Hash = await contractObj.register(pk1).send(value = MEMBERSHIP_FEE) + let tx1Hash = await contractObj.register(pk1).send(value = MembershipFee) debug "a member is registered", tx1 = tx1Hash # register another member to the contract - let tx2Hash = await contractObj.register(pk2).send(value = MEMBERSHIP_FEE) + let tx2Hash = await contractObj.register(pk2).send(value = MembershipFee) debug "a member is registered", tx2 = tx2Hash # create an Ethereum private key and the corresponding account @@ -427,15 +429,15 @@ procSuite "Waku-rln-relay": # test ------------------------------ # start rln-relay - await node.mountRelay(@[RLNRELAY_PUBSUB_TOPIC]) + await node.mountRelay(@[RlnRelayPubsubTopic]) discard await node.mountRlnRelayDynamic(ethClientAddr = EthClient, ethAccAddr = ethacc, ethAccountPrivKeyOpt = some(ethPrivKey), memContractAddr = contractAddress, memKeyPair = keyPair1, memIndex = some(MembershipIndex(0)), - pubsubTopic = RLNRELAY_PUBSUB_TOPIC, - contentTopic = RLNRELAY_CONTENT_TOPIC) + pubsubTopic = RlnRelayPubsubTopic, + contentTopic = RlnRelayContentTopic) await sleepAsync(2000) # wait for the event to reach the group handler @@ -454,11 +456,11 @@ procSuite "Waku-rln-relay": asyncTest "mounting waku rln-relay: check correct registration of peers without rln-relay credentials in dynamic/on-chain mode": # deploy the contract - let contractAddress = await uploadRLNContract(ETH_CLIENT) + let contractAddress = await uploadRLNContract(EthClient) # prepare rln-relay inputs let - web3 = await newWeb3(ETH_CLIENT) + web3 = await newWeb3(EthClient) accounts = await web3.provider.eth_accounts() # choose two of the existing accounts for the rln-relay peers ethAccountAddress1 = accounts[0] @@ -480,28 +482,28 @@ procSuite "Waku-rln-relay": let (ethPrivKey, ethacc) = await createEthAccount() # start rln-relay on the first node, leave rln-relay credentials empty - await node.mountRelay(@[RLNRELAY_PUBSUB_TOPIC]) + await node.mountRelay(@[RlnRelayPubsubTopic]) discard await node.mountRlnRelayDynamic(ethClientAddr = EthClient, ethAccAddr = ethacc, ethAccountPrivKeyOpt = some(ethPrivKey), memContractAddr = contractAddress, memKeyPair = none(MembershipKeyPair), memIndex = none(MembershipIndex), - pubsubTopic = RLNRELAY_PUBSUB_TOPIC, - contentTopic = RLNRELAY_CONTENT_TOPIC) + pubsubTopic = RlnRelayPubsubTopic, + contentTopic = RlnRelayContentTopic) # start rln-relay on the second node, leave rln-relay credentials empty - await node2.mountRelay(@[RLNRELAY_PUBSUB_TOPIC]) + await node2.mountRelay(@[RlnRelayPubsubTopic]) discard await node2.mountRlnRelayDynamic(ethClientAddr = EthClient, ethAccAddr = ethacc, ethAccountPrivKeyOpt = some(ethPrivKey), memContractAddr = contractAddress, memKeyPair = none(MembershipKeyPair), memIndex = none(MembershipIndex), - pubsubTopic = RLNRELAY_PUBSUB_TOPIC, - contentTopic = RLNRELAY_CONTENT_TOPIC) + pubsubTopic = RlnRelayPubsubTopic, + contentTopic = RlnRelayContentTopic) # the two nodes should be registered into the contract # since nodes are spun up sequentially diff --git a/tests/v2/test_wakunode_rln_relay.nim b/tests/v2/test_wakunode_rln_relay.nim index 551314881..35123288b 100644 --- a/tests/v2/test_wakunode_rln_relay.nim +++ b/tests/v2/test_wakunode_rln_relay.nim @@ -15,7 +15,9 @@ import libp2p/protocols/pubsub/pubsub, eth/keys import - ../../waku/v2/protocol/waku_rln_relay/[waku_rln_relay_utils, waku_rln_relay_types], + ../../waku/v2/protocol/waku_rln_relay/[waku_rln_relay_utils, + waku_rln_relay_types, + waku_rln_relay_constants], ../../waku/v2/protocol/[waku_relay, waku_message], ../../waku/v2/utils/peers, ../../waku/v2/node/wakunode2 @@ -24,7 +26,7 @@ from std/times import epochTime -const RLNRELAY_PUBSUB_TOPIC = "waku/2/rlnrelay/proto" +const RlnRelayPubsubTopic = "waku/2/rlnrelay/proto" procSuite "WakuNode - RLN relay": let rng = keys.newRng() @@ -42,7 +44,7 @@ procSuite "WakuNode - RLN relay": nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[] node3 = WakuNode.new(nodeKey3, ValidIpAddress.init("0.0.0.0"), Port(60003)) - rlnRelayPubSubTopic = RLNRELAY_PUBSUB_TOPIC + rlnRelayPubSubTopic = RlnRelayPubsubTopic contentTopic = ContentTopic("/waku/2/default-content/proto") # set up three nodes @@ -128,7 +130,7 @@ procSuite "WakuNode - RLN relay": nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[] node3 = WakuNode.new(nodeKey3, ValidIpAddress.init("0.0.0.0"), Port(60003)) - rlnRelayPubSubTopic = RLNRELAY_PUBSUB_TOPIC + rlnRelayPubSubTopic = RlnRelayPubsubTopic contentTopic = ContentTopic("/waku/2/default-content/proto") # set up three nodes @@ -232,7 +234,7 @@ procSuite "WakuNode - RLN relay": nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[] node3 = WakuNode.new(nodeKey3, ValidIpAddress.init("0.0.0.0"), Port(60003)) - rlnRelayPubSubTopic = RLNRELAY_PUBSUB_TOPIC + rlnRelayPubSubTopic = RlnRelayPubsubTopic contentTopic = ContentTopic("/waku/2/default-content/proto") # set up three nodes @@ -284,7 +286,7 @@ procSuite "WakuNode - RLN relay": proofAdded2 = node3.wakuRlnRelay.appendRLNProof(wm2, time) # wm3 points to the next epoch wm3 = WakuMessage(payload: "message 3".toBytes(), contentTopic: contentTopic) - proofAdded3 = node3.wakuRlnRelay.appendRLNProof(wm3, time+EPOCH_UNIT_SECONDS) + proofAdded3 = node3.wakuRlnRelay.appendRLNProof(wm3, time+EpochUnitSeconds) wm4 = WakuMessage(payload: "message 4".toBytes(), contentTopic: contentTopic) # check proofs are added correctly diff --git a/waku/v2/protocol/waku_rln_relay/rln_relay_contract.nim b/waku/v2/protocol/waku_rln_relay/rln_relay_contract.nim index c54fa7f3d..0ea2d2739 100644 --- a/waku/v2/protocol/waku_rln_relay/rln_relay_contract.nim +++ b/waku/v2/protocol/waku_rln_relay/rln_relay_contract.nim @@ -96,12 +96,12 @@ # } # } -# POSEIDON_HASHER_CODE holds the bytecode of Poseidon hasher solidity smart contract: +# PoseidonHasherCode holds the bytecode of Poseidon hasher solidity smart contract: # https://github.com/kilic/rlnapp/blob/master/packages/contracts/contracts/crypto/PoseidonHasher.sol # the solidity contract is compiled separately and the resultant bytecode is copied here -const POSEIDON_HASHER_CODE* = "0x608060405234801561001057600080fd5b50612142806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632c159a1a1461003b578063561558fe14610055575b600080fd5b6100436100a0565b60408051918252519081900360200190f35b6100436004803603604081101561006b57600080fd5b604080518082018252918301929181830191839060029083908390808284376000920191909152509194506100af9350505050565b60006100aa6100c0565b905090565b60006100ba826100e4565b92915050565b7f2ff267fd23782a5625e6d804f0a7fa700b8dc6084e2e7a5aff7cd4b1c506d30b90565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016040517f165d45ae851912f9a33800b04cc6617b184bf67db11ce904dc82601244551ae281527f10fc284d0af588165f4fc650fe7c53b1d80fbaac16d30518bf142117f42f820460208201527f06b687bd3c688aa9a03545d0835bca75ae82c434bf7d5fb065a2818b5c74814f60408201527f01057eb8e4bba26f12f4ea819251708d72e0605e6de827e990c3ba4ae13f5ecd60608201527e23779a38eb9ef4a9beaf4dc0a2ab5233a28ce6d10ad2512230a275b83017c360808201527f012e5dfdd4f34081753b70c897773f5d2987c8bbae32ad202a27cd61d7fba2fb7f0d1807f022a8d80d9304a1522087b8692dc0acf7b43fea28782d2ae672c0b11f7f17d468d0e6541de501481931453ed1e4a250e5e301f27dc91fe3b4bd522aa53c7f1ea09a4bd33f14eafd75e775d85e568fa668938fdd2f16fad1d4d2d2b9862b007f061f2e832c23bee84c2f09d63d371cc5eda2f749cdbe9a6a6d20469e9fa36e8b8851017f061f2e832c23bee84c2f09d63d371cc5eda2f749cdbe9a6a6d20469e9fa36e8b60208a0151017f061f2e832c23bee84c2f09d63d371cc5eda2f749cdbe9a6a6d20469e9fa36e8b8883840989848b83840909935089838409905089838b83840909925089828309905089828b8384090991507f0e4d154ca9b7f5111958289f43ed5bbc4d4f6118d45d9aefeb778179d921a59b9050808a60408b015184098b60208c015186098c8c518809010101818b8a85098c60808d015187098d60608e01518909010101828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991508b81820992508b818d8586090990508b84850992508b848d8586090993507f298d683000ab71c72fe4371cf6cd37bb584b6d816a653ee4bfea62518a337e079250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995508b85860992508b858d8586090994508b84850992508b848d8586090993507f2f860295bc93d694e74905913ddcae47290b9b5abb43a537fe40d9305bd1e1679250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991508b81820992508b818d8586090990508b84850992508b848d8586090993507f1dd8b95942d95c7896be7f3f455e595cbfee5e1023c5d45e6573c8513f1f3dfa9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f189aa3023aeaa7267dd3c74e2c8b9cba363546619bb9c54bcb02b22fe64c51619250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0da6b697fd05fe54a523131d91e2a7f6ac18184e237c1b20ab1936616f08e5239250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f019df963bfafa7f0e34cf092f33ce93b38b9d130fb44f276196e59f16e63ac5a9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f295332d5ab168bc3c5eb671528c9896b7bd5034fb02472ff2af4fa1087ae658f9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f0f423b84792458876c314228be9361a604c75010411b87add91b791df2f980fa9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f1171744890a155b5ad9cde4f1f5c4eab878f3730a9fc71f546eb737c84abec5f9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f2a557a13928c7eacff5dc049bc603cff1d7959c3975c5c9fc035b0c67173abac9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507ec9c858d5d1ab1622d7ea2174cd9a35b07c2655dd08dcda3f5a9f7222c021af9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f0b358e01fc7cf925b6d3ba6e80c345881b54ff289479cc532f9fec01b500b9789250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f26c26f6e5a92ff96ec05a61d5f36df4f8134f8d61ff0eaa28cf7a480ee2b7f849250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f020930074e8c6c15295104a58533a601f202d3b3f959650d7b8cfa754ae41e7f9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f10f5f06286fdde345a5cd8ba4ad94828271ea16309f5fa906841e72eb4c330279250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f116ce0fb46b45c99fec7d369ab5c0d11d374a16b2107c5d6f21e3792d33fc9699250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f2a59da7487bf7a05c3dbdfca6084e2ec589b1baf87ddd790d9bbc9c23557255b9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f1559c4b2c04c419e948f42a7f8fecfb1525dbdf2b6830632723ff4fa77030ea89250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f030b1745767217e6d8df6885a85651f9aebefcf468003d2dd25906897c3ca92a9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f2668ff336585f1e64cd6ddf2cbcaa8a695585f0db79cbd1727becfeabe76d0449250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f158c1ceb605d6cb3e0c3a7e6650b1f297c4fccb1aeed560a09dfd474c4e47f999250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f27506f4872c8b8bb7f42921afbefd206cef54f5001f1c32efbc2a22094d172d49250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0e915e793df4e8ee01fd861b22ee463c985c691fb2a54c8657575ed93ab92c739250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f264bd2bc0486212803e5ef729bcaf466eb14f5b6ac18b898ed94844dda28d8a99250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f2f23c5d822cd0d5b27fee9ff2c51f30a40654cdd08677543244f6aad8f2ebc8a9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f2776a03893ed5c5ce680ca5acda3c7d4b60b81269cabca38bfe060ce6eb6c4129250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f07aba324bd6d746b9f23313249f6a1809f3cfea3b1f3eb70c37951eb77120d3a9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f09c0a6b8cf7f1c457987d7bb476b8ed8ddf88dbb146f2d887821d93d453d0fa39250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f292e4542f0e5b148bc7c9188b9db100f0f2aa2a62edb236041c4e4ebf44eb1469250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f01b08e9289e3a73080f49265283832fc48dfb2da2d540503b8274d7c0e52c9b69250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0d897c5adfe393f4c0247e718eb0b227f87226cc416b703eb2a96d61581af2e39250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f057582e2ebdd031c39c69ed08086d969d22de5d1bf79ee1be837234977e3477c9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0be6726fc2d3d2b9681fdc9ce4e274395f9e6dc5c6e647a3a5343e3f3fe77edf9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f0e919ea6e332df81ae88f1155eac9e3c4b7dd7d8637feb112bcb2176f45fd9429250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f2dadfa8057c413974c1c03aa2d38aac0d8c09748d08edc0e97450320c889c40d9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f2954c27dbde3ba4f887becde3fc6c47db5266d436914d50d4e93faa79e40f7789250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f1e8f4f1b4fa7cc676e0d02084ce2bbf095adf6bcee924520e57c2f2a4b43f98a9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f01892c0a3e4c3ffce3763f5d67ea86157c3b2461e08ff82ee28342ad41e636259250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f297b80afd662c439ff4837049ea3d95f565007b2defd87d981bfa45ce9ce80bf9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f28def6e44cc1e6b1826dd02d19d3383ddfd0dcdf96d5e9ce0b2834c6ad5c17b89250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0e7efce2651888246927ee306c83f4b24982ae2a126ff3be0217ea155e850d3e9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f1b61bcbf0030070f3ca673d814ad8ea269bf0b4ddf75c4b4dd8383835be6b3809250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f2bfc5e31157cdf08d36dcba28d869c209688dcb9da74df689427efbfe7ef20409250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f2535e86274b29f682edc2f95d8fc9aa4b660b1992da99d3e3ccfd551b25280ae9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f2e26f31955ddb83a0866535943960e6bf1d75532494e07382a1886df2eba4f2c9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f1367f3092e878d4204f8597f09a6e75e596f8f859f7c4f0e4ee3bdefb14185759250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0786e0a89d59f9f1ec5a24b4e77471afb551993358839a2ad7f0cd30ee34a5939250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f05a623c15705f67c426798eb1aeb61d16bd599b73c618801e79ce87e4acf44439250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f216a2cd9a5dec0ce0f298c37a605d63a7a241fd04f74ee76d955ec729f75c7749250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f1ac59c277950c8cf903e1e0b04c13b6be622d88a899267ccd30957e8b24feb899250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f21181ae96428a48600806eb2d2b94b4972bc69f4b69d99fb1edcbce69d1a73029250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f2a24403e8cf5fb93ed9408b11d96e377bf1f1a2e183b0e14a18d6b794fc482909250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f13324a9a9db19a8f877c22de405a88bd39bec4696dc84721e7ccfef724a8e4f59250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f17f556db73809befc58822ad53ad5785aee4ff6891f211ae7183284b57a3910a9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f22e4f8f9c9ae56f5254ca73dc68572e805b9406a45fb4e10a831a7619b129fe59250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f066e36c90fda2dd52aa0c05909831d1dd345f75fcb17934ecb754d74e7ce8df99250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f190c65fb8440d50383891cbe244a8b063f0f9afbf14adce401416de7d6c755e19250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f0b4fec4e028a67f9a9b932ae35a1269eeec8b98b96793d29811a766ad089ab1b9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991508b81820992508b818d8586090990508b84850992508b848d8586090993507f1def7475769de3cd372283c7d36bd153637723ff14615542bfe8b27108ad4de79250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995508b85860992508b858d8586090994508b84850992508b848d8586090993507f119217aded5f1ebf525a69e23a08f6a976178e5939646f6c87033299d2d3c8749250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991508b81820992508b818d8586090990508b84850992508b848d8586090993507f036bd8311510a8d03c5b354f03c664f9f2d23f57b1e4286d1938f8dbe4a7c28c9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c86090101019350505089848509905089848b83840909935089838409905089838b83840909925089828309905089828b838409505050929b9a505050505050505050505056fea2646970667358221220eef5419e4124debe6900ddea7f02a5dfbb1c6b867ba8e61b34edbc913728191664736f6c63430007040033" +const PoseidonHasherCode* = "0x608060405234801561001057600080fd5b50612142806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632c159a1a1461003b578063561558fe14610055575b600080fd5b6100436100a0565b60408051918252519081900360200190f35b6100436004803603604081101561006b57600080fd5b604080518082018252918301929181830191839060029083908390808284376000920191909152509194506100af9350505050565b60006100aa6100c0565b905090565b60006100ba826100e4565b92915050565b7f2ff267fd23782a5625e6d804f0a7fa700b8dc6084e2e7a5aff7cd4b1c506d30b90565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016040517f165d45ae851912f9a33800b04cc6617b184bf67db11ce904dc82601244551ae281527f10fc284d0af588165f4fc650fe7c53b1d80fbaac16d30518bf142117f42f820460208201527f06b687bd3c688aa9a03545d0835bca75ae82c434bf7d5fb065a2818b5c74814f60408201527f01057eb8e4bba26f12f4ea819251708d72e0605e6de827e990c3ba4ae13f5ecd60608201527e23779a38eb9ef4a9beaf4dc0a2ab5233a28ce6d10ad2512230a275b83017c360808201527f012e5dfdd4f34081753b70c897773f5d2987c8bbae32ad202a27cd61d7fba2fb7f0d1807f022a8d80d9304a1522087b8692dc0acf7b43fea28782d2ae672c0b11f7f17d468d0e6541de501481931453ed1e4a250e5e301f27dc91fe3b4bd522aa53c7f1ea09a4bd33f14eafd75e775d85e568fa668938fdd2f16fad1d4d2d2b9862b007f061f2e832c23bee84c2f09d63d371cc5eda2f749cdbe9a6a6d20469e9fa36e8b8851017f061f2e832c23bee84c2f09d63d371cc5eda2f749cdbe9a6a6d20469e9fa36e8b60208a0151017f061f2e832c23bee84c2f09d63d371cc5eda2f749cdbe9a6a6d20469e9fa36e8b8883840989848b83840909935089838409905089838b83840909925089828309905089828b8384090991507f0e4d154ca9b7f5111958289f43ed5bbc4d4f6118d45d9aefeb778179d921a59b9050808a60408b015184098b60208c015186098c8c518809010101818b8a85098c60808d015187098d60608e01518909010101828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991508b81820992508b818d8586090990508b84850992508b848d8586090993507f298d683000ab71c72fe4371cf6cd37bb584b6d816a653ee4bfea62518a337e079250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995508b85860992508b858d8586090994508b84850992508b848d8586090993507f2f860295bc93d694e74905913ddcae47290b9b5abb43a537fe40d9305bd1e1679250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991508b81820992508b818d8586090990508b84850992508b848d8586090993507f1dd8b95942d95c7896be7f3f455e595cbfee5e1023c5d45e6573c8513f1f3dfa9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f189aa3023aeaa7267dd3c74e2c8b9cba363546619bb9c54bcb02b22fe64c51619250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0da6b697fd05fe54a523131d91e2a7f6ac18184e237c1b20ab1936616f08e5239250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f019df963bfafa7f0e34cf092f33ce93b38b9d130fb44f276196e59f16e63ac5a9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f295332d5ab168bc3c5eb671528c9896b7bd5034fb02472ff2af4fa1087ae658f9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f0f423b84792458876c314228be9361a604c75010411b87add91b791df2f980fa9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f1171744890a155b5ad9cde4f1f5c4eab878f3730a9fc71f546eb737c84abec5f9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f2a557a13928c7eacff5dc049bc603cff1d7959c3975c5c9fc035b0c67173abac9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507ec9c858d5d1ab1622d7ea2174cd9a35b07c2655dd08dcda3f5a9f7222c021af9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f0b358e01fc7cf925b6d3ba6e80c345881b54ff289479cc532f9fec01b500b9789250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f26c26f6e5a92ff96ec05a61d5f36df4f8134f8d61ff0eaa28cf7a480ee2b7f849250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f020930074e8c6c15295104a58533a601f202d3b3f959650d7b8cfa754ae41e7f9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f10f5f06286fdde345a5cd8ba4ad94828271ea16309f5fa906841e72eb4c330279250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f116ce0fb46b45c99fec7d369ab5c0d11d374a16b2107c5d6f21e3792d33fc9699250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f2a59da7487bf7a05c3dbdfca6084e2ec589b1baf87ddd790d9bbc9c23557255b9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f1559c4b2c04c419e948f42a7f8fecfb1525dbdf2b6830632723ff4fa77030ea89250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f030b1745767217e6d8df6885a85651f9aebefcf468003d2dd25906897c3ca92a9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f2668ff336585f1e64cd6ddf2cbcaa8a695585f0db79cbd1727becfeabe76d0449250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f158c1ceb605d6cb3e0c3a7e6650b1f297c4fccb1aeed560a09dfd474c4e47f999250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f27506f4872c8b8bb7f42921afbefd206cef54f5001f1c32efbc2a22094d172d49250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0e915e793df4e8ee01fd861b22ee463c985c691fb2a54c8657575ed93ab92c739250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f264bd2bc0486212803e5ef729bcaf466eb14f5b6ac18b898ed94844dda28d8a99250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f2f23c5d822cd0d5b27fee9ff2c51f30a40654cdd08677543244f6aad8f2ebc8a9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f2776a03893ed5c5ce680ca5acda3c7d4b60b81269cabca38bfe060ce6eb6c4129250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f07aba324bd6d746b9f23313249f6a1809f3cfea3b1f3eb70c37951eb77120d3a9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f09c0a6b8cf7f1c457987d7bb476b8ed8ddf88dbb146f2d887821d93d453d0fa39250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f292e4542f0e5b148bc7c9188b9db100f0f2aa2a62edb236041c4e4ebf44eb1469250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f01b08e9289e3a73080f49265283832fc48dfb2da2d540503b8274d7c0e52c9b69250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0d897c5adfe393f4c0247e718eb0b227f87226cc416b703eb2a96d61581af2e39250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f057582e2ebdd031c39c69ed08086d969d22de5d1bf79ee1be837234977e3477c9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0be6726fc2d3d2b9681fdc9ce4e274395f9e6dc5c6e647a3a5343e3f3fe77edf9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f0e919ea6e332df81ae88f1155eac9e3c4b7dd7d8637feb112bcb2176f45fd9429250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f2dadfa8057c413974c1c03aa2d38aac0d8c09748d08edc0e97450320c889c40d9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f2954c27dbde3ba4f887becde3fc6c47db5266d436914d50d4e93faa79e40f7789250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f1e8f4f1b4fa7cc676e0d02084ce2bbf095adf6bcee924520e57c2f2a4b43f98a9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f01892c0a3e4c3ffce3763f5d67ea86157c3b2461e08ff82ee28342ad41e636259250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f297b80afd662c439ff4837049ea3d95f565007b2defd87d981bfa45ce9ce80bf9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f28def6e44cc1e6b1826dd02d19d3383ddfd0dcdf96d5e9ce0b2834c6ad5c17b89250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0e7efce2651888246927ee306c83f4b24982ae2a126ff3be0217ea155e850d3e9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f1b61bcbf0030070f3ca673d814ad8ea269bf0b4ddf75c4b4dd8383835be6b3809250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f2bfc5e31157cdf08d36dcba28d869c209688dcb9da74df689427efbfe7ef20409250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f2535e86274b29f682edc2f95d8fc9aa4b660b1992da99d3e3ccfd551b25280ae9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f2e26f31955ddb83a0866535943960e6bf1d75532494e07382a1886df2eba4f2c9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f1367f3092e878d4204f8597f09a6e75e596f8f859f7c4f0e4ee3bdefb14185759250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0786e0a89d59f9f1ec5a24b4e77471afb551993358839a2ad7f0cd30ee34a5939250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f05a623c15705f67c426798eb1aeb61d16bd599b73c618801e79ce87e4acf44439250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f216a2cd9a5dec0ce0f298c37a605d63a7a241fd04f74ee76d955ec729f75c7749250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f1ac59c277950c8cf903e1e0b04c13b6be622d88a899267ccd30957e8b24feb899250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f21181ae96428a48600806eb2d2b94b4972bc69f4b69d99fb1edcbce69d1a73029250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f2a24403e8cf5fb93ed9408b11d96e377bf1f1a2e183b0e14a18d6b794fc482909250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f13324a9a9db19a8f877c22de405a88bd39bec4696dc84721e7ccfef724a8e4f59250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f17f556db73809befc58822ad53ad5785aee4ff6891f211ae7183284b57a3910a9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f22e4f8f9c9ae56f5254ca73dc68572e805b9406a45fb4e10a831a7619b129fe59250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f066e36c90fda2dd52aa0c05909831d1dd345f75fcb17934ecb754d74e7ce8df99250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f190c65fb8440d50383891cbe244a8b063f0f9afbf14adce401416de7d6c755e19250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f0b4fec4e028a67f9a9b932ae35a1269eeec8b98b96793d29811a766ad089ab1b9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991508b81820992508b818d8586090990508b84850992508b848d8586090993507f1def7475769de3cd372283c7d36bd153637723ff14615542bfe8b27108ad4de79250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995508b85860992508b858d8586090994508b84850992508b848d8586090993507f119217aded5f1ebf525a69e23a08f6a976178e5939646f6c87033299d2d3c8749250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991508b81820992508b818d8586090990508b84850992508b848d8586090993507f036bd8311510a8d03c5b354f03c664f9f2d23f57b1e4286d1938f8dbe4a7c28c9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c86090101019350505089848509905089848b83840909935089838409905089838b83840909925089828309905089828b838409505050929b9a505050505050505050505056fea2646970667358221220eef5419e4124debe6900ddea7f02a5dfbb1c6b867ba8e61b34edbc913728191664736f6c63430007040033" -# MEMBERSHIP_CONTRACT_CODE contains the bytecode of the membership solidity smart contract: +# MembershipContractCode contains the bytecode of the membership solidity smart contract: # https://github.com/kilic/rlnapp/blob/master/packages/contracts/contracts/RLN.sol # the solidity contract is compiled separately and the resultant bytecode is copied here -const MEMBERSHIP_CONTRACT_CODE* = "0x60e06040526000805534801561001457600080fd5b50604051610c4f380380610c4f8339818101604052606081101561003757600080fd5b5080516020820151604090920151608082905260a08390526001831b60c0819052600280546001600160a01b0319166001600160a01b0390931692909217909155909190610b936100bc6000398061037a52806105c352806105e752806106eb52508061047f5250806103f2528061065d52806106c7528061087b5250610b936000f3fe6080604052600436106100915760003560e01c806398366e351161005957806398366e35146101c7578063a9d85eba146101dc578063d0383d68146102f7578063f207564e1461030c578063f220b9ec1461032957610091565b80630ad58d2f14610096578063331b6ab3146100d75780635daf08ca1461010857806361579a931461014457806369e4863f14610159575b600080fd5b3480156100a257600080fd5b506100d5600480360360608110156100b957600080fd5b50803590602081013590604001356001600160a01b031661033e565b005b3480156100e357600080fd5b506100ec61034e565b604080516001600160a01b039092168252519081900360200190f35b34801561011457600080fd5b506101326004803603602081101561012b57600080fd5b503561035d565b60408051918252519081900360200190f35b34801561015057600080fd5b5061013261036f565b6100d56004803603602081101561016f57600080fd5b810190602081018135600160201b81111561018957600080fd5b82018360208201111561019b57600080fd5b803590602001918460208302840111600160201b831117156101bc57600080fd5b509092509050610375565b3480156101d357600080fd5b5061013261047d565b3480156101e857600080fd5b506100d5600480360360608110156101ff57600080fd5b810190602081018135600160201b81111561021957600080fd5b82018360208201111561022b57600080fd5b803590602001918460208302840111600160201b8311171561024c57600080fd5b919390929091602081019035600160201b81111561026957600080fd5b82018360208201111561027b57600080fd5b803590602001918460208302840111600160201b8311171561029c57600080fd5b919390929091602081019035600160201b8111156102b957600080fd5b8201836020820111156102cb57600080fd5b803590602001918460208302840111600160201b831117156102ec57600080fd5b5090925090506104a1565b34801561030357600080fd5b506101326105c1565b6100d56004803603602081101561032257600080fd5b50356105e5565b34801561033557600080fd5b506101326106c5565b6103498383836106e9565b505050565b6002546001600160a01b031681565b60016020526000908152604090205481565b60005481565b6000547f000000000000000000000000000000000000000000000000000000000000000090820111156103ef576040805162461bcd60e51b815260206004820152601f60248201527f524c4e2c20726567697374657242617463683a207365742069732066756c6c00604482015290519081900360640190fd5b347f000000000000000000000000000000000000000000000000000000000000000082021461044f5760405162461bcd60e51b8152600401808060200182810382526037815260200180610a566037913960400191505060405180910390fd5b60005b818110156103495761047583838381811061046957fe5b90506020020135610902565b600101610452565b7f000000000000000000000000000000000000000000000000000000000000000081565b84806104de5760405162461bcd60e51b8152600401808060200182810382526023815260200180610a336023913960400191505060405180910390fd5b80841461051c5760405162461bcd60e51b81526004018080602001828103825260368152602001806109fd6036913960400191505060405180910390fd5b80821461055a5760405162461bcd60e51b8152600401808060200182810382526031815260200180610a8d6031913960400191505060405180910390fd5b60005b818110156105b7576105af88888381811061057457fe5b9050602002013587878481811061058757fe5b9050602002013586868581811061059a57fe5b905060200201356001600160a01b03166106e9565b60010161055d565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f00000000000000000000000000000000000000000000000000000000000000006000541061065b576040805162461bcd60e51b815260206004820152601a60248201527f524c4e2c2072656769737465723a207365742069732066756c6c000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000034146106b95760405162461bcd60e51b8152600401808060200182810382526032815260200180610abe6032913960400191505060405180910390fd5b6106c281610902565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000082106107475760405162461bcd60e51b8152600401808060200182810382526024815260200180610af06024913960400191505060405180910390fd5b6000828152600160205260409020546107915760405162461bcd60e51b8152600401808060200182810382526024815260200180610b146024913960400191505060405180910390fd5b6001600160a01b0381166107d65760405162461bcd60e51b8152600401808060200182810382526026815260200180610b386026913960400191505060405180910390fd5b60006107f66040518060400160405280868152602001600081525061095b565b600084815260016020526040902054909150811461085b576040805162461bcd60e51b815260206004820152601c60248201527f524c4e2c205f77697468647261773a206e6f7420766572696669656400000000604482015290519081900360640190fd5b600083815260016020526040808220829055516001600160a01b038416917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f193505050501580156108c0573d6000803e3d6000fd5b50604080518281526020810185905281517f62ec3a516d22a993ce5cb4e7593e878c74f4d799dde522a88dc27a994fd5a943929181900390910190a150505050565b600080548152600160209081526040808320849055915482518481529182015281517f5a92c2530f207992057b9c3e544108ffce3beda4a63719f316967c49bf6159d2929181900390910190a150600080546001019055565b60025460408051632b0aac7f60e11b81526000926001600160a01b03169163561558fe918591600490910190819083908083838a5b838110156109a8578181015183820152602001610990565b5050505090500191505060206040518083038186803b1580156109ca57600080fd5b505afa1580156109de573d6000803e3d6000fd5b505050506040513d60208110156109f457600080fd5b50519291505056fe524c4e2c20776974686472617742617463683a2062617463682073697a65206d69736d61746368207075626b657920696e6465786573524c4e2c20776974686472617742617463683a2062617463682073697a65207a65726f524c4e2c20726567697374657242617463683a206d656d62657273686970206465706f736974206973206e6f7420736174697366696564524c4e2c20776974686472617742617463683a2062617463682073697a65206d69736d6174636820726563656976657273524c4e2c2072656769737465723a206d656d62657273686970206465706f736974206973206e6f7420736174697366696564524c4e2c205f77697468647261773a20696e76616c6964207075626b657920696e646578524c4e2c205f77697468647261773a206d656d62657220646f65736e2774206578697374524c4e2c205f77697468647261773a20656d7074792072656365697665722061646472657373a2646970667358221220be0b0b1f842029cde290573a70f50674e9f4d1db01b636facff8e065d03cb1e764736f6c63430007040033" +const MembershipContractCode* = "0x60e06040526000805534801561001457600080fd5b50604051610c4f380380610c4f8339818101604052606081101561003757600080fd5b5080516020820151604090920151608082905260a08390526001831b60c0819052600280546001600160a01b0319166001600160a01b0390931692909217909155909190610b936100bc6000398061037a52806105c352806105e752806106eb52508061047f5250806103f2528061065d52806106c7528061087b5250610b936000f3fe6080604052600436106100915760003560e01c806398366e351161005957806398366e35146101c7578063a9d85eba146101dc578063d0383d68146102f7578063f207564e1461030c578063f220b9ec1461032957610091565b80630ad58d2f14610096578063331b6ab3146100d75780635daf08ca1461010857806361579a931461014457806369e4863f14610159575b600080fd5b3480156100a257600080fd5b506100d5600480360360608110156100b957600080fd5b50803590602081013590604001356001600160a01b031661033e565b005b3480156100e357600080fd5b506100ec61034e565b604080516001600160a01b039092168252519081900360200190f35b34801561011457600080fd5b506101326004803603602081101561012b57600080fd5b503561035d565b60408051918252519081900360200190f35b34801561015057600080fd5b5061013261036f565b6100d56004803603602081101561016f57600080fd5b810190602081018135600160201b81111561018957600080fd5b82018360208201111561019b57600080fd5b803590602001918460208302840111600160201b831117156101bc57600080fd5b509092509050610375565b3480156101d357600080fd5b5061013261047d565b3480156101e857600080fd5b506100d5600480360360608110156101ff57600080fd5b810190602081018135600160201b81111561021957600080fd5b82018360208201111561022b57600080fd5b803590602001918460208302840111600160201b8311171561024c57600080fd5b919390929091602081019035600160201b81111561026957600080fd5b82018360208201111561027b57600080fd5b803590602001918460208302840111600160201b8311171561029c57600080fd5b919390929091602081019035600160201b8111156102b957600080fd5b8201836020820111156102cb57600080fd5b803590602001918460208302840111600160201b831117156102ec57600080fd5b5090925090506104a1565b34801561030357600080fd5b506101326105c1565b6100d56004803603602081101561032257600080fd5b50356105e5565b34801561033557600080fd5b506101326106c5565b6103498383836106e9565b505050565b6002546001600160a01b031681565b60016020526000908152604090205481565b60005481565b6000547f000000000000000000000000000000000000000000000000000000000000000090820111156103ef576040805162461bcd60e51b815260206004820152601f60248201527f524c4e2c20726567697374657242617463683a207365742069732066756c6c00604482015290519081900360640190fd5b347f000000000000000000000000000000000000000000000000000000000000000082021461044f5760405162461bcd60e51b8152600401808060200182810382526037815260200180610a566037913960400191505060405180910390fd5b60005b818110156103495761047583838381811061046957fe5b90506020020135610902565b600101610452565b7f000000000000000000000000000000000000000000000000000000000000000081565b84806104de5760405162461bcd60e51b8152600401808060200182810382526023815260200180610a336023913960400191505060405180910390fd5b80841461051c5760405162461bcd60e51b81526004018080602001828103825260368152602001806109fd6036913960400191505060405180910390fd5b80821461055a5760405162461bcd60e51b8152600401808060200182810382526031815260200180610a8d6031913960400191505060405180910390fd5b60005b818110156105b7576105af88888381811061057457fe5b9050602002013587878481811061058757fe5b9050602002013586868581811061059a57fe5b905060200201356001600160a01b03166106e9565b60010161055d565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f00000000000000000000000000000000000000000000000000000000000000006000541061065b576040805162461bcd60e51b815260206004820152601a60248201527f524c4e2c2072656769737465723a207365742069732066756c6c000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000034146106b95760405162461bcd60e51b8152600401808060200182810382526032815260200180610abe6032913960400191505060405180910390fd5b6106c281610902565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000082106107475760405162461bcd60e51b8152600401808060200182810382526024815260200180610af06024913960400191505060405180910390fd5b6000828152600160205260409020546107915760405162461bcd60e51b8152600401808060200182810382526024815260200180610b146024913960400191505060405180910390fd5b6001600160a01b0381166107d65760405162461bcd60e51b8152600401808060200182810382526026815260200180610b386026913960400191505060405180910390fd5b60006107f66040518060400160405280868152602001600081525061095b565b600084815260016020526040902054909150811461085b576040805162461bcd60e51b815260206004820152601c60248201527f524c4e2c205f77697468647261773a206e6f7420766572696669656400000000604482015290519081900360640190fd5b600083815260016020526040808220829055516001600160a01b038416917f000000000000000000000000000000000000000000000000000000000000000080156108fc02929091818181858888f193505050501580156108c0573d6000803e3d6000fd5b50604080518281526020810185905281517f62ec3a516d22a993ce5cb4e7593e878c74f4d799dde522a88dc27a994fd5a943929181900390910190a150505050565b600080548152600160209081526040808320849055915482518481529182015281517f5a92c2530f207992057b9c3e544108ffce3beda4a63719f316967c49bf6159d2929181900390910190a150600080546001019055565b60025460408051632b0aac7f60e11b81526000926001600160a01b03169163561558fe918591600490910190819083908083838a5b838110156109a8578181015183820152602001610990565b5050505090500191505060206040518083038186803b1580156109ca57600080fd5b505afa1580156109de573d6000803e3d6000fd5b505050506040513d60208110156109f457600080fd5b50519291505056fe524c4e2c20776974686472617742617463683a2062617463682073697a65206d69736d61746368207075626b657920696e6465786573524c4e2c20776974686472617742617463683a2062617463682073697a65207a65726f524c4e2c20726567697374657242617463683a206d656d62657273686970206465706f736974206973206e6f7420736174697366696564524c4e2c20776974686472617742617463683a2062617463682073697a65206d69736d6174636820726563656976657273524c4e2c2072656769737465723a206d656d62657273686970206465706f736974206973206e6f7420736174697366696564524c4e2c205f77697468647261773a20696e76616c6964207075626b657920696e646578524c4e2c205f77697468647261773a206d656d62657220646f65736e2774206578697374524c4e2c205f77697468647261773a20656d7074792072656365697665722061646472657373a2646970667358221220be0b0b1f842029cde290573a70f50674e9f4d1db01b636facff8e065d03cb1e764736f6c63430007040033" diff --git a/waku/v2/protocol/waku_rln_relay/waku_rln_relay_constants.nim b/waku/v2/protocol/waku_rln_relay/waku_rln_relay_constants.nim new file mode 100644 index 000000000..7ca6adc43 --- /dev/null +++ b/waku/v2/protocol/waku_rln_relay/waku_rln_relay_constants.nim @@ -0,0 +1,461 @@ +import + stint + +# Acceptable roots for merkle root validation of incoming messages +const AcceptableRootWindowSize* = 5 + +# RLN membership key and index files path +const + RlnCredentialsFilename* = "rlnCredentials.txt" + +# inputs of the membership contract constructor +# TODO may be able to make these constants private and put them inside the waku_rln_relay_utils +const + MembershipFee* = 1000000000000000.u256 + # the current implementation of the rln lib supports a circuit for Merkle tree with depth 20 + MerkleTreeDepth* = 20 + EthClient* = "ws://127.0.0.1:8540" + +const + # the size of poseidon hash output in bits + HashBitSize* = 256 + # the size of poseidon hash output as the number hex digits + HashHexSize* = int(HashBitSize/4) + + +when defined(rlnzerokit): + const + # The relative folder where the circuit, proving and verification key for RLN can be found + # Note that resources has to be compiled with respect to the above MerkleTreeDepth + RlnResourceFolder* = "vendor/zerokit/rln/resources/tree_height_" & $MerkleTreeDepth & "/" + +# temporary variables to test waku-rln-relay performance in the static group mode +const + StaticGroupSize* = 100 + # StaticGroupKeys is a static list of 100 membership keys in the form of (identity key, identity commitment) + # keys are created locally, using createMembershipList proc from waku_rln_relay_utils module, and the results are hardcoded in here + # this list is temporary and is created to test the performance of waku-rln-relay for the static groups + # in the later versions, this static hardcoded group will be replaced with a dynamic one + +when defined(rln): + const + StaticGroupKeys* = @[("e9a4d05b1f539d65c59015a079ee89aabeafbcfc9734342d9559f81601e85417", + "b74d3a5b3200ab1126fbee393496f33da497d4d9a7c56693f44d6155c0c34e13"), ( + "27b2bfc25257e53819beaf36ce1070007e04e7aad2e440a1f1fc066f59a61123", + "522ce51aff96041e79a8476f508fb9661f146f189e288f83cb4837517cfc0127"), ( + "66392eaae6674267c55fe393d39443ba90317a709d6e8f92a9f3e4abc18eff1d", + "e3dc235e48c1811943fc249fecd0f1415a50ebe839ccefb0bd820a76fb77ba2a"), ( + "e7462eebb81405230db8014b052d65fe7b269c3870e40b12cf64668ed6c2d40e", + "727df0965e34144ea637be18208cc81e57e423010b3159c20f0ccff45c42212a"), ( + "1ad8528b4c7075013a2d6561a02517b0482c0733dc018ac68774db857deb5004", + "5df3a77577135784da2a9ee78f5026092b7d6bb9e6e95882d6cb172c0cb62208"), ( + "aa0ff53bfc50861f871d94df18c3ac0b97f44ceb13436b33490cec5f6ce8e700", + "30421d05b905aeaec0473ba29ace034bf73c406866d7dc23007eb9c34a596827"), ( + "0448c0a6ed57b177c4c45de478b58d29f24e7ea842814305443e87188ae24324", + "5ea1a704d8972af5a028367c8e3fb48ee61a603c6ea3a4c9247b0f611a6ab002"), ( + "4b6a6edbdd11e69befe3f4a3c976baca320c4bcb188f129b603ebb198f663000", + "451d6185e8ad2c8873f034683b9caca43ea7ceb1b839abd3e01c3f19f3e6bd1e"), ( + "c3fba34855b33f025696326d2980ddc3fb47d90459ed6a4488fbb2e4e12ccf2b", + "74674a86144ea866ad8fe633e256783bda4a07b997cb412c53a5eaf4cc7b6a0e"), ( + "0c35b8b94a720f1c26d7c6241c9f3ea5332a87cf3730b25ef31b68854c10e405", + "6915df8d8ad19ec17be37c299eed762f9b63e841cd7963e13e8db6890dba082d"), ( + "a60b021677da95ba46c8c3411ac77f3e3b06937a8d189517111c045880029909", + "bbfcd22ecb44cec6fd0717cd0f21b26e6e8b2c91e1a6cb5d8610e2f2ad41c90f"), ( + "2f4d662e66fbe754b708b87ea3d75a01d2ea4d7bf33c615c2376211dcc3b560f", + "c67f7e622c3293028b9f86571e82c49551eb5fd308a35eb663498cffac208810"), ( + "d90a1afa96c14c8d3b989a9cf23d6e8b9907da42724e44a3ac74ae015b6ce22e", + "f0795b1bdd0a907252b6ab047642d97be076a16ea69d463f1a4bec00c817202e"), ( + "dfa0764d89c8da10777504e5274f1baccf8b4145deba72b26503474318fb6410", + "9f8aa8e833ea2f13cccfb6d9f2f04fd7be9c9f3019540c05c1986b3bce254e25"), ( + "e17490013b6b53a40964ff1067b922d4d73521e32fe394527b39c1bfd4a5e712", + "7a8fa23a0e4b14a36f2818a7d98639f6e4934c028da780a6cc658fbf76e80a26"), ( + "7a9328d1075373dddb1b1100e8217ffaa1f9b632911b95a8fdc08870b15a8410", + "94b2ae70c046b94873098c19fe18e7b17db2d31fe6a7eb73fea8168395e3c122"), ( + "ce319bb1447da5bf51a88ab3379dbea539b5a431d3c4f131048cf7b05c52161d", + "cdfa264ab8a51bbc9fff5732cf544bb06abba7e807a8c252a5f9ce785c6ff22c"), ( + "d3818503bfcbef9ca03fc4472be77cb4936a1720001fc5e54852f769448fd313", + "e72792abd906976c75a5670de514894a720c5293cf74338a9c2987640a949c0b"), ( + "4f9b8d118460736eb62602d12d3aed62938d4d4374b8c88704cf40c415c0901e", + "2ecbe4588ade31924a1053fe0204950a0b4924878b312e56b2d0522f92a5f01c"), ( + "39b59fd96adaf9633edcc8cef10049cddf5f7df8ac80af8aafa436d62ee7f905", + "b94f7a979df8a95fc2766a9a96308ff39a14daf7b7d6bc48591d2ea4c764bf00"), ( + "73cb0d25995d182b361c8237852bafeab8bb951de99f730da2913a239400c322", + "da04e6e4446b6bcd54667b741444d826abbc5b76572d28474dfa94db91144606"), ( + "2753423b83bba5bb8b2799bc58125c46fb03ec05e8579d772cdc6e75b0875009", + "ee040010ec20e7293431a3692d06416f71162d176a316b0329a76edf6f3fb30d"), ( + "cb73ec9b67355ce6275b51144a0759de28bb9390aab20514ee49a3bd8ce5361b", + "c7c6e2ad3efe1f03b398241bddb67b008dd5e8caf1a17db9c33d2e2388d58e0d"), ( + "bdb386d9f3fe5613ede926d80246682a5d32392f7f6c9d818a80d8e7a12e371b", + "21d48c74f422ef72cb9db18799916b3c11d0cb99cec808563e2db22047840902"), ( + "60f2fcfe341034449046c1fa330f6aceff737a9837a7d6d3a4885f8afce4a809", + "e4c8f26f9e4127511b5ab21f1705913d7beaa2767cb7d033564e36bd2693370c"), ( + "1223d64fb5c44921c1ae66d91543780634c2f7bae7e184e09c4e5447e6d1180b", + "290ab84714fc3534c5ba22b2aa7696ac03ed12c9cf1c409a777bac05475ea406"), ( + "b79c593316c42280d316bb7f3b43c7a5f5e29786d1ca6c0424463470eefe2b2f", + "f4e44ac9574c4d32ab403e71dd00554eee0d8e34d04611b66ab2e59c49bff025"), ( + "e6548f669ebe655cb6600432e1af14c43da7286e3620289b51cc947517db9c14", + "ace261e3964a1dcb389a693f52104018cd475e6856ae37fe4892df9482954902"), ( + "81be54409c9364f4842209e0f79b190afd9df017cc9790e11196d4bf5108f100", + "d986b22e422703e065f12b6fd608813028ff913d4ffeb54b19e6537456391b23"), ( + "940ff0d3b4549d1baf7ad900cf6aedde02833b777e39c411e6efe7bcdd2ef305", + "d672bb8a6e75b47fdbb365de0516f3fa827b287c9666e64d1b6768e2c8949412"), ( + "b4fe300aa1c8c836b3cc4c167df86d08fb7213200b8d9f7ba7963170e6dc8c0a", + "5f7db6a9867f3f5c9fd1955c02cf96056d1225be950cd432818f8f1c16152020"), ( + "2c34a2bdb3738cb78270207dcae40ae47178bf4216bd2044ba124ec49240522a", + "8c490c78d7d735ab32493510cc2ec9c3742d3f47e46cfd754859e91271673e15"), ( + "fc03857a3ff92d17d40bf9bb9b99e01e85fe4c698450147dc74cde60b2e9fa2d", + "c0a22acdababbc42bba5bc0245a2ef9f2c74b215663440aed37c8e0bd7e00809"), ( + "a267a96a35c63b03788e90bb9a440da9ac832b0be02537b6f0ecc928ea989223", + "636ceacda5bce999ca303b7df32e9352af10083c6db6ed93c8a221efc385172d"), ( + "ce4e15a2c1667a9dac4c4732de6c91f8c523c449f8c9be6b895644460717a209", + "d55c6523f40b36d2519b30292873bd469aeda6dbdbafe7c5fd405438dcc6bd12"), ( + "4c617cdea4e3cb008c396c59b701375409304d84cfa17fe9d6d91a15fa412306", + "a6dc21a9c35418a39c69f2d8e9df738db0b36fecc44eddf364846b84c5362819"), ( + "8c33aa2b3d94f9b11cc62ed1a304b92be370384ebbbf67c886dcd6ce544cc806", + "7caca2b1ab8c70b58ba36794a988fd6ec50c2a04dd09d7cd28e67ca1f1401d2c"), ( + "1b6fc8f4007e6cdcf89a496cf0e711b0a3bbdbbae66830450a9744f5c802a228", + "c3b79478bd32feb99a0c92001efb97953efdad8c2338ed2ac14a313592c12418"), ( + "0c6837e83ee0f1b1e5fe31bdf0960aefa2162ef7de7c0c886df930839bd4db06", + "8b2667b5151ab13f0f87fb014cd3ebb7ab1e92a528f00ebd91b514ea61b8f52b"), ( + "8da38060963597c34544d8b10432a2e34d8eada7d1479f4fa5e96dca32250c27", + "7bf525115a8e6f772feb6d4db0f2a6b0d4233e0ff85e180c3249e18f0d08f42e"), ( + "50b0c6d85f6a9d11fc52f1fc9e43b778380bdf936ddfd293940c77e79bc8340d", + "bbb9e297de81ef341e032484d7b33b29e7d9e3be1414feaf2bbc0957ba408811"), ( + "6e8fd3ad20cf32ff8ba6e4bd8d4f05f3cc20d88631cbd3aa5f7f98446d725108", + "a9fe7404613b040412049a205301f2175b53d7012087047a8dc7501a381f5210"), ( + "c291bb32d69cfef7e80b6dadd2a1198d05ac23eb30be6503d1c4c04350de2028", + "f44f8ca09d849551f72a6692c793319eefaa0c02d3301ae79c2f869f4251d422"), ( + "116d4c2e21101f819a87f0de31dec56a4649c9ad9e539b71680dd439b288681d", + "9f4df65e05390be63bd6e3e38d8afb6117d5d357d56f35ecf63406096fdd810c"), ( + "1813ed3760299a16e623084a852de9b12caaf8138744f8903a357fa9a2dbb00c", + "f37baacccd07bc489f50b851f807c88a425e41dd9dda8068e75cffb8bf653a0f"), ( + "545e62d72cbb89db1c17e7ad8bb0660a74f8bc411b16eb0452d9a2d7c3e5b01e", + "96ddc93a86b091c7b1951d7371f80a352d85c38606e450aa2af272e8929fae19"), ( + "0f5d5941474697c21ea6aecc29ff7cadbd28dbf29531431a40aaea3b7acd1514", + "e83d0ff3ab4db81fb19c1b6125d7d2e4a34a83a8d463049d06df4870dbb2a525"), ( + "52605bc1f48092f9d5ad4c2a840a60f129e6aef2eef9c92474951ed1e10e381c", + "222df3afb8b20685c872f29ebfc7e4056fcdafe1d8a77a9f9ba08ac8f426190c"), ( + "eee8cdee57e9f11ad0174c1514bba4c3a2c2a10d099876195726217445462f0b", + "a000e5799ac933154bae228c09b522c714fb9a57f530d1954947277be9db0a24"), ( + "8c7d04dc3916370f8186dcffc92ad482294ab49c9ce36a5bd13473dc7c4d491a", + "788e35bcd82efbce15b3444f36330337ce3adb67bfc6329149cd25069ac9eb19"), ( + "004a720f9edabb7f82eb30a78da45aceccbca5eb69583e1e8018ec1359a61f27", + "e3d319d64bea8069a649acd33859b22361da799e0296f3d4f5117e16feb18e16"), ( + "38716f1d7cde7e37795a5b2d6d6317eecbf0adc6dcf7dcc6ee02cc25d1efb22f", + "95c229d0cfc1485f2be0a23de6e49601a2ea55652beead84a67cd727c21a1301"), ( + "22cac7a49e99f3d071812abb0addafa4bf9a65308769728e4cd53cc7486f6c13", + "a2e5b90606809964bc20d776b9cbcaab93a2f25124998ae3bd698d061f7afd00"), ( + "5109c7a41f73baa4787358b72ff1095439602add7a86a034b87b74360ee2e20f", + "a31b3e2033ed828b5a51b9428f8f6ea40267259df08fdcd2c0e34dd335bdf90c"), ( + "957a87470f29a135567085c3d6d6ed14885bab4eb659725534a45a9f100a471c", + "8f3005df282d5a87fa33405e35a313233d05731e87cfcbe060fa067596fa3013"), ( + "e0dad57606c2b293dc7c841c965cb29736d2411003e9284a0ae94d13e3d03d2e", + "0543643ef0b617030dcc292451ebcace8bad20706528cb6aedb98dcea66aba27"), ( + "f1f10938c8a55b6b15b3f12beebb702133401135937c5c3f2d7fba702f24da09", + "dc862a8a5ad5107421d550731a7f561e4064878c3654bf88b230cc249e91091d"), ( + "4bbc08d78c9970235778d6bd9939c7b2b1bd88b9d1cde6473663ae96ae776911", + "3584be9ce31a7fb3aae8515011f4d3eeb86a573b225a88577e4911050bc35013"), ( + "c8325b31c9295757ca23d8f5256eebc5ccc517d28e00bfda5f4d709441d66713", + "b81f360903160485c470625519cb18219b44d8b740273ef742fefc5653daf009"), ( + "69a6b3e22fbe5879efa56cdb5d50605732bf7f311e28ba037916b4db61ae8a14", + "10ddf800eb3e67da20575456150cb1f0d49506d97ed4ef2d91b951af48966924"), ( + "c2a0e3586d4bb49f2ef979686c3a9a1619d0d54ac89641d592b4628b19dee401", + "bc3ba677f6d13ef9f023d4a3b9f073c3eea910ef90cfd24b7f54414d2d02d315"), ( + "5b89051b79ff37457760d7af2ebc68be955e47eb6cdf306fbd369dc19fc52c05", + "7bfe2a9d5bb2ade0f9058ea27a07c867af21670d2b9e84bdcc8967d4cdc4ba11"), ( + "46ac45f35cbc23bf68906933ad29240054a0a1d89c1832ebb54aa1bc32644105", + "e891e783d5615a1b8ab838f68f6f2ce4e359510ddd40882d4650327d08a5bd11"), ( + "581e067b37c40caf861c190922f816e6cb850540df7ceb159f96c48c1c70cd23", + "0d49fa8c74202369c36f4121eab0aa3ac9206ad3419fc9517a88493b07d6fb25"), ( + "bb7eb4ba2b45a22e14fad963c04eadbe8e7aab6ff912b008c9e7dd2a2c7d3615", + "758ed0c8cef51f82508072fa758265f0f0eef6c7b2401b94ebe27a638ce33125"), ( + "a08f3cc9904f672b94d1f5a14dedbdef4ed229da5b66eca0135090d6f0ba0728", + "542c952395d241cfa15bd48922e9c7fc292dbdd120daa3d66dad67fb3abb700a"), ( + "105bac5c449441bd5f5cf39b431f703e2e8f6a30a90d86cfdf425ec728fdbd08", + "b59206f1d556fb98329a7111e3c89bf1e6a4861ec38c82eafa81cff70b713e0d"), ( + "45df2edfaea234dab99efa9a402c0d2feaa841ff3c990c926473173283d95913", + "db008cf922c3a50549373a14f5f18b2dc827bd6e168402dfe3e6ece4cb137527"), ( + "488dd6437c15ef5b85e84407b7e599cc078c195ed2fc27b366ddac7739f1eb14", + "0448887f55c677464e7e540adf107ba10fc6713e8a2718fe92cbd4794ef4be17"), ( + "3fe697698f3504e15eb5d509efa91624d9aa4eae24beeb42ffcb3c6ea8372a30", + "441ccb28e7c6c1893a58f7513c9b7c1c5d0adf3de452644a837d7e08e1ab8117"), ( + "9bb5801272264c74db75f1c6812747bf338ea6880fa4dd2d51ef651ef73c2e04", + "e2eefd80e838c30b3f1fb0313fcfcb1e1556439d0346d17334df83c33247b20e"), ( + "bad37a1467c4fe875b78508656f2816414ef602ae2ccd4e9430d94ca5c1cd911", + "21c72ccdbaed2e3ea9dac3881531467b64c9322199127f2ae2fa4bb31bad591d"), ( + "95c72237ccbaedc185b1abfc59059c454175df81bb3ff65e5a61e2cb5263ed0d", + "1040728a4775ac5cf7a9c75dda2f0aee1fabd6b202b5e916636e3aec73a09d0d"), ( + "738e8b9af4d199bc95f70b2a9b25e999b39af15c6a02f2eca058326078745f2a", + "004835960aa03e101d818907df453cefdfb910b44ad9bd056a83b2ef40a5ca0d"), ( + "0d88caf486f2fe60bfc08697d1b617b586ec880e38e4ff56f145a5db0ab6d12e", + "a7b19323815295bc84c50535b62c3d4d53dbfc434441eb3c009568fb8f7b2b1a"), ( + "b37af7fd314d90590fba8ebf730397cfdaa97f86d3f31d1a7ddc817ff303791f", + "8296a80eceae97f92784642da34f121e29db2c5f3baf9a2722896db22e98b703"), ( + "6b67dd3051a8cb113431f5a14e279d910b7b4798ccb03ff588cf312ffe366a0b", + "9c38cc543a0b793be4a0d66de3b2cd30b1f33d36c4402a165da924d7e6f89a12"), ( + "72fc4c40e406b9d1b34daba614460922fc53951abd6db5834e1f1b07fa319f27", + "daa4d50481ba47c4a78ae3848a9b268b1d8e0579b4967ebcdece47d386410d02"), ( + "a4ce5cb2b2a23dcf019f275058a4092901c4793e6ee7d29282e755dd0d0df000", + "00749453d23051f3587911c34d52e2c2d093273d2283cd6dfba94d7a89cdb226"), ( + "9e00df0216e8ac8e72abfeab1106373a13699714c691f04a549f6b58ea974521", + "0e69dbfd9023b8bb58ce7e17972d7c94d49e8464f9c22161d7564ed32c53ef27"), ( + "fe1a558c6315f425fea7c04dcf6db869acd7b62b1b848200d5709e73d53de71b", + "66cd33cc8d61cb807092d76ac0e506014fc55624a39ee2afa67f9ba58eb21022"), ( + "3ca542e17e4cbc74f47afb399b12295d15dfbae5e966509b7e6cae2df61a430a", + "57a0df429ed3720dee61ca720a4617243b41472f0c7766cc7ce625afddb3b41b"), ( + "c1a77855e9b0b1f7381c9acd69ff68fdfa65f1f753dcea22de5a28ed088c2b2e", + "4fce521d725abb8a30d8c39a2a22f496b374d8512b7a76afd3803f7200c86d19"), ( + "17cda8d590adf3042bbf1452fe3d79b959f284f3df1e15ee3c696286f0ba832e", + "8919e92a175b55003379ca6e546a04228aa9da861a9669e0e9b106e4a204d404"), ( + "959fa9337b4b479ce5fcff7ff9096a344acf7fcde2f8852e28904236472f2f02", + "79e688ecfece239223b745e4b95460bfcb02aee12b154e15db616fda857dcd06"), ( + "d062d34cbdfbc50004a631e3dd8f21b446673b53830aa71fdcbc741e7d4fb31c", + "2203af0127657f4e8a1c5ec44bb25028e64ad388efd0b9bfe2105f4f3ff66d0f"), ( + "d2d3e3034864944914709549ce27068b5f27bd18b0edc940593df2dc5c5dae23", + "5ae75206bfdc8f54a8673d5d4c4b464ba1e84ae2410418b5c5e98fa993608113"), ( + "4ab457d6478fb27214345f0bc2e00cbb29cd55bed1f8e05c23b8f7810e134a1f", + "3db37711e355ed46ea81bb6e31ae87b37b706a8d17e2aa976c7c7706c8e18d19"), ( + "5aa17884c96ecdaf81e2b343dbf051e4ace41935e53378ac10a4387e2cb0c404", + "7118986268a748881f6144fc1008e90b40afc702be53784ed4cbceb8606e0714"), ( + "82f4ca6b751ac067e451ae1d5115806e7a1d14ab444084a8ac48046b88b43b30", + "8a09186c2a5cb0f16e273be6a8710620006a77afe7c54149bea3dce906345a02"), ( + "55d5d97de81e0cc4d2ac97e507d4d6d9874cb55e1522b89ed2050ff3c20a4912", + "27facefe4e2041e11a21889205af6c11eba73e3e8779b801bf3f7253730f1d04"), ( + "845177f4584f61071ddea21e9a6c0a17e1a9408e0c073047c339498ff383c109", + "25bc572d1c861fe80156c2fd440e7d9110be8252723d276e806dcc012f8da103"), ( + "ecec46dfdaf45f49f82ee78fd9c8c747c049de9becaf440f90391c04dd119002", + "b922e1a7caf72db69dcc062424c7ce75728d010c4c201c2ed8e635a617c81a1f"), ( + "8e265fd9f2a4b158a5eb4bda000a6124af909e118b7510f0ec418559aad85825", + "aed92a21e9933bd2ce6c9f09bb7753b46ea31248b324c12726cff08e464bdd0c"), ( + "99d7181572d3ae637a277dcc0c35b9b98bbb6ecf3cdcc69af3e946a5bfeb520f", + "89217b554371a2495ee473f867b2e26ea70d4245aceb462a98dd31a37d2d5330"), ( + "a5e1fd149ae27f34e7902ebf380277c0b7f09f37e8809d25a0b8df2965d24e29", + "2d6a16a254cfc3894d5500f8c40feb1e84876bc51c68c381109e83f001b41c2f"), ( + "7fd221da235bb6e5fd0ae047f1aa49615ddbeecfb71ccb976bf3e0534425661c", + "9ea41ccc3e09572927b0d9f618e1135d384f33618b6a0f80002f0a70be5eb324"), ( + "b125c1b45daa68f96be6a5b3e4dd24e4a0e49e46226d841eb73754a498c43b21", + "360b9c39d25451ae58cf651c530155f91e324292b55475a92506de726f153c18"), ( + "d64536234849ababefa90b84f7b7cacf4b073809aa9b0c35581426521f18d81a", + "d2dae030312cd4325bb036aa3436b26b9bed69b4d78d68bd49dbdde3173f1510"), ( + "d1ce3aea6cfb7be132d17e8d76fcbe4b7e34cef3979b4b905acfeff2f6d19724", + "be47b76297791f535f4b56f973a19f07ec22d4eede2a41ff23c696089938bb21")] + + # StaticGroupMerkleRoot is the root of the Merkle tree constructed from the StaticGroupKeys above + # only identity commitments are used for the Merkle tree construction + # the root is created locally, using createMembershipList proc from waku_rln_relay_utils module, and the result is hardcoded in here + StaticGroupMerkleRoot* = "a1877a553eff12e1b21632a0545a916a5c5b8060ad7cc6c69956741134397b2d" + + +when defined(rlnzerokit): + const + StaticGroupKeys* = @[("c12d11c3b8ee882559ef48f7a42633d81b1e13fc589e6caca028281a1098012c", + "b3ec8a9138817be401b9ed2c683f6969d87f70ad87cbc514dee24146a542a71c"), ( + "1a19a8d1709ffa10882673962fa4b6fcecdd2ae3c95f9cc2db294633fd775109", + "eb599e4681f8fd50730d22d2b0d0e9e4efcc659d2d310bd6cb3ff5600a81300e"), ( + "6317e72b74ad1395ce77777bcde06b7b5dd02ca69ad6fdc7affeb3bf4d6d1c13", + "151a533bc8927e97be9ba2173644282e3aeada4f9a65c4cc72eda27f3ba10c11"), ( + "d5d375f61fc9f9b4702aee9473ce304abca838d224dbc0dcfabffa0e3d04452f", + "f538609579c413bca2d395a772b026498eba0c00a1cdd5f7127d526bd96da723"), ( + "f47b36d2df712cb16eb21797c2d0672e12a60e0a7807edcfb15e7213f072a20c", + "d4d12cce11c6d8311c15353d35926f298b886ac66cf6420c47ad178231632608"), ( + "3a8360de57f4ab8cad701459a73019c71b0d84927dcec0384bafb2586356080d", + "08a8b713036264b878bdb8051cd6a6ccc9acf9e094daff690d167e699a90c628"), ( + "661b5eb69735c9e8a181bcbf34563b96aff763d4996d60ef88c439e82549b622", + "c1fffac2bc6d8b78eb24ba052d72bb88fe5cdb40e86eb3ebadbd57aff47b1e2c"), ( + "79fe1ac6ee536412d737091c7e53f003cfd4e4d1a96b1ebc1d27faff4527101c", + "ae1b33ed18cb164c4b3227d8acaf75eb480a58c07d04792361d3e7688437572e"), ( + "88f35905877c4417d418a75994eb2ccf7da052b1032bae782c935b107bcaf12e", + "0e3cf8fee2c863470dfefabea0162e98a3cb0b5aed1387d9aa2990710ae6b705"), ( + "771b20194afc2d043d133213a39c99f88a50f6459eb7bb7a8b19cd468fdace1a", + "408f8624260e2a85ea354959cff0e7550d89ba666e4a5d646fe1ab8a9b253d2f"), ( + "1e40c14bbe937cc3baac06f4b9c1e9d15374064a12462a505ee3c85b59e12d20", + "c5ea8270d54c3919ffc5659bef2b4f00f55a9b7e8a655875ca864837cf66561f"), ( + "23dae2b032cf45c17378778786b91fe53c7aad7928391c5c4613b5683ef22c16", + "9f6e20cc9f6df9e64cabcbb765c92faabe25257d92a00f746d13cf1e5f113f1f"), ( + "f3213ee18ebd73ee5813ef6267d54e0af7bff2a62ebd329adfe41a42e1d7451c", + "839c3c58a2ecc4c181b8f298ce6aaeeace4e0777e8774cc1fbc4279c3e001724"), ( + "f96996f6df01ebe12b75f96ec634458e5e96d8bc9b2983b211d943d8093d0b0b", + "8ce6a29f023aa78d5a4de75b3e12c3cc673bba9dcafd5a2968f4a1b9707c5b11"), ( + "c9d5403ed3ee20b29cb49c16312464a52109c553cb7c3e2e760488bc1f4f1b1b", + "96a4069fa8485b11c9fcd9502c384caa6a1db2a90d45559a2aba51d5ea21782b"), ( + "3de4f01667d317d52e2718926646dcf559f2fb7266b6977a47401b976b457b06", + "6eff6bbee3d3bd885c7f900b362dbf245e97a523afdbb62d25eefb9afeba4c0f"), ( + "89453ee367a782654502062cba7da961d638b4160121ba0ac88abe7a2f82ee18", + "551f19081516e49a4e94dd97af53da2b35b603c321ad02d29f85b9d5ff12f802"), ( + "32c5a512efe5d41504bea17a4e3bb865c8d54e9c6732a3bce77962e52e1fc414", + "3b8dab877f10640659e99bc6dba2367664aca2f4e3f87b38ffd532f326332f12"), ( + "a74c13d3813e7452fd8680074c31dcc8d6e79e95086175205129f77f37feb129", + "c55985f3a99a3fd1a2619a54b87e433e4114f59d1a59c3a911e957790bec471e"), ( + "9b1c420aa3dc252e9f290bba21136c97d4bea618ee298a4167eeb445d3b6d517", + "66f0efae6899a6f851a2dab31df7e936238b8aba4e961c9b65c6b1d113f13e23"), ( + "d4821c14ed5e7b8f4febc8cecc26e1d0ae6fd97a7324566c06920300110de414", + "9653e0cbb946b534f0468e42bf124e5806adb4bdb93e91665610d69037b28b1d"), ( + "26c453348bae0b3398691e39d5032021c15f7fcf8efb5666f2ffb3bf0c609804", + "a366c39b7cfd462063aa394c31642d36cd3ea5fe89ed0d7db423f2791cf74429"), ( + "4a50a8c66d78ea1850ef9e6ff3d082fb6aea7a380d267b89e449826c8e7c1319", + "e353c38ea40b59565dbbdcbc03c0c9f99a017551ae912afca8d5b6cb028bbd2d"), ( + "d04788fe9a750986d14596580b48edb0415b18466872d4b431ebbe80c0276f17", + "234ecb8bd50f758f80a48484b6997b4d0a64a1f67941aca1bb31661797d63010"), ( + "c5a3e4885e1b16a26ba3d938659e6a4d37e3f66d3f4a8d82ff6e22145ea58303", + "2921633b6bc30dacadba9ee3956ec7e3024971d9db600ef99c4ffeb1ccb8e425"), ( + "485887237db885ac07ce8eaf4e881fdc3fbcd4454cf0c56f0bee6b7213de570c", + "061186e353aa3a59c4bc1d98e926c17b3450081dbcae63d2d0841a3fb3cef422"), ( + "ca0f9ff876c78957564b303c9e99598036293efe635ec29e0e4bbc59ec59d106", + "48e04ce11bf78ef28261067eec8e5a47ab8632b2d35dcf2e28d229e1e2894714"), ( + "9d7965f433303388ced9097e0563c2871c7ce0b286f108bb53e7a68f77102b24", + "b6afb6e2de8fd30417e4b8d1fe4559ec73aa9e96726d0448eef104a0f099eb2f"), ( + "db1ef92e473d8bdad5654525d9a9fd9fc0febfe7101eed67c8031d697fff5913", + "34d5b8bb8893c4f4fcf0aa4cb6bc13187bd4867bf0b4b32b57387bd371406f01"), ( + "d43e059b5a5a2cb6b4200ac3832fd4ae6a33c69bcd784eaa3e662007a43c2614", + "560683915ff850883b2344e9c64543cd40b2a544c099edb1e37932a7c21a1d12"), ( + "a1cf07a46e8696f4a6f6838d246c4e9fbfe6db33149c99fa563f233b16317e01", + "3904003e9ec020a567d23301a8f381a7395d129020ad320fb2b11f57680de027"), ( + "178c9c8612a61f62506da40443cbf6d6fccbc9406303b6f88d9536b42c506826", + "2c81906219408328fa05a005247c9baf796c459ecc3ab0e1a70195c180e47705"), ( + "f84b9362f81ec147c40f43cde64f3ce883bd80b40230c435978794b54431be1c", + "ca524f39724400999116252fdd67316cc0caf586c3ee0bd98c132ab2fdb7f30f"), ( + "a2fbcc2ebb6f728e42c2967bde68461af69c2b10c5305fd40053eb01d1db1e22", + "4ef48e82ffc90c273c6a1627eed225a1ecf5d34bfa33026758306601a08ee71e"), ( + "91a7de9363388d15501cf72449b053a036ec5fa16faddb0bfdb6aca0a0c1f409", + "fa5bc2eb977165e92a45d92d5da48e0b1e95e2d13e2d8d42dcf9e99f8761f20a"), ( + "6e2598bf6a6975a578abc5615e0791c678ff1776176a771f025c17a67777791c", + "22afc07a5715a0d1a47ba27403e83660837d2c7b9a5902c22c0fed861ff5ac14"), ( + "e788d7b78798f2edc1d5575e35dfa3c17b6c15b6642df72ea6ee28297422b011", + "ba9a4176a20d61efabf8b3a6e2197b8dcd26b0337c26b567c2fc4b3ccf67aa15"), ( + "bd13c15935c3a49b2f19058e784d3bf700f4c06c0641fa771822194e543a3200", + "1535c97c68abc851042f117cf98be4130a25a49acf5f9c910babef342db1fa1a"), ( + "7718d0013fe1be1715041b7df3372f21185821111966fc40c5c29b948fecf60f", + "e476d8441b12a235c48c24cf1a4edd1b9384c2531d70dbaeaab891aea4c39a09"), ( + "857adf44efeec3ee71001be5172f0796a56021cbc94273ae4c8a58356a0d2003", + "358eae8e81fd089c3807354d20cf1f878d39b1ce757126e787d4487af65d7821"), ( + "8dd2491ce49ef575e8e0ebfd675b6b831e8d19c90d6110ebe57a60d3a9fff622", + "88ef9b9cadb4395c03d57ca9c0a84fc76988b1285d716d4ed3a6340aa7f85a28"), ( + "95a421fd9f866bf28eae38fff084ed0d300ac08c3c020d73e6c0a432e5731313", + "d86722ca41b4dacfcf1bbcce9a232979722e228e15fb3e2048b8cc271b021726"), ( + "8509921c8c87eeddba208836e3a70d570b39d14d8fc89a0cd988ace585a3ea2d", + "1970a24152128fd6c74ed49315ff705d5af4a58b4dac87d8c82f9be6a6d77507"), ( + "f0591ba2f822317b6d5d8b771474ae9518e4d36518469965d83d84d5795ea513", + "1d78b5d07a822537a1bd8e8a2fe2fa9acd4d858aae251f5e33e57d1f7c462300"), ( + "a302906a3fbf5dd8753edad674bc00b9397d1a5bc3dd1d229359044ffa346b0b", + "de7690a0fceb4c071f52a09a1fe3e872a74a33c698792a0c30e26fbc8d8b4d20"), ( + "6b425f3cfd5f66616556d9e16698fa1d2cb2e6ea6149b75089c0c403d52bbf07", + "3254d4f64d9fd0ab8269bff02865dc115841f1717ca4408c8fd21830deba4900"), ( + "570a3f9bb4a293fde27fd13f1407a0aef5c1e1025e2417af400d5c40a043222a", + "f3d481d495572a89216be3bf4d3ba719d2c81f59f67ff825f2ac0bed67ab2a11"), ( + "d2a4336cfe79faa8695f88d74b7786ef418bac6021a9c4ba1c3db8e433fda122", + "618888220de5b3f2eb1470ea0ab8188d5385b21e1eef64a691b2f31d066be12d"), ( + "5e9db678cd1dfd7e0c598236d25f27b34139e26e5b15b032a68de05b0e394e28", + "4f2379dc6a1212d0b7029dc3248d0546d003edc23329c848ea62442e3b2a280a"), ( + "042dbc17ec31dbd098c87c98fa9cd5d8ce7716045ef9d93aab3c9d6bf6f86e21", + "d30841c4768e3b902d9def72131244717d2a0341540e71b51321aabe81cbcb08"), ( + "c5cda9e62ddff24a2f14c8ec8ffd7746e230b3023bc2f87353a6eba7d1e55f1f", + "d6252a48c7baa1b9194d0d12a8a07b97f2b624234b48f5eace2d1adc958a8118"), ( + "b751b8e0c753c8dd5a07293c0dcc51448a49be3cfad6c8d3fcb8e15703a1f402", + "297af6aed5d949eb9ca3ce7f0f16ab270fd509ca350376cecb844fc55606f523"), ( + "2c72a6ac20aa6c8ad2500bab50c90fa8c5b2150a17d3f1d249faf29dc48ee81a", + "c05528b87b7d9b7f1c96937116cb5b6c1d66fdd7678332e257d95601e98bf108"), ( + "843a2f33499e417fb3370d2b35170dfd89ae3d7296bc2552611a1f04542f2b15", + "85f5166a1b5c384f6bc9f59e779c9f866c4a4d00443372cd433b5096a7a77e08"), ( + "329f698e99433a9acfe5bde3662d8e2c05b5b68024d29af1a59eb63d3722e40c", + "910b67959ff965ae27ae8679e07bc2dfd3b6f567bdf74f07b7dc3b055d883430"), ( + "2e00f33354bcace1c798690fdae14a40b8b0d5d922c5e7d9b8a7bb17ec72a40e", + "4b50726e2c50f4e404bbc39eea2a8fd711a6cbd194489c4bedce99f32cebb81e"), ( + "73c09da2c4cd22b3890ada1d6045a6877d558ea5c3a7088fcdd3b77b229b7620", + "f500793aaae728efa2029825185175fffc286159319347d10586b8a1de01b613"), ( + "25c8efe9ff791b4a0f4478a6dda0867d8df396aa51044c6d6b1ed9427d117c20", + "eb57c5d562ee43c72d8972ae0e8c170b3a7f0e4c89ba67e82186229adb904706"), ( + "863f44e00121079c54d36d7cccc1da51ff5900610386fdb8bc36b3a47483d72e", + "c30fd9b1b05ac1a347f432d65b68c82476b4ec0994fa00cfd90f1f7db1571d2c"), ( + "6a7311e3f18945a8709eb5e90021a8139375b5b68af6c9cad121615a80ee3f07", + "1a3d8faa7c7d38d5acb627def5b070d8f5719189f7a25e3861c0a9a879cc611c"), ( + "97d27ce44b476664863f34a2073278dd5ef1c8623771a9813fedc3a1455ce92f", + "9fc429eafee88fad27dd8a0b05087a9282c926353152c8174e774f34128a7d13"), ( + "a88ab45b5ea8cd975399fa39d3ea5b04b12adc705732b54ba6e5af494863c310", + "2429cf8b01347e32d2774cc4070928d7ff96ff585e6f39e0a2e06fabce53c81c"), ( + "51eba466f4662972616dfc4fe846425b245ca1405730b6809882f51f413b8526", + "f9112ddb4c80bb385a3938959a750e091c3bb9b6e16d717db46c28efbe273a1d"), ( + "45e9ff284aa8b4c825ebe16165953b186bbc0b62f209f84dac2eee3382a94e2b", + "d932afbbe10120b68c573e1844a4f8f87bc93ff9d359d7c15621952e4ef9821c"), ( + "d1807c403b8ed2e8022db73486ff6dd2471872404accb8208cda3d757079041c", + "7aed51eb6e3f042a32e44f7add13f9d8cc675839232323094692fa9ec0385e19"), ( + "b9c93861237f423f8cb2e96e3a92ba986f290f3852475d9b62cb21a445cdc201", + "e25ae2bb31b01d5d80186f906af11d4c7a6ed172a5aefbabe3b3eeece6750816"), ( + "558ad70ccba7882b6f20cd8098f52b8288afdee8b346bf4db33b5deb8153c71a", + "c651377b6f9deb188dfc868df0157ee50dd5f9f7d92ca0e69e82f03355af9821"), ( + "b6e4ff38fc18fcb2ca63486314db80183b35f1dc8082e8dffae0726a1c284c25", + "2eedb645aa09985bf178bbc4c5417f8c1a9907440066096111292f2e72e9a01b"), ( + "c264ab7d9008339abbc1be91bb96eed30cc5d051d8833a3f5cc94674fccd8627", + "8fd732c230f79e11d56d8f7cacd5f7095e4ad1a80a3c79b1cf42d9733001fe2b"), ( + "8b29b2811047827f356a57f7166f8b3dd4a3aac23b02522daf007c677295801a", + "e4b4d00d5d3eeb087c2edfdede5eb92ad39974c359172913abc78e5a5c78ff13"), ( + "30be5db463aef5665c8699f2e5fc69ea2ca209290771e2aaac3b60caee6cf22e", + "3c5e974d664c03b13adbe5ebcf9b03491ed0e4c50095297d7b3115804274d70e"), ( + "db16b337102ce1b0932fe6e841fc1e7c01473ed4f3765934f2275b821d5b5d2d", + "dbcb04a56099034b4eddf402c08810f5842a74d5312cd5fd86d9378a2da54323"), ( + "6f75a23af554d0b3f5ee5a48b5ec1ad8fe9a6f7c2c64b9e44bd9deb644212e17", + "68cebf8d52280b6484bd14f9b6bdbf89a485fc6f6129f49494bd7c1b40c90624"), ( + "e3d00baa245cb4f99dcc282cb33121dfa42c3ae1524139c5be17a043cdf65a28", + "5710f34c928c76f21871bcb63731f3417f1056437397b083d095e7fd3f49790f"), ( + "f382f322140415ed6692583c594e8d8fc5bea0f027a159ad01df4a3942771100", + "4bfb6da22da207b0935868b7ac4574bea7f3358f4a281837e56b1fa3147cb40f"), ( + "33e74fde6f16209c57b24d496fc87ce2270dd2f3b04a9a5a701ec743ed9e1d04", + "e1e847e1ba408253c0539af6a7ff0a8700802ac26f8f7aa68906471613f8371f"), ( + "3e4b5dc67f25293d3c432cfe6e37ac7905ae19e62c7836c8e1a05b5822ad432c", + "c978a79b21c177d102af936de352d5fb2862396157628c8c53b259eaadd60303"), ( + "1468956b2009da0abc540721681516d2d836fbb19692276d07345b6706a53129", + "eef70d99244f8e5de8c938b56d3079990652e399edf4996c7ba3090bd20e652a"), ( + "c641b2667bc124b26572f9fbbec9ecf839db74c9edec9a75168579b71cbb9901", + "83b957a57b5ecacc1a4b0231795be7013e488ab0ba2e7cb4122152aa2a14ba18"), ( + "5bc5c3903a9a19dd230310422c11dc42c590c949580f37dedc6bfb528be5c62f", + "5e2dcafd8d018dd8d3ad1e5a7adf58605cd8628dadd96ee48f32bc0f8c4be41b"), ( + "9766e135d8b9aa253c90202454fa824b03b9d2d25e0b6c18cd99d87cb328590e", + "d3f8885f3dfa8a0416937ef89f89d2ee7df9e71852f09f812ac6d7934fccb60d"), ( + "feb64610db2ac2f01869a198f5a3fc524d6cf0bd171f118bd291c50db1d54a1c", + "3e27cd9b28b288fb3d1953a7355c986c88428a0a95b56ee39f7e5aeb0bbfdb0f"), ( + "571bf13dc817ae45281208cf712cee1917900e203be6d617984bb493e0c24c25", + "132f0e795cb6f5127e9fbaff53b28e4baf05df08b92dcbdc05d8ea2638d9e70c"), ( + "fb649a934864788acacdfa654bc262cb71af2842f0e0b65054f37e8bc5332d08", + "67a5a6e195a43d1492461d65ac8dd2b254b1467bfe85342cec8fe6ae9892ca1e"), ( + "bd6d4da3fcb81b710dbba70051fe8d565c47419517fea3d20639667edb415413", + "07fc16e5a1523005ca08be860c4dc58413b773c1c15f9079c6d373f9e2f93228"), ( + "e49799e28327a6e8f4a1d1ad7290345a37a263284517b094d325e7e17593971d", + "641a4439c23e414ef21dd7a563cd75f533a3e26b1e11f5d207d29629d5c4d416"), ( + "c0ba522a52198ab0a79d935b17eb57611d141f0ac3864e2a37439e4996591e24", + "78fe086005cd3baaa5315cd138530ef4d7f6febc6e427cd71625329c56419312"), ( + "871ee440ba18913aeec0d7fac20c9671e4ceba8e1cde2dc74e2636ca57de6922", + "9d2e7c22c6b8b723b06e5960c92b1a7e6cc4cd11619ec7f21b7c1543103aae2a"), ( + "ab5a1272cd4e16be953511a5c5ef9ea24f0072f8bd976314d260757ed0b30c12", + "ebfc21341bfde18f6f7fe1b883d83b43278a635b5d699525aeaa2eec2aba211e"), ( + "2c9e91994096c903e90144689053f6f3d9645bc6e11ce48e82facfb03551c41b", + "f9cb618cc78c0e630f3035da914c8606ac1b6629657210308509cf6724748300"), ( + "ba41a3b75d7fdd1962feddb3ebabfb1ed01480334dd3bcae3e45f80db0353123", + "39eecd2d4a751206f4aeed3dba6d9acc0aefddba1897eb91731f767ed94cfd07"), ( + "ccf1feef0bca203265ffda1e22d88c7d23db4244658f8b3629cc1c7bec17fe02", + "093c3209e63e409899050e2b2e17b6397a9e6c9f267056b1300814d9bfadf80c"), ( + "7c2f59be680d820f1fdd4b95982b31931cf3d218088e36f1400d07089f1c2211", + "67eb216710fae6f8cdc776e8edbe6adedb670d2ae92a399e80d35ed1dd82de16"), ( + "94063e3fa709f74b22761cbc400d3b7971b0e32d75de9618c11caa06c6d0c012", + "c2eefc502f09e9098c554d7db21cc4ebe3432baed062fb7f1a70d3ea76044d18"), ( + "bd8a78715e32d4d7b263b2f358509157a8f1488a48860cb4dae04501e5040926", + "f9dac2ab11885c3478469582ec619714623485572a65839aa6a6254c7fbfc914"), ( + "c742d8f410f594be95b9c70f30ab2b3c752388f5d5c139653e3e1f46a3ea1c2a", + "39a28b57b0341b76c9a6d8d4502702aa79f03b6b4c71b4a8b16ee73289f9a405"), ( + "b74ce76b34b4e0bea87c576b4185f6e0e2fe60a1ee29a7be6685ab06f84b340d", + "fabe6f436f34a98de98776d7170a537afdc4e697933ef83f3ee083619eb6550b"), ( + "89f3b3d0a0563fdb52d340d60bd4a94acb8e9fcb1a078b3784f5d5dd0a76bc2f", + "54e5e2dc8bee937a903dbb41fda7d26855d1a852c10f86e60fadae5284a2d82c"), ( + "6a2b21264c42a6fe6968eb4d9539f7d3bd02b0598c58c2a4e709249016720b0d", + "a02038d629f056214390c7c3d07b29d9fd2187e671bf68edfc4c4e6d215e2a1d"), ( + "a7f518c047cb8af54cbab674f684d2114517a5ece15b38511333fe60fa75b10a", + "e092a4f17f93aabe3b062cd0a41321a3cef624c1b6cfd943d3a5f1834cb2ae03")] + + # StaticGroupMerkleRoot is the root of the Merkle tree constructed from the StaticGroupKeys above + # only identity commitments are used for the Merkle tree construction + # the root is created locally, using createMembershipList proc from waku_rln_relay_utils module, and the result is hardcoded in here + StaticGroupMerkleRoot* = "805be2ac92bc8b21bf093440f5a8055a8a4ec7bf5c5af5e22680d9123a4a5c2b" + +const EpochUnitSeconds* = float64(10) # the rln-relay epoch length in seconds +const MaxClockGapSeconds* = 20.0 # the maximum clock difference between peers in seconds + +# maximum allowed gap between the epochs of messages' RateLimitProofs +const MaxEpochGap* = int64(MaxClockGapSeconds/EpochUnitSeconds) \ No newline at end of file diff --git a/waku/v2/protocol/waku_rln_relay/waku_rln_relay_metrics.nim b/waku/v2/protocol/waku_rln_relay/waku_rln_relay_metrics.nim new file mode 100644 index 000000000..546e661b8 --- /dev/null +++ b/waku/v2/protocol/waku_rln_relay/waku_rln_relay_metrics.nim @@ -0,0 +1,33 @@ +import + metrics, + waku_rln_relay_constants + +export metrics + +func generateBucketsForHistogram*(length: int): seq[float64] = + ## Generate a custom set of 5 buckets for a given length + let numberOfBuckets = 5 + let stepSize = length / numberOfBuckets + var buckets: seq[float64] + for i in 1..numberOfBuckets: + buckets.add(stepSize * i.toFloat()) + return buckets + +declarePublicCounter(waku_rln_messages_total, "number of messages published on the rln content topic") +declarePublicCounter(waku_rln_spam_messages_total, "number of spam messages detected") +declarePublicCounter(waku_rln_invalid_messages_total, "number of invalid messages detected", ["type"]) +# This metric will be useful in detecting the index of the root in the acceptable window of roots +declarePublicHistogram(identifier = waku_rln_valid_messages_total, + help = "number of valid messages with their roots tracked", + buckets = generateBucketsForHistogram(AcceptableRootWindowSize)) +declarePublicCounter(waku_rln_errors_total, "number of errors detected while operating the rln relay", ["type"]) +declarePublicCounter(waku_rln_proof_verification_total, "number of times the rln proofs are verified") + +# Timing metrics +declarePublicGauge(waku_rln_proof_verification_duration_seconds, "time taken to verify a proof") +declarePublicGauge(waku_rln_relay_mounting_duration_seconds, "time taken to mount the waku rln relay") +declarePublicGauge(waku_rln_proof_generation_duration_seconds, "time taken to generate a proof") +declarePublicGauge(waku_rln_registration_duration_seconds, "time taken to register to a rln membership set") +declarePublicGauge(waku_rln_instance_creation_duration_seconds, "time taken to create an rln instance") +declarePublicGauge(waku_rln_membership_insertion_duration_seconds, "time taken to insert a new member into the local merkle tree") +declarePublicGauge(waku_rln_membership_credentials_import_duration_seconds, "time taken to import membership credentials") diff --git a/waku/v2/protocol/waku_rln_relay/waku_rln_relay_types.nim b/waku/v2/protocol/waku_rln_relay/waku_rln_relay_types.nim index f79717324..9cec9f439 100644 --- a/waku/v2/protocol/waku_rln_relay/waku_rln_relay_types.nim +++ b/waku/v2/protocol/waku_rln_relay/waku_rln_relay_types.nim @@ -7,10 +7,9 @@ import eth/keys, libp2p/protobuf/minprotobuf, stew/arrayops, + waku_rln_relay_constants, ../../utils/protobuf -const AcceptableRootWindowSize* = 5 - when defined(rln) or (not defined(rln) and not defined(rlnzerokit)): ## Bn256 and RLN are Nim wrappers for the data types used in ## the rln library https://github.com/kilic/rln/blob/3bbec368a4adc68cd5f9bfae80b17e1bbb4ef373/src/ffi.rs @@ -154,463 +153,6 @@ when defined(rlnzerokit): type MessageValidationResult* {.pure.} = enum Valid, Invalid, Spam -# RLN membership key and index files path -const - RLN_CREDENTIALS_FILENAME* = "rlnCredentials.txt" - -# inputs of the membership contract constructor -# TODO may be able to make these constants private and put them inside the waku_rln_relay_utils -const - MEMBERSHIP_FEE* = 1000000000000000.u256 - # the current implementation of the rln lib supports a circuit for Merkle tree with depth 20 - MERKLE_TREE_DEPTH* = 20 - # TODO the ETH_CLIENT should be an input to the rln-relay, though hardcoded for now - # the current address is the address of ganache-cli when run locally - ETH_CLIENT* = "ws://127.0.0.1:8540" - -const - # the size of poseidon hash output in bits - HASH_BIT_SIZE* = 256 - # the size of poseidon hash output as the number hex digits - HASH_HEX_SIZE* = int(HASH_BIT_SIZE/4) - -when defined(rlnzerokit): - const - # The relative folder where the circuit, proving and verification key for RLN can be found - # Note that resources has to be compiled with respect to the above MERKLE_TREE_DEPTH - RLN_RESOURCE_FOLDER* = "vendor/zerokit/rln/resources/tree_height_" & $MERKLE_TREE_DEPTH & "/" - -# temporary variables to test waku-rln-relay performance in the static group mode -const - STATIC_GROUP_SIZE* = 100 - # STATIC_GROUP_KEYS is a static list of 100 membership keys in the form of (identity key, identity commitment) - # keys are created locally, using createMembershipList proc from waku_rln_relay_utils module, and the results are hardcoded in here - # this list is temporary and is created to test the performance of waku-rln-relay for the static groups - # in the later versions, this static hardcoded group will be replaced with a dynamic one - -when defined(rln): - const - STATIC_GROUP_KEYS* = @[("e9a4d05b1f539d65c59015a079ee89aabeafbcfc9734342d9559f81601e85417", - "b74d3a5b3200ab1126fbee393496f33da497d4d9a7c56693f44d6155c0c34e13"), ( - "27b2bfc25257e53819beaf36ce1070007e04e7aad2e440a1f1fc066f59a61123", - "522ce51aff96041e79a8476f508fb9661f146f189e288f83cb4837517cfc0127"), ( - "66392eaae6674267c55fe393d39443ba90317a709d6e8f92a9f3e4abc18eff1d", - "e3dc235e48c1811943fc249fecd0f1415a50ebe839ccefb0bd820a76fb77ba2a"), ( - "e7462eebb81405230db8014b052d65fe7b269c3870e40b12cf64668ed6c2d40e", - "727df0965e34144ea637be18208cc81e57e423010b3159c20f0ccff45c42212a"), ( - "1ad8528b4c7075013a2d6561a02517b0482c0733dc018ac68774db857deb5004", - "5df3a77577135784da2a9ee78f5026092b7d6bb9e6e95882d6cb172c0cb62208"), ( - "aa0ff53bfc50861f871d94df18c3ac0b97f44ceb13436b33490cec5f6ce8e700", - "30421d05b905aeaec0473ba29ace034bf73c406866d7dc23007eb9c34a596827"), ( - "0448c0a6ed57b177c4c45de478b58d29f24e7ea842814305443e87188ae24324", - "5ea1a704d8972af5a028367c8e3fb48ee61a603c6ea3a4c9247b0f611a6ab002"), ( - "4b6a6edbdd11e69befe3f4a3c976baca320c4bcb188f129b603ebb198f663000", - "451d6185e8ad2c8873f034683b9caca43ea7ceb1b839abd3e01c3f19f3e6bd1e"), ( - "c3fba34855b33f025696326d2980ddc3fb47d90459ed6a4488fbb2e4e12ccf2b", - "74674a86144ea866ad8fe633e256783bda4a07b997cb412c53a5eaf4cc7b6a0e"), ( - "0c35b8b94a720f1c26d7c6241c9f3ea5332a87cf3730b25ef31b68854c10e405", - "6915df8d8ad19ec17be37c299eed762f9b63e841cd7963e13e8db6890dba082d"), ( - "a60b021677da95ba46c8c3411ac77f3e3b06937a8d189517111c045880029909", - "bbfcd22ecb44cec6fd0717cd0f21b26e6e8b2c91e1a6cb5d8610e2f2ad41c90f"), ( - "2f4d662e66fbe754b708b87ea3d75a01d2ea4d7bf33c615c2376211dcc3b560f", - "c67f7e622c3293028b9f86571e82c49551eb5fd308a35eb663498cffac208810"), ( - "d90a1afa96c14c8d3b989a9cf23d6e8b9907da42724e44a3ac74ae015b6ce22e", - "f0795b1bdd0a907252b6ab047642d97be076a16ea69d463f1a4bec00c817202e"), ( - "dfa0764d89c8da10777504e5274f1baccf8b4145deba72b26503474318fb6410", - "9f8aa8e833ea2f13cccfb6d9f2f04fd7be9c9f3019540c05c1986b3bce254e25"), ( - "e17490013b6b53a40964ff1067b922d4d73521e32fe394527b39c1bfd4a5e712", - "7a8fa23a0e4b14a36f2818a7d98639f6e4934c028da780a6cc658fbf76e80a26"), ( - "7a9328d1075373dddb1b1100e8217ffaa1f9b632911b95a8fdc08870b15a8410", - "94b2ae70c046b94873098c19fe18e7b17db2d31fe6a7eb73fea8168395e3c122"), ( - "ce319bb1447da5bf51a88ab3379dbea539b5a431d3c4f131048cf7b05c52161d", - "cdfa264ab8a51bbc9fff5732cf544bb06abba7e807a8c252a5f9ce785c6ff22c"), ( - "d3818503bfcbef9ca03fc4472be77cb4936a1720001fc5e54852f769448fd313", - "e72792abd906976c75a5670de514894a720c5293cf74338a9c2987640a949c0b"), ( - "4f9b8d118460736eb62602d12d3aed62938d4d4374b8c88704cf40c415c0901e", - "2ecbe4588ade31924a1053fe0204950a0b4924878b312e56b2d0522f92a5f01c"), ( - "39b59fd96adaf9633edcc8cef10049cddf5f7df8ac80af8aafa436d62ee7f905", - "b94f7a979df8a95fc2766a9a96308ff39a14daf7b7d6bc48591d2ea4c764bf00"), ( - "73cb0d25995d182b361c8237852bafeab8bb951de99f730da2913a239400c322", - "da04e6e4446b6bcd54667b741444d826abbc5b76572d28474dfa94db91144606"), ( - "2753423b83bba5bb8b2799bc58125c46fb03ec05e8579d772cdc6e75b0875009", - "ee040010ec20e7293431a3692d06416f71162d176a316b0329a76edf6f3fb30d"), ( - "cb73ec9b67355ce6275b51144a0759de28bb9390aab20514ee49a3bd8ce5361b", - "c7c6e2ad3efe1f03b398241bddb67b008dd5e8caf1a17db9c33d2e2388d58e0d"), ( - "bdb386d9f3fe5613ede926d80246682a5d32392f7f6c9d818a80d8e7a12e371b", - "21d48c74f422ef72cb9db18799916b3c11d0cb99cec808563e2db22047840902"), ( - "60f2fcfe341034449046c1fa330f6aceff737a9837a7d6d3a4885f8afce4a809", - "e4c8f26f9e4127511b5ab21f1705913d7beaa2767cb7d033564e36bd2693370c"), ( - "1223d64fb5c44921c1ae66d91543780634c2f7bae7e184e09c4e5447e6d1180b", - "290ab84714fc3534c5ba22b2aa7696ac03ed12c9cf1c409a777bac05475ea406"), ( - "b79c593316c42280d316bb7f3b43c7a5f5e29786d1ca6c0424463470eefe2b2f", - "f4e44ac9574c4d32ab403e71dd00554eee0d8e34d04611b66ab2e59c49bff025"), ( - "e6548f669ebe655cb6600432e1af14c43da7286e3620289b51cc947517db9c14", - "ace261e3964a1dcb389a693f52104018cd475e6856ae37fe4892df9482954902"), ( - "81be54409c9364f4842209e0f79b190afd9df017cc9790e11196d4bf5108f100", - "d986b22e422703e065f12b6fd608813028ff913d4ffeb54b19e6537456391b23"), ( - "940ff0d3b4549d1baf7ad900cf6aedde02833b777e39c411e6efe7bcdd2ef305", - "d672bb8a6e75b47fdbb365de0516f3fa827b287c9666e64d1b6768e2c8949412"), ( - "b4fe300aa1c8c836b3cc4c167df86d08fb7213200b8d9f7ba7963170e6dc8c0a", - "5f7db6a9867f3f5c9fd1955c02cf96056d1225be950cd432818f8f1c16152020"), ( - "2c34a2bdb3738cb78270207dcae40ae47178bf4216bd2044ba124ec49240522a", - "8c490c78d7d735ab32493510cc2ec9c3742d3f47e46cfd754859e91271673e15"), ( - "fc03857a3ff92d17d40bf9bb9b99e01e85fe4c698450147dc74cde60b2e9fa2d", - "c0a22acdababbc42bba5bc0245a2ef9f2c74b215663440aed37c8e0bd7e00809"), ( - "a267a96a35c63b03788e90bb9a440da9ac832b0be02537b6f0ecc928ea989223", - "636ceacda5bce999ca303b7df32e9352af10083c6db6ed93c8a221efc385172d"), ( - "ce4e15a2c1667a9dac4c4732de6c91f8c523c449f8c9be6b895644460717a209", - "d55c6523f40b36d2519b30292873bd469aeda6dbdbafe7c5fd405438dcc6bd12"), ( - "4c617cdea4e3cb008c396c59b701375409304d84cfa17fe9d6d91a15fa412306", - "a6dc21a9c35418a39c69f2d8e9df738db0b36fecc44eddf364846b84c5362819"), ( - "8c33aa2b3d94f9b11cc62ed1a304b92be370384ebbbf67c886dcd6ce544cc806", - "7caca2b1ab8c70b58ba36794a988fd6ec50c2a04dd09d7cd28e67ca1f1401d2c"), ( - "1b6fc8f4007e6cdcf89a496cf0e711b0a3bbdbbae66830450a9744f5c802a228", - "c3b79478bd32feb99a0c92001efb97953efdad8c2338ed2ac14a313592c12418"), ( - "0c6837e83ee0f1b1e5fe31bdf0960aefa2162ef7de7c0c886df930839bd4db06", - "8b2667b5151ab13f0f87fb014cd3ebb7ab1e92a528f00ebd91b514ea61b8f52b"), ( - "8da38060963597c34544d8b10432a2e34d8eada7d1479f4fa5e96dca32250c27", - "7bf525115a8e6f772feb6d4db0f2a6b0d4233e0ff85e180c3249e18f0d08f42e"), ( - "50b0c6d85f6a9d11fc52f1fc9e43b778380bdf936ddfd293940c77e79bc8340d", - "bbb9e297de81ef341e032484d7b33b29e7d9e3be1414feaf2bbc0957ba408811"), ( - "6e8fd3ad20cf32ff8ba6e4bd8d4f05f3cc20d88631cbd3aa5f7f98446d725108", - "a9fe7404613b040412049a205301f2175b53d7012087047a8dc7501a381f5210"), ( - "c291bb32d69cfef7e80b6dadd2a1198d05ac23eb30be6503d1c4c04350de2028", - "f44f8ca09d849551f72a6692c793319eefaa0c02d3301ae79c2f869f4251d422"), ( - "116d4c2e21101f819a87f0de31dec56a4649c9ad9e539b71680dd439b288681d", - "9f4df65e05390be63bd6e3e38d8afb6117d5d357d56f35ecf63406096fdd810c"), ( - "1813ed3760299a16e623084a852de9b12caaf8138744f8903a357fa9a2dbb00c", - "f37baacccd07bc489f50b851f807c88a425e41dd9dda8068e75cffb8bf653a0f"), ( - "545e62d72cbb89db1c17e7ad8bb0660a74f8bc411b16eb0452d9a2d7c3e5b01e", - "96ddc93a86b091c7b1951d7371f80a352d85c38606e450aa2af272e8929fae19"), ( - "0f5d5941474697c21ea6aecc29ff7cadbd28dbf29531431a40aaea3b7acd1514", - "e83d0ff3ab4db81fb19c1b6125d7d2e4a34a83a8d463049d06df4870dbb2a525"), ( - "52605bc1f48092f9d5ad4c2a840a60f129e6aef2eef9c92474951ed1e10e381c", - "222df3afb8b20685c872f29ebfc7e4056fcdafe1d8a77a9f9ba08ac8f426190c"), ( - "eee8cdee57e9f11ad0174c1514bba4c3a2c2a10d099876195726217445462f0b", - "a000e5799ac933154bae228c09b522c714fb9a57f530d1954947277be9db0a24"), ( - "8c7d04dc3916370f8186dcffc92ad482294ab49c9ce36a5bd13473dc7c4d491a", - "788e35bcd82efbce15b3444f36330337ce3adb67bfc6329149cd25069ac9eb19"), ( - "004a720f9edabb7f82eb30a78da45aceccbca5eb69583e1e8018ec1359a61f27", - "e3d319d64bea8069a649acd33859b22361da799e0296f3d4f5117e16feb18e16"), ( - "38716f1d7cde7e37795a5b2d6d6317eecbf0adc6dcf7dcc6ee02cc25d1efb22f", - "95c229d0cfc1485f2be0a23de6e49601a2ea55652beead84a67cd727c21a1301"), ( - "22cac7a49e99f3d071812abb0addafa4bf9a65308769728e4cd53cc7486f6c13", - "a2e5b90606809964bc20d776b9cbcaab93a2f25124998ae3bd698d061f7afd00"), ( - "5109c7a41f73baa4787358b72ff1095439602add7a86a034b87b74360ee2e20f", - "a31b3e2033ed828b5a51b9428f8f6ea40267259df08fdcd2c0e34dd335bdf90c"), ( - "957a87470f29a135567085c3d6d6ed14885bab4eb659725534a45a9f100a471c", - "8f3005df282d5a87fa33405e35a313233d05731e87cfcbe060fa067596fa3013"), ( - "e0dad57606c2b293dc7c841c965cb29736d2411003e9284a0ae94d13e3d03d2e", - "0543643ef0b617030dcc292451ebcace8bad20706528cb6aedb98dcea66aba27"), ( - "f1f10938c8a55b6b15b3f12beebb702133401135937c5c3f2d7fba702f24da09", - "dc862a8a5ad5107421d550731a7f561e4064878c3654bf88b230cc249e91091d"), ( - "4bbc08d78c9970235778d6bd9939c7b2b1bd88b9d1cde6473663ae96ae776911", - "3584be9ce31a7fb3aae8515011f4d3eeb86a573b225a88577e4911050bc35013"), ( - "c8325b31c9295757ca23d8f5256eebc5ccc517d28e00bfda5f4d709441d66713", - "b81f360903160485c470625519cb18219b44d8b740273ef742fefc5653daf009"), ( - "69a6b3e22fbe5879efa56cdb5d50605732bf7f311e28ba037916b4db61ae8a14", - "10ddf800eb3e67da20575456150cb1f0d49506d97ed4ef2d91b951af48966924"), ( - "c2a0e3586d4bb49f2ef979686c3a9a1619d0d54ac89641d592b4628b19dee401", - "bc3ba677f6d13ef9f023d4a3b9f073c3eea910ef90cfd24b7f54414d2d02d315"), ( - "5b89051b79ff37457760d7af2ebc68be955e47eb6cdf306fbd369dc19fc52c05", - "7bfe2a9d5bb2ade0f9058ea27a07c867af21670d2b9e84bdcc8967d4cdc4ba11"), ( - "46ac45f35cbc23bf68906933ad29240054a0a1d89c1832ebb54aa1bc32644105", - "e891e783d5615a1b8ab838f68f6f2ce4e359510ddd40882d4650327d08a5bd11"), ( - "581e067b37c40caf861c190922f816e6cb850540df7ceb159f96c48c1c70cd23", - "0d49fa8c74202369c36f4121eab0aa3ac9206ad3419fc9517a88493b07d6fb25"), ( - "bb7eb4ba2b45a22e14fad963c04eadbe8e7aab6ff912b008c9e7dd2a2c7d3615", - "758ed0c8cef51f82508072fa758265f0f0eef6c7b2401b94ebe27a638ce33125"), ( - "a08f3cc9904f672b94d1f5a14dedbdef4ed229da5b66eca0135090d6f0ba0728", - "542c952395d241cfa15bd48922e9c7fc292dbdd120daa3d66dad67fb3abb700a"), ( - "105bac5c449441bd5f5cf39b431f703e2e8f6a30a90d86cfdf425ec728fdbd08", - "b59206f1d556fb98329a7111e3c89bf1e6a4861ec38c82eafa81cff70b713e0d"), ( - "45df2edfaea234dab99efa9a402c0d2feaa841ff3c990c926473173283d95913", - "db008cf922c3a50549373a14f5f18b2dc827bd6e168402dfe3e6ece4cb137527"), ( - "488dd6437c15ef5b85e84407b7e599cc078c195ed2fc27b366ddac7739f1eb14", - "0448887f55c677464e7e540adf107ba10fc6713e8a2718fe92cbd4794ef4be17"), ( - "3fe697698f3504e15eb5d509efa91624d9aa4eae24beeb42ffcb3c6ea8372a30", - "441ccb28e7c6c1893a58f7513c9b7c1c5d0adf3de452644a837d7e08e1ab8117"), ( - "9bb5801272264c74db75f1c6812747bf338ea6880fa4dd2d51ef651ef73c2e04", - "e2eefd80e838c30b3f1fb0313fcfcb1e1556439d0346d17334df83c33247b20e"), ( - "bad37a1467c4fe875b78508656f2816414ef602ae2ccd4e9430d94ca5c1cd911", - "21c72ccdbaed2e3ea9dac3881531467b64c9322199127f2ae2fa4bb31bad591d"), ( - "95c72237ccbaedc185b1abfc59059c454175df81bb3ff65e5a61e2cb5263ed0d", - "1040728a4775ac5cf7a9c75dda2f0aee1fabd6b202b5e916636e3aec73a09d0d"), ( - "738e8b9af4d199bc95f70b2a9b25e999b39af15c6a02f2eca058326078745f2a", - "004835960aa03e101d818907df453cefdfb910b44ad9bd056a83b2ef40a5ca0d"), ( - "0d88caf486f2fe60bfc08697d1b617b586ec880e38e4ff56f145a5db0ab6d12e", - "a7b19323815295bc84c50535b62c3d4d53dbfc434441eb3c009568fb8f7b2b1a"), ( - "b37af7fd314d90590fba8ebf730397cfdaa97f86d3f31d1a7ddc817ff303791f", - "8296a80eceae97f92784642da34f121e29db2c5f3baf9a2722896db22e98b703"), ( - "6b67dd3051a8cb113431f5a14e279d910b7b4798ccb03ff588cf312ffe366a0b", - "9c38cc543a0b793be4a0d66de3b2cd30b1f33d36c4402a165da924d7e6f89a12"), ( - "72fc4c40e406b9d1b34daba614460922fc53951abd6db5834e1f1b07fa319f27", - "daa4d50481ba47c4a78ae3848a9b268b1d8e0579b4967ebcdece47d386410d02"), ( - "a4ce5cb2b2a23dcf019f275058a4092901c4793e6ee7d29282e755dd0d0df000", - "00749453d23051f3587911c34d52e2c2d093273d2283cd6dfba94d7a89cdb226"), ( - "9e00df0216e8ac8e72abfeab1106373a13699714c691f04a549f6b58ea974521", - "0e69dbfd9023b8bb58ce7e17972d7c94d49e8464f9c22161d7564ed32c53ef27"), ( - "fe1a558c6315f425fea7c04dcf6db869acd7b62b1b848200d5709e73d53de71b", - "66cd33cc8d61cb807092d76ac0e506014fc55624a39ee2afa67f9ba58eb21022"), ( - "3ca542e17e4cbc74f47afb399b12295d15dfbae5e966509b7e6cae2df61a430a", - "57a0df429ed3720dee61ca720a4617243b41472f0c7766cc7ce625afddb3b41b"), ( - "c1a77855e9b0b1f7381c9acd69ff68fdfa65f1f753dcea22de5a28ed088c2b2e", - "4fce521d725abb8a30d8c39a2a22f496b374d8512b7a76afd3803f7200c86d19"), ( - "17cda8d590adf3042bbf1452fe3d79b959f284f3df1e15ee3c696286f0ba832e", - "8919e92a175b55003379ca6e546a04228aa9da861a9669e0e9b106e4a204d404"), ( - "959fa9337b4b479ce5fcff7ff9096a344acf7fcde2f8852e28904236472f2f02", - "79e688ecfece239223b745e4b95460bfcb02aee12b154e15db616fda857dcd06"), ( - "d062d34cbdfbc50004a631e3dd8f21b446673b53830aa71fdcbc741e7d4fb31c", - "2203af0127657f4e8a1c5ec44bb25028e64ad388efd0b9bfe2105f4f3ff66d0f"), ( - "d2d3e3034864944914709549ce27068b5f27bd18b0edc940593df2dc5c5dae23", - "5ae75206bfdc8f54a8673d5d4c4b464ba1e84ae2410418b5c5e98fa993608113"), ( - "4ab457d6478fb27214345f0bc2e00cbb29cd55bed1f8e05c23b8f7810e134a1f", - "3db37711e355ed46ea81bb6e31ae87b37b706a8d17e2aa976c7c7706c8e18d19"), ( - "5aa17884c96ecdaf81e2b343dbf051e4ace41935e53378ac10a4387e2cb0c404", - "7118986268a748881f6144fc1008e90b40afc702be53784ed4cbceb8606e0714"), ( - "82f4ca6b751ac067e451ae1d5115806e7a1d14ab444084a8ac48046b88b43b30", - "8a09186c2a5cb0f16e273be6a8710620006a77afe7c54149bea3dce906345a02"), ( - "55d5d97de81e0cc4d2ac97e507d4d6d9874cb55e1522b89ed2050ff3c20a4912", - "27facefe4e2041e11a21889205af6c11eba73e3e8779b801bf3f7253730f1d04"), ( - "845177f4584f61071ddea21e9a6c0a17e1a9408e0c073047c339498ff383c109", - "25bc572d1c861fe80156c2fd440e7d9110be8252723d276e806dcc012f8da103"), ( - "ecec46dfdaf45f49f82ee78fd9c8c747c049de9becaf440f90391c04dd119002", - "b922e1a7caf72db69dcc062424c7ce75728d010c4c201c2ed8e635a617c81a1f"), ( - "8e265fd9f2a4b158a5eb4bda000a6124af909e118b7510f0ec418559aad85825", - "aed92a21e9933bd2ce6c9f09bb7753b46ea31248b324c12726cff08e464bdd0c"), ( - "99d7181572d3ae637a277dcc0c35b9b98bbb6ecf3cdcc69af3e946a5bfeb520f", - "89217b554371a2495ee473f867b2e26ea70d4245aceb462a98dd31a37d2d5330"), ( - "a5e1fd149ae27f34e7902ebf380277c0b7f09f37e8809d25a0b8df2965d24e29", - "2d6a16a254cfc3894d5500f8c40feb1e84876bc51c68c381109e83f001b41c2f"), ( - "7fd221da235bb6e5fd0ae047f1aa49615ddbeecfb71ccb976bf3e0534425661c", - "9ea41ccc3e09572927b0d9f618e1135d384f33618b6a0f80002f0a70be5eb324"), ( - "b125c1b45daa68f96be6a5b3e4dd24e4a0e49e46226d841eb73754a498c43b21", - "360b9c39d25451ae58cf651c530155f91e324292b55475a92506de726f153c18"), ( - "d64536234849ababefa90b84f7b7cacf4b073809aa9b0c35581426521f18d81a", - "d2dae030312cd4325bb036aa3436b26b9bed69b4d78d68bd49dbdde3173f1510"), ( - "d1ce3aea6cfb7be132d17e8d76fcbe4b7e34cef3979b4b905acfeff2f6d19724", - "be47b76297791f535f4b56f973a19f07ec22d4eede2a41ff23c696089938bb21")] - - # STATIC_GROUP_MERKLE_ROOT is the root of the Merkle tree constructed from the STATIC_GROUP_KEYS above - # only identity commitments are used for the Merkle tree construction - # the root is created locally, using createMembershipList proc from waku_rln_relay_utils module, and the result is hardcoded in here - STATIC_GROUP_MERKLE_ROOT* = "a1877a553eff12e1b21632a0545a916a5c5b8060ad7cc6c69956741134397b2d" - - -when defined(rlnzerokit): - const - STATIC_GROUP_KEYS* = @[("c12d11c3b8ee882559ef48f7a42633d81b1e13fc589e6caca028281a1098012c", - "b3ec8a9138817be401b9ed2c683f6969d87f70ad87cbc514dee24146a542a71c"), ( - "1a19a8d1709ffa10882673962fa4b6fcecdd2ae3c95f9cc2db294633fd775109", - "eb599e4681f8fd50730d22d2b0d0e9e4efcc659d2d310bd6cb3ff5600a81300e"), ( - "6317e72b74ad1395ce77777bcde06b7b5dd02ca69ad6fdc7affeb3bf4d6d1c13", - "151a533bc8927e97be9ba2173644282e3aeada4f9a65c4cc72eda27f3ba10c11"), ( - "d5d375f61fc9f9b4702aee9473ce304abca838d224dbc0dcfabffa0e3d04452f", - "f538609579c413bca2d395a772b026498eba0c00a1cdd5f7127d526bd96da723"), ( - "f47b36d2df712cb16eb21797c2d0672e12a60e0a7807edcfb15e7213f072a20c", - "d4d12cce11c6d8311c15353d35926f298b886ac66cf6420c47ad178231632608"), ( - "3a8360de57f4ab8cad701459a73019c71b0d84927dcec0384bafb2586356080d", - "08a8b713036264b878bdb8051cd6a6ccc9acf9e094daff690d167e699a90c628"), ( - "661b5eb69735c9e8a181bcbf34563b96aff763d4996d60ef88c439e82549b622", - "c1fffac2bc6d8b78eb24ba052d72bb88fe5cdb40e86eb3ebadbd57aff47b1e2c"), ( - "79fe1ac6ee536412d737091c7e53f003cfd4e4d1a96b1ebc1d27faff4527101c", - "ae1b33ed18cb164c4b3227d8acaf75eb480a58c07d04792361d3e7688437572e"), ( - "88f35905877c4417d418a75994eb2ccf7da052b1032bae782c935b107bcaf12e", - "0e3cf8fee2c863470dfefabea0162e98a3cb0b5aed1387d9aa2990710ae6b705"), ( - "771b20194afc2d043d133213a39c99f88a50f6459eb7bb7a8b19cd468fdace1a", - "408f8624260e2a85ea354959cff0e7550d89ba666e4a5d646fe1ab8a9b253d2f"), ( - "1e40c14bbe937cc3baac06f4b9c1e9d15374064a12462a505ee3c85b59e12d20", - "c5ea8270d54c3919ffc5659bef2b4f00f55a9b7e8a655875ca864837cf66561f"), ( - "23dae2b032cf45c17378778786b91fe53c7aad7928391c5c4613b5683ef22c16", - "9f6e20cc9f6df9e64cabcbb765c92faabe25257d92a00f746d13cf1e5f113f1f"), ( - "f3213ee18ebd73ee5813ef6267d54e0af7bff2a62ebd329adfe41a42e1d7451c", - "839c3c58a2ecc4c181b8f298ce6aaeeace4e0777e8774cc1fbc4279c3e001724"), ( - "f96996f6df01ebe12b75f96ec634458e5e96d8bc9b2983b211d943d8093d0b0b", - "8ce6a29f023aa78d5a4de75b3e12c3cc673bba9dcafd5a2968f4a1b9707c5b11"), ( - "c9d5403ed3ee20b29cb49c16312464a52109c553cb7c3e2e760488bc1f4f1b1b", - "96a4069fa8485b11c9fcd9502c384caa6a1db2a90d45559a2aba51d5ea21782b"), ( - "3de4f01667d317d52e2718926646dcf559f2fb7266b6977a47401b976b457b06", - "6eff6bbee3d3bd885c7f900b362dbf245e97a523afdbb62d25eefb9afeba4c0f"), ( - "89453ee367a782654502062cba7da961d638b4160121ba0ac88abe7a2f82ee18", - "551f19081516e49a4e94dd97af53da2b35b603c321ad02d29f85b9d5ff12f802"), ( - "32c5a512efe5d41504bea17a4e3bb865c8d54e9c6732a3bce77962e52e1fc414", - "3b8dab877f10640659e99bc6dba2367664aca2f4e3f87b38ffd532f326332f12"), ( - "a74c13d3813e7452fd8680074c31dcc8d6e79e95086175205129f77f37feb129", - "c55985f3a99a3fd1a2619a54b87e433e4114f59d1a59c3a911e957790bec471e"), ( - "9b1c420aa3dc252e9f290bba21136c97d4bea618ee298a4167eeb445d3b6d517", - "66f0efae6899a6f851a2dab31df7e936238b8aba4e961c9b65c6b1d113f13e23"), ( - "d4821c14ed5e7b8f4febc8cecc26e1d0ae6fd97a7324566c06920300110de414", - "9653e0cbb946b534f0468e42bf124e5806adb4bdb93e91665610d69037b28b1d"), ( - "26c453348bae0b3398691e39d5032021c15f7fcf8efb5666f2ffb3bf0c609804", - "a366c39b7cfd462063aa394c31642d36cd3ea5fe89ed0d7db423f2791cf74429"), ( - "4a50a8c66d78ea1850ef9e6ff3d082fb6aea7a380d267b89e449826c8e7c1319", - "e353c38ea40b59565dbbdcbc03c0c9f99a017551ae912afca8d5b6cb028bbd2d"), ( - "d04788fe9a750986d14596580b48edb0415b18466872d4b431ebbe80c0276f17", - "234ecb8bd50f758f80a48484b6997b4d0a64a1f67941aca1bb31661797d63010"), ( - "c5a3e4885e1b16a26ba3d938659e6a4d37e3f66d3f4a8d82ff6e22145ea58303", - "2921633b6bc30dacadba9ee3956ec7e3024971d9db600ef99c4ffeb1ccb8e425"), ( - "485887237db885ac07ce8eaf4e881fdc3fbcd4454cf0c56f0bee6b7213de570c", - "061186e353aa3a59c4bc1d98e926c17b3450081dbcae63d2d0841a3fb3cef422"), ( - "ca0f9ff876c78957564b303c9e99598036293efe635ec29e0e4bbc59ec59d106", - "48e04ce11bf78ef28261067eec8e5a47ab8632b2d35dcf2e28d229e1e2894714"), ( - "9d7965f433303388ced9097e0563c2871c7ce0b286f108bb53e7a68f77102b24", - "b6afb6e2de8fd30417e4b8d1fe4559ec73aa9e96726d0448eef104a0f099eb2f"), ( - "db1ef92e473d8bdad5654525d9a9fd9fc0febfe7101eed67c8031d697fff5913", - "34d5b8bb8893c4f4fcf0aa4cb6bc13187bd4867bf0b4b32b57387bd371406f01"), ( - "d43e059b5a5a2cb6b4200ac3832fd4ae6a33c69bcd784eaa3e662007a43c2614", - "560683915ff850883b2344e9c64543cd40b2a544c099edb1e37932a7c21a1d12"), ( - "a1cf07a46e8696f4a6f6838d246c4e9fbfe6db33149c99fa563f233b16317e01", - "3904003e9ec020a567d23301a8f381a7395d129020ad320fb2b11f57680de027"), ( - "178c9c8612a61f62506da40443cbf6d6fccbc9406303b6f88d9536b42c506826", - "2c81906219408328fa05a005247c9baf796c459ecc3ab0e1a70195c180e47705"), ( - "f84b9362f81ec147c40f43cde64f3ce883bd80b40230c435978794b54431be1c", - "ca524f39724400999116252fdd67316cc0caf586c3ee0bd98c132ab2fdb7f30f"), ( - "a2fbcc2ebb6f728e42c2967bde68461af69c2b10c5305fd40053eb01d1db1e22", - "4ef48e82ffc90c273c6a1627eed225a1ecf5d34bfa33026758306601a08ee71e"), ( - "91a7de9363388d15501cf72449b053a036ec5fa16faddb0bfdb6aca0a0c1f409", - "fa5bc2eb977165e92a45d92d5da48e0b1e95e2d13e2d8d42dcf9e99f8761f20a"), ( - "6e2598bf6a6975a578abc5615e0791c678ff1776176a771f025c17a67777791c", - "22afc07a5715a0d1a47ba27403e83660837d2c7b9a5902c22c0fed861ff5ac14"), ( - "e788d7b78798f2edc1d5575e35dfa3c17b6c15b6642df72ea6ee28297422b011", - "ba9a4176a20d61efabf8b3a6e2197b8dcd26b0337c26b567c2fc4b3ccf67aa15"), ( - "bd13c15935c3a49b2f19058e784d3bf700f4c06c0641fa771822194e543a3200", - "1535c97c68abc851042f117cf98be4130a25a49acf5f9c910babef342db1fa1a"), ( - "7718d0013fe1be1715041b7df3372f21185821111966fc40c5c29b948fecf60f", - "e476d8441b12a235c48c24cf1a4edd1b9384c2531d70dbaeaab891aea4c39a09"), ( - "857adf44efeec3ee71001be5172f0796a56021cbc94273ae4c8a58356a0d2003", - "358eae8e81fd089c3807354d20cf1f878d39b1ce757126e787d4487af65d7821"), ( - "8dd2491ce49ef575e8e0ebfd675b6b831e8d19c90d6110ebe57a60d3a9fff622", - "88ef9b9cadb4395c03d57ca9c0a84fc76988b1285d716d4ed3a6340aa7f85a28"), ( - "95a421fd9f866bf28eae38fff084ed0d300ac08c3c020d73e6c0a432e5731313", - "d86722ca41b4dacfcf1bbcce9a232979722e228e15fb3e2048b8cc271b021726"), ( - "8509921c8c87eeddba208836e3a70d570b39d14d8fc89a0cd988ace585a3ea2d", - "1970a24152128fd6c74ed49315ff705d5af4a58b4dac87d8c82f9be6a6d77507"), ( - "f0591ba2f822317b6d5d8b771474ae9518e4d36518469965d83d84d5795ea513", - "1d78b5d07a822537a1bd8e8a2fe2fa9acd4d858aae251f5e33e57d1f7c462300"), ( - "a302906a3fbf5dd8753edad674bc00b9397d1a5bc3dd1d229359044ffa346b0b", - "de7690a0fceb4c071f52a09a1fe3e872a74a33c698792a0c30e26fbc8d8b4d20"), ( - "6b425f3cfd5f66616556d9e16698fa1d2cb2e6ea6149b75089c0c403d52bbf07", - "3254d4f64d9fd0ab8269bff02865dc115841f1717ca4408c8fd21830deba4900"), ( - "570a3f9bb4a293fde27fd13f1407a0aef5c1e1025e2417af400d5c40a043222a", - "f3d481d495572a89216be3bf4d3ba719d2c81f59f67ff825f2ac0bed67ab2a11"), ( - "d2a4336cfe79faa8695f88d74b7786ef418bac6021a9c4ba1c3db8e433fda122", - "618888220de5b3f2eb1470ea0ab8188d5385b21e1eef64a691b2f31d066be12d"), ( - "5e9db678cd1dfd7e0c598236d25f27b34139e26e5b15b032a68de05b0e394e28", - "4f2379dc6a1212d0b7029dc3248d0546d003edc23329c848ea62442e3b2a280a"), ( - "042dbc17ec31dbd098c87c98fa9cd5d8ce7716045ef9d93aab3c9d6bf6f86e21", - "d30841c4768e3b902d9def72131244717d2a0341540e71b51321aabe81cbcb08"), ( - "c5cda9e62ddff24a2f14c8ec8ffd7746e230b3023bc2f87353a6eba7d1e55f1f", - "d6252a48c7baa1b9194d0d12a8a07b97f2b624234b48f5eace2d1adc958a8118"), ( - "b751b8e0c753c8dd5a07293c0dcc51448a49be3cfad6c8d3fcb8e15703a1f402", - "297af6aed5d949eb9ca3ce7f0f16ab270fd509ca350376cecb844fc55606f523"), ( - "2c72a6ac20aa6c8ad2500bab50c90fa8c5b2150a17d3f1d249faf29dc48ee81a", - "c05528b87b7d9b7f1c96937116cb5b6c1d66fdd7678332e257d95601e98bf108"), ( - "843a2f33499e417fb3370d2b35170dfd89ae3d7296bc2552611a1f04542f2b15", - "85f5166a1b5c384f6bc9f59e779c9f866c4a4d00443372cd433b5096a7a77e08"), ( - "329f698e99433a9acfe5bde3662d8e2c05b5b68024d29af1a59eb63d3722e40c", - "910b67959ff965ae27ae8679e07bc2dfd3b6f567bdf74f07b7dc3b055d883430"), ( - "2e00f33354bcace1c798690fdae14a40b8b0d5d922c5e7d9b8a7bb17ec72a40e", - "4b50726e2c50f4e404bbc39eea2a8fd711a6cbd194489c4bedce99f32cebb81e"), ( - "73c09da2c4cd22b3890ada1d6045a6877d558ea5c3a7088fcdd3b77b229b7620", - "f500793aaae728efa2029825185175fffc286159319347d10586b8a1de01b613"), ( - "25c8efe9ff791b4a0f4478a6dda0867d8df396aa51044c6d6b1ed9427d117c20", - "eb57c5d562ee43c72d8972ae0e8c170b3a7f0e4c89ba67e82186229adb904706"), ( - "863f44e00121079c54d36d7cccc1da51ff5900610386fdb8bc36b3a47483d72e", - "c30fd9b1b05ac1a347f432d65b68c82476b4ec0994fa00cfd90f1f7db1571d2c"), ( - "6a7311e3f18945a8709eb5e90021a8139375b5b68af6c9cad121615a80ee3f07", - "1a3d8faa7c7d38d5acb627def5b070d8f5719189f7a25e3861c0a9a879cc611c"), ( - "97d27ce44b476664863f34a2073278dd5ef1c8623771a9813fedc3a1455ce92f", - "9fc429eafee88fad27dd8a0b05087a9282c926353152c8174e774f34128a7d13"), ( - "a88ab45b5ea8cd975399fa39d3ea5b04b12adc705732b54ba6e5af494863c310", - "2429cf8b01347e32d2774cc4070928d7ff96ff585e6f39e0a2e06fabce53c81c"), ( - "51eba466f4662972616dfc4fe846425b245ca1405730b6809882f51f413b8526", - "f9112ddb4c80bb385a3938959a750e091c3bb9b6e16d717db46c28efbe273a1d"), ( - "45e9ff284aa8b4c825ebe16165953b186bbc0b62f209f84dac2eee3382a94e2b", - "d932afbbe10120b68c573e1844a4f8f87bc93ff9d359d7c15621952e4ef9821c"), ( - "d1807c403b8ed2e8022db73486ff6dd2471872404accb8208cda3d757079041c", - "7aed51eb6e3f042a32e44f7add13f9d8cc675839232323094692fa9ec0385e19"), ( - "b9c93861237f423f8cb2e96e3a92ba986f290f3852475d9b62cb21a445cdc201", - "e25ae2bb31b01d5d80186f906af11d4c7a6ed172a5aefbabe3b3eeece6750816"), ( - "558ad70ccba7882b6f20cd8098f52b8288afdee8b346bf4db33b5deb8153c71a", - "c651377b6f9deb188dfc868df0157ee50dd5f9f7d92ca0e69e82f03355af9821"), ( - "b6e4ff38fc18fcb2ca63486314db80183b35f1dc8082e8dffae0726a1c284c25", - "2eedb645aa09985bf178bbc4c5417f8c1a9907440066096111292f2e72e9a01b"), ( - "c264ab7d9008339abbc1be91bb96eed30cc5d051d8833a3f5cc94674fccd8627", - "8fd732c230f79e11d56d8f7cacd5f7095e4ad1a80a3c79b1cf42d9733001fe2b"), ( - "8b29b2811047827f356a57f7166f8b3dd4a3aac23b02522daf007c677295801a", - "e4b4d00d5d3eeb087c2edfdede5eb92ad39974c359172913abc78e5a5c78ff13"), ( - "30be5db463aef5665c8699f2e5fc69ea2ca209290771e2aaac3b60caee6cf22e", - "3c5e974d664c03b13adbe5ebcf9b03491ed0e4c50095297d7b3115804274d70e"), ( - "db16b337102ce1b0932fe6e841fc1e7c01473ed4f3765934f2275b821d5b5d2d", - "dbcb04a56099034b4eddf402c08810f5842a74d5312cd5fd86d9378a2da54323"), ( - "6f75a23af554d0b3f5ee5a48b5ec1ad8fe9a6f7c2c64b9e44bd9deb644212e17", - "68cebf8d52280b6484bd14f9b6bdbf89a485fc6f6129f49494bd7c1b40c90624"), ( - "e3d00baa245cb4f99dcc282cb33121dfa42c3ae1524139c5be17a043cdf65a28", - "5710f34c928c76f21871bcb63731f3417f1056437397b083d095e7fd3f49790f"), ( - "f382f322140415ed6692583c594e8d8fc5bea0f027a159ad01df4a3942771100", - "4bfb6da22da207b0935868b7ac4574bea7f3358f4a281837e56b1fa3147cb40f"), ( - "33e74fde6f16209c57b24d496fc87ce2270dd2f3b04a9a5a701ec743ed9e1d04", - "e1e847e1ba408253c0539af6a7ff0a8700802ac26f8f7aa68906471613f8371f"), ( - "3e4b5dc67f25293d3c432cfe6e37ac7905ae19e62c7836c8e1a05b5822ad432c", - "c978a79b21c177d102af936de352d5fb2862396157628c8c53b259eaadd60303"), ( - "1468956b2009da0abc540721681516d2d836fbb19692276d07345b6706a53129", - "eef70d99244f8e5de8c938b56d3079990652e399edf4996c7ba3090bd20e652a"), ( - "c641b2667bc124b26572f9fbbec9ecf839db74c9edec9a75168579b71cbb9901", - "83b957a57b5ecacc1a4b0231795be7013e488ab0ba2e7cb4122152aa2a14ba18"), ( - "5bc5c3903a9a19dd230310422c11dc42c590c949580f37dedc6bfb528be5c62f", - "5e2dcafd8d018dd8d3ad1e5a7adf58605cd8628dadd96ee48f32bc0f8c4be41b"), ( - "9766e135d8b9aa253c90202454fa824b03b9d2d25e0b6c18cd99d87cb328590e", - "d3f8885f3dfa8a0416937ef89f89d2ee7df9e71852f09f812ac6d7934fccb60d"), ( - "feb64610db2ac2f01869a198f5a3fc524d6cf0bd171f118bd291c50db1d54a1c", - "3e27cd9b28b288fb3d1953a7355c986c88428a0a95b56ee39f7e5aeb0bbfdb0f"), ( - "571bf13dc817ae45281208cf712cee1917900e203be6d617984bb493e0c24c25", - "132f0e795cb6f5127e9fbaff53b28e4baf05df08b92dcbdc05d8ea2638d9e70c"), ( - "fb649a934864788acacdfa654bc262cb71af2842f0e0b65054f37e8bc5332d08", - "67a5a6e195a43d1492461d65ac8dd2b254b1467bfe85342cec8fe6ae9892ca1e"), ( - "bd6d4da3fcb81b710dbba70051fe8d565c47419517fea3d20639667edb415413", - "07fc16e5a1523005ca08be860c4dc58413b773c1c15f9079c6d373f9e2f93228"), ( - "e49799e28327a6e8f4a1d1ad7290345a37a263284517b094d325e7e17593971d", - "641a4439c23e414ef21dd7a563cd75f533a3e26b1e11f5d207d29629d5c4d416"), ( - "c0ba522a52198ab0a79d935b17eb57611d141f0ac3864e2a37439e4996591e24", - "78fe086005cd3baaa5315cd138530ef4d7f6febc6e427cd71625329c56419312"), ( - "871ee440ba18913aeec0d7fac20c9671e4ceba8e1cde2dc74e2636ca57de6922", - "9d2e7c22c6b8b723b06e5960c92b1a7e6cc4cd11619ec7f21b7c1543103aae2a"), ( - "ab5a1272cd4e16be953511a5c5ef9ea24f0072f8bd976314d260757ed0b30c12", - "ebfc21341bfde18f6f7fe1b883d83b43278a635b5d699525aeaa2eec2aba211e"), ( - "2c9e91994096c903e90144689053f6f3d9645bc6e11ce48e82facfb03551c41b", - "f9cb618cc78c0e630f3035da914c8606ac1b6629657210308509cf6724748300"), ( - "ba41a3b75d7fdd1962feddb3ebabfb1ed01480334dd3bcae3e45f80db0353123", - "39eecd2d4a751206f4aeed3dba6d9acc0aefddba1897eb91731f767ed94cfd07"), ( - "ccf1feef0bca203265ffda1e22d88c7d23db4244658f8b3629cc1c7bec17fe02", - "093c3209e63e409899050e2b2e17b6397a9e6c9f267056b1300814d9bfadf80c"), ( - "7c2f59be680d820f1fdd4b95982b31931cf3d218088e36f1400d07089f1c2211", - "67eb216710fae6f8cdc776e8edbe6adedb670d2ae92a399e80d35ed1dd82de16"), ( - "94063e3fa709f74b22761cbc400d3b7971b0e32d75de9618c11caa06c6d0c012", - "c2eefc502f09e9098c554d7db21cc4ebe3432baed062fb7f1a70d3ea76044d18"), ( - "bd8a78715e32d4d7b263b2f358509157a8f1488a48860cb4dae04501e5040926", - "f9dac2ab11885c3478469582ec619714623485572a65839aa6a6254c7fbfc914"), ( - "c742d8f410f594be95b9c70f30ab2b3c752388f5d5c139653e3e1f46a3ea1c2a", - "39a28b57b0341b76c9a6d8d4502702aa79f03b6b4c71b4a8b16ee73289f9a405"), ( - "b74ce76b34b4e0bea87c576b4185f6e0e2fe60a1ee29a7be6685ab06f84b340d", - "fabe6f436f34a98de98776d7170a537afdc4e697933ef83f3ee083619eb6550b"), ( - "89f3b3d0a0563fdb52d340d60bd4a94acb8e9fcb1a078b3784f5d5dd0a76bc2f", - "54e5e2dc8bee937a903dbb41fda7d26855d1a852c10f86e60fadae5284a2d82c"), ( - "6a2b21264c42a6fe6968eb4d9539f7d3bd02b0598c58c2a4e709249016720b0d", - "a02038d629f056214390c7c3d07b29d9fd2187e671bf68edfc4c4e6d215e2a1d"), ( - "a7f518c047cb8af54cbab674f684d2114517a5ece15b38511333fe60fa75b10a", - "e092a4f17f93aabe3b062cd0a41321a3cef624c1b6cfd943d3a5f1834cb2ae03")] - - # STATIC_GROUP_MERKLE_ROOT is the root of the Merkle tree constructed from the STATIC_GROUP_KEYS above - # only identity commitments are used for the Merkle tree construction - # the root is created locally, using createMembershipList proc from waku_rln_relay_utils module, and the result is hardcoded in here - STATIC_GROUP_MERKLE_ROOT* = "805be2ac92bc8b21bf093440f5a8055a8a4ec7bf5c5af5e22680d9123a4a5c2b" - -const EPOCH_UNIT_SECONDS* = float64(10) # the rln-relay epoch length in seconds -const MAX_CLOCK_GAP_SECONDS* = 20.0 # the maximum clock difference between peers in seconds - -# maximum allowed gap between the epochs of messages' RateLimitProofs -const MAX_EPOCH_GAP* = int64(MAX_CLOCK_GAP_SECONDS/EPOCH_UNIT_SECONDS) - # Protobufs enc and init proc init*(T: type RateLimitProof, buffer: seq[byte]): ProtoResult[T] = var nsp: RateLimitProof diff --git a/waku/v2/protocol/waku_rln_relay/waku_rln_relay_utils.nim b/waku/v2/protocol/waku_rln_relay/waku_rln_relay_utils.nim index c61eef085..d3a46aead 100644 --- a/waku/v2/protocol/waku_rln_relay/waku_rln_relay_utils.nim +++ b/waku/v2/protocol/waku_rln_relay/waku_rln_relay_utils.nim @@ -12,13 +12,14 @@ import stew/results, stew/[byteutils, arrayops, endians2], rln, + waku_rln_relay_constants, waku_rln_relay_types, + waku_rln_relay_metrics, + ../../utils/time, ../../node/[wakunode2_types,config], ../../../../../examples/v2/config_chat2, ../waku_message - - logScope: topics = "wakurlnrelayutils" @@ -45,7 +46,7 @@ proc toBuffer*(x: openArray[byte]): Buffer = when defined(rln) or (not defined(rln) and not defined(rlnzerokit)): - proc createRLNInstance*(d: int = MERKLE_TREE_DEPTH): RLNResult + proc createRLNInstanceLocal(d: int = MerkleTreeDepth): RLNResult {.raises: [Defect, IOError].} = ## generates an instance of RLN @@ -117,7 +118,7 @@ when defined(rln) or (not defined(rln) and not defined(rlnzerokit)): return some(keypair) when defined(rlnzerokit): - proc createRLNInstance*(d: int = MERKLE_TREE_DEPTH): RLNResult + proc createRLNInstanceLocal(d: int = MerkleTreeDepth): RLNResult {.raises: [Defect, IOError].} = ## generates an instance of RLN @@ -126,7 +127,7 @@ when defined(rlnzerokit): var rlnInstance: ptr RLN merkleDepth: csize_t = uint(d) - resourcesPathBuffer = RLN_RESOURCE_FOLDER.toOpenArrayByte(0, RLN_RESOURCE_FOLDER.high).toBuffer() + resourcesPathBuffer = RlnResourceFolder.toOpenArrayByte(0, RlnResourceFolder.high).toBuffer() # create an instance of RLN let res = new_circuit(merkleDepth, addr resourcesPathBuffer, addr rlnInstance) @@ -169,6 +170,12 @@ when defined(rlnzerokit): return some(keypair) +proc createRLNInstance*(d: int = MerkleTreeDepth): RLNResult {.raises: [Defect, IOError].} = + ## Wraps the rln instance creation for metrics + waku_rln_instance_creation_duration_seconds.nanosecondTime: + let res = createRLNInstanceLocal(d) + return res + proc toUInt256*(idCommitment: IDCommitment): UInt256 = let pk = UInt256.fromBytesBE(idCommitment) return pk @@ -197,7 +204,7 @@ proc register*(idComm: IDCommitment, ethAccountAddress: Address, ethAccountPrivK # set the gas price twice the suggested price in order for the fast mining let gasPrice = int(await web3.provider.eth_gasPrice()) * 2 - # when the private key is set in a web3 instance, the send proc (sender.register(pk).send(MEMBERSHIP_FEE)) + # when the private key is set in a web3 instance, the send proc (sender.register(pk).send(MembershipFee)) # does the signing using the provided key # web3.privateKey = some(ethAccountPrivateKey) var sender = web3.contractSender(MembershipContract, membershipContractAddress) # creates a Sender object with a web3 field and contract address of type Address @@ -207,7 +214,7 @@ proc register*(idComm: IDCommitment, ethAccountAddress: Address, ethAccountPrivK var txHash: TxHash try: # send the registration transaction and check if any error occurs - txHash = await sender.register(pk).send(value = MEMBERSHIP_FEE, gasPrice = gasPrice) + txHash = await sender.register(pk).send(value = MembershipFee, gasPrice = gasPrice) except ValueError as e: return err("registration transaction failed: " & e.msg) @@ -321,8 +328,9 @@ when defined(rln) or (not defined(rln) and not defined(rlnzerokit)): # generate the proof var proof: Buffer - let proofIsSuccessful = generate_proof(rlnInstance, addr inputBuffer, addr proof) - # check whether the generate_proof call is done successfully + waku_rln_proof_generation_duration_seconds.nanosecondTime: + let proofIsSuccessful = generateProof(rlnInstance, addr inputBuffer, addr proof) + # check whether the generateProof call is done successfully if not proofIsSuccessful: return err("could not generate the proof") @@ -557,7 +565,8 @@ proc updateValidRootQueue*(wakuRlnRelay: WakuRLNRelay, root: MerkleNode): void = proc insertMember*(wakuRlnRelay: WakuRLNRelay, idComm: IDCommitment): RlnRelayResult[void] = ## inserts a new id commitment into the local merkle tree, and adds the changed root to the ## queue of valid roots - let actionSucceeded = wakuRlnRelay.rlnInstance.insertMember(idComm) + waku_rln_membership_insertion_duration_seconds.nanosecondTime: + let actionSucceeded = wakuRlnRelay.rlnInstance.insertMember(idComm) if not actionSucceeded: return err("could not insert id commitment into the merkle tree") @@ -649,8 +658,8 @@ proc rlnRelayStaticSetUp*(rlnRelayMemIndex: MembershipIndex): (Option[seq[ MembershipIndex]) {.raises: [Defect, ValueError].} = let # static group - groupKeys = STATIC_GROUP_KEYS - groupSize = STATIC_GROUP_SIZE + groupKeys = StaticGroupKeys + groupSize = StaticGroupSize debug "rln-relay membership index", rlnRelayMemIndex @@ -745,7 +754,7 @@ proc fromEpoch*(epoch: Epoch): uint64 = proc calcEpoch*(t: float64): Epoch = ## gets time `t` as `flaot64` with subseconds resolution in the fractional part ## and returns its corresponding rln `Epoch` value - let e = uint64(t/EPOCH_UNIT_SECONDS) + let e = uint64(t/EpochUnitSeconds) return toEpoch(e) proc getCurrentEpoch*(): Epoch = @@ -765,12 +774,14 @@ proc diff*(e1, e2: Epoch): int64 = proc validateMessage*(rlnPeer: WakuRLNRelay, msg: WakuMessage, timeOption: Option[float64] = none(float64)): MessageValidationResult = ## validate the supplied `msg` based on the waku-rln-relay routing protocol i.e., - ## the `msg`'s epoch is within MAX_EPOCH_GAP of the current epoch + ## the `msg`'s epoch is within MaxEpochGap of the current epoch ## the `msg` has valid rate limit proof ## the `msg` does not violate the rate limit ## `timeOption` indicates Unix epoch time (fractional part holds sub-seconds) ## if `timeOption` is supplied, then the current epoch is calculated based on that + # track message count for metrics + waku_rln_messages_total.inc() # checks if the `msg`'s epoch is far from the current epoch # it corresponds to the validation of rln external nullifier @@ -790,34 +801,44 @@ proc validateMessage*(rlnPeer: WakuRLNRelay, msg: WakuMessage, debug "message epoch", msgEpoch = fromEpoch(msgEpoch) # validate the epoch - if abs(gap) >= MAX_EPOCH_GAP: + if abs(gap) >= MaxEpochGap: # message's epoch is too old or too ahead - # accept messages whose epoch is within +-MAX_EPOCH_GAP from the current epoch + # accept messages whose epoch is within +-MaxEpochGap from the current epoch debug "invalid message: epoch gap exceeds a threshold", gap = gap, payload = string.fromBytes(msg.payload) + waku_rln_invalid_messages_total.inc(labelValues=["invalid_epoch"]) return MessageValidationResult.Invalid if not rlnPeer.validateRoot(msg.proof.merkleRoot): debug "invalid message: provided root does not belong to acceptable window of roots", provided=msg.proof.merkleRoot, validRoots=rlnPeer.validMerkleRoots + waku_rln_invalid_messages_total.inc(labelValues=["invalid_root"]) return MessageValidationResult.Invalid # verify the proof let contentTopicBytes = msg.contentTopic.toBytes input = concat(msg.payload, contentTopicBytes) - proofVerificationRes = rlnPeer.rlnInstance.proofVerify(input, msg.proof) + + waku_rln_proof_verification_total.inc() + waku_rln_proof_verification_duration_seconds.nanosecondTime: + let proofVerificationRes = rlnPeer.rlnInstance.proofVerify(input, msg.proof) if proofVerificationRes.isErr(): + waku_rln_errors_total.inc(labelValues=["proof_verification"]) return MessageValidationResult.Invalid if not proofVerificationRes.value(): # invalid proof debug "invalid message: invalid proof", payload = string.fromBytes(msg.payload) + waku_rln_invalid_messages_total.inc(labelValues=["invalid_proof"]) return MessageValidationResult.Invalid # check if double messaging has happened let hasDup = rlnPeer.hasDuplicate(msg) - if hasDup.isOk and hasDup.value == true: - debug "invalid message: message is a spam", payload = string.fromBytes(msg.payload) + if hasDup.isErr(): + waku_rln_errors_total.inc(labelValues=["duplicate_check"]) + elif hasDup.value == true: + debug "invalid message: message is spam", payload = string.fromBytes(msg.payload) + waku_rln_spam_messages_total.inc() return MessageValidationResult.Spam # insert the message to the log @@ -825,6 +846,8 @@ proc validateMessage*(rlnPeer: WakuRLNRelay, msg: WakuMessage, # it will never error out discard rlnPeer.updateLog(msg) debug "message is valid", payload = string.fromBytes(msg.payload) + let rootIndex = rlnPeer.validMerkleRoots.find(msg.proof.merkleRoot) + waku_rln_valid_messages_total.observe(rootIndex.toFloat()) return MessageValidationResult.Valid @@ -1039,7 +1062,8 @@ proc mountRlnRelayDynamic*(node: WakuNode, doAssert(keyPairOpt.isSome) keyPair = keyPairOpt.get() # register the rln-relay peer to the membership contract - let regIndexRes = await register(idComm = keyPair.idCommitment, ethAccountAddress = ethAccAddr, ethAccountPrivKey = ethAccountPrivKeyOpt.get(), ethClientAddress = ethClientAddr, membershipContractAddress = memContractAddr, registrationHandler = registrationHandler) + waku_rln_registration_duration_seconds.nanosecondTime: + let regIndexRes = await register(idComm = keyPair.idCommitment, ethAccountAddress = ethAccAddr, ethAccountPrivKey = ethAccountPrivKeyOpt.get(), ethClientAddress = ethClientAddr, membershipContractAddress = memContractAddr, registrationHandler = registrationHandler) # check whether registration is done if regIndexRes.isErr(): debug "membership registration failed", err=regIndexRes.error() @@ -1089,16 +1113,20 @@ proc readPersistentRlnCredentials*(path: string) : RlnMembershipCredentials {.ra # With regards to printing the keys, it is purely for debugging purposes so that the user becomes explicitly aware of the current keys in use when nwaku is started. # Note that this is only until the RLN contract being used is the one deployed on Goerli testnet. # These prints need to omitted once RLN contract is deployed on Ethereum mainnet and using valuable funds for staking. - - let entireRlnCredentialsFile = readFile(path) + waku_rln_membership_credentials_import_duration_seconds.nanosecondTime: + let entireRlnCredentialsFile = readFile(path) - let jsonObject = parseJson(entireRlnCredentialsFile) - let deserializedRlnCredentials = to(jsonObject, RlnMembershipCredentials) - + let jsonObject = parseJson(entireRlnCredentialsFile) + let deserializedRlnCredentials = to(jsonObject, RlnMembershipCredentials) + debug "Deserialized Rln credentials", rlnCredentials=deserializedRlnCredentials - result = deserializedRlnCredentials + return deserializedRlnCredentials -proc mountRlnRelay*(node: WakuNode, conf: WakuNodeConf|Chat2Conf, spamHandler: Option[SpamHandler] = none(SpamHandler), registrationHandler: Option[RegistrationHandler] = none(RegistrationHandler)): RlnRelayResult[bool] {.raises: [Defect, ValueError, IOError, CatchableError, Exception].} = +proc mount(node: WakuNode, + conf: WakuNodeConf|Chat2Conf, + spamHandler: Option[SpamHandler] = none(SpamHandler), + registrationHandler: Option[RegistrationHandler] = none(RegistrationHandler) + ): RlnRelayResult[bool] {.raises: [Defect, ValueError, IOError, CatchableError, Exception].} = if not conf.rlnRelayDynamic: info " setting up waku-rln-relay in off-chain mode... " # set up rln relay inputs @@ -1117,7 +1145,7 @@ proc mountRlnRelay*(node: WakuNode, conf: WakuNodeConf|Chat2Conf, spamHandler: O # TODO have added this check to account for unseen corner cases, will remove it later let rootRes = node.wakuRlnRelay.rlnInstance.getMerkleRoot() - expectedRoot = STATIC_GROUP_MERKLE_ROOT + expectedRoot = StaticGroupMerkleRoot if rootRes.isErr(): return err(rootRes.error()) @@ -1145,7 +1173,7 @@ proc mountRlnRelay*(node: WakuNode, conf: WakuNodeConf|Chat2Conf, spamHandler: O # if the path does not contain any credential file, then a new set is generated and pesisted in the same path # if there is a credential file, then no new credentials are generated, instead the content of the file is read and used to mount rln-relay if conf.rlnRelayCredPath != "": - let rlnRelayCredPath = joinPath(conf.rlnRelayCredPath, RLN_CREDENTIALS_FILENAME) + let rlnRelayCredPath = joinPath(conf.rlnRelayCredPath, RlnCredentialsFilename) debug "rln-relay credential path", rlnRelayCredPath=rlnRelayCredPath # check if there is an rln-relay credential file in the supplied path if fileExists(rlnRelayCredPath): @@ -1183,3 +1211,19 @@ proc mountRlnRelay*(node: WakuNode, conf: WakuNodeConf|Chat2Conf, spamHandler: O if res.isErr: return err("dynamic rln-relay could not be mounted: " & res.error()) return ok(true) + + +proc mountRlnRelay*(node: WakuNode, + conf: WakuNodeConf|Chat2Conf, + spamHandler: Option[SpamHandler] = none(SpamHandler), + registrationHandler: Option[RegistrationHandler] = none(RegistrationHandler) + ): RlnRelayResult[bool] {.raises: [Defect, ValueError, IOError, CatchableError, Exception].} = + waku_rln_relay_mounting_duration_seconds.nanosecondTime: + let res = mount( + node, + conf, + spamHandler, + registrationHandler + ) + + return res diff --git a/waku/v2/utils/time.nim b/waku/v2/utils/time.nim index b91709a12..117b7eeeb 100644 --- a/waku/v2/utils/time.nim +++ b/waku/v2/utils/time.nim @@ -1,6 +1,9 @@ ## Contains types and utilities for timestamps. {.push raises: [Defect].} +import + std/times, + metrics type Timestamp* = int64 @@ -15,3 +18,22 @@ proc getMicrosecondTime*[T](timeInSeconds: T): Timestamp = proc getMillisecondTime*[T](timeInSeconds: T): Timestamp = var ms = Timestamp(timeInSeconds.int64 * 1000.int64) return ms + +proc nowInUnixFloat(): float = + return getTime().toUnixFloat() + +template nanosecondTime*(collector: Summary | Histogram, body: untyped) = + when defined(metrics): + let start = nowInUnixFloat() + body + collector.observe(nowInUnixFloat() - start) + else: + body + +template nanosecondTime*(collector: Gauge, body: untyped) = + when defined(metrics): + let start = nowInUnixFloat() + body + collector.set(nowInUnixFloat() - start) + else: + body \ No newline at end of file