Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(rln-relay): integrate waku rln registry #1943

Merged
merged 1 commit into from
Aug 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 41 additions & 38 deletions tests/waku_rln_relay/test_rln_group_manager_onchain.nim
Original file line number Diff line number Diff line change
Expand Up @@ -60,26 +60,26 @@ proc uploadRLNContract*(ethClientAddress: string): Future[Address] {.async.} =
debug "hasher address: ", hasherAddress


# encode membership contract inputs to 32 bytes zero-padded
# encode registry contract inputs to 32 bytes zero-padded
let
membershipFeeEncoded = encode(MembershipFee).data
depthEncoded = encode(MerkleTreeDepth.u256).data
hasherAddressEncoded = encode(hasherAddress).data
# this is the contract constructor input
contractInput = membershipFeeEncoded & depthEncoded & hasherAddressEncoded
contractInput = hasherAddressEncoded


debug "encoded membership fee: ", membershipFeeEncoded
debug "encoded depth: ", depthEncoded
debug "encoded hasher address: ", hasherAddressEncoded
debug "encoded contract input:", contractInput

# deploy membership contract with its constructor inputs
let receipt = await web3.deployContract(MembershipContractCode,
contractInput = contractInput)
let contractAddress = receipt.contractAddress.get
debug "Address of the deployed membership contract: ", contractAddress
# deploy registry contract with its constructor inputs
let receipt = await web3.deployContract(RegistryContractCode,
contractInput = contractInput)
let contractAddress = receipt.contractAddress.get()
debug "Address of the deployed registry contract: ", contractAddress

let registryContract = web3.contractSender(WakuRlnRegistry, contractAddress)
let newStorageReceipt = await registryContract.newStorage().send()

debug "Receipt of the newStorage transaction: ", newStorageReceipt
let newBalance = await web3.provider.eth_getBalance(web3.defaultAccount, "latest")
debug "Account balance after the contract deployment: ", newBalance

Expand Down Expand Up @@ -149,14 +149,11 @@ proc stopGanache(runGanache: Process) {.used.} =
try:
# We terminate Ganache daemon by sending a SIGTERM signal to the runGanache PID to trigger RPC server termination and clean-up
discard startProcess("pkill", args = ["-f", "ganache"], options = {poUsePath})
# NOTE: the below line must remain commented out, otherwise it will cause a deadlocked state
# ref: https://nim-lang.org/docs/osproc.html#waitForExit%2CProcess%2Cint
# debug "ganache logs", logs=runGanache.outputstream.readAll()
debug "Sent SIGTERM to Ganache", ganachePID=ganachePID
except:
error "Ganache daemon termination failed: ", err = getCurrentExceptionMsg()

proc setup(signer = true): Future[OnchainGroupManager] {.async.} =
proc setup(): Future[OnchainGroupManager] {.async.} =
let rlnInstanceRes = createRlnInstance(tree_path = genTempPath("rln_tree", "group_manager_onchain"))
require:
rlnInstanceRes.isOk()
Expand All @@ -168,18 +165,16 @@ proc setup(signer = true): Future[OnchainGroupManager] {.async.} =
let web3 = await newWeb3(EthClient)

let accounts = await web3.provider.eth_accounts()
web3.defaultAccount = accounts[1]
web3.defaultAccount = accounts[0]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shall we check the number of accounts is > 0?

Suggested change
web3.defaultAccount = accounts[0]
assert accounts.len > 0, "Not enough accounts retrieved"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not neccesary (AFAIU:) ) - the web3.provider.eth_accounts() is an RPC call to an ETH node which will return it the accounts that it knows of (in case of ganache it should be something liek 10 default well known accounts/wallets).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

correct, the eth_accounts will always be > 0, since we're using a test rpc provider - ganache


var pk = none(string)
if signer:
let (privateKey, _) = await createEthAccount()
pk = some($privateKey)
let (privateKey, _) = await createEthAccount()
pk = some($privateKey)

let manager = OnchainGroupManager(ethClientUrl: EthClient,
ethContractAddress: $contractAddress,
ethPrivateKey: pk,
rlnInstance: rlnInstance,
saveKeystore: false)
rlnInstance: rlnInstance)

return manager

Expand Down Expand Up @@ -211,13 +206,12 @@ suite "Onchain group manager":
metadata.contractAddress == manager.ethContractAddress

await manager.stop()


let differentContractAddress = await uploadRLNContract(manager.ethClientUrl)
# simulating a change in the contractAddress
let manager2 = OnchainGroupManager(ethClientUrl: EthClient,
ethContractAddress: "0x0000000000000000000000000000000000000000",
ethPrivateKey: manager.ethPrivateKey,
rlnInstance: manager.rlnInstance,
saveKeystore: false)
ethContractAddress: $differentContractAddress,
rlnInstance: manager.rlnInstance)
expect(ValueError): await manager2.init()

asyncTest "startGroupSync: should start group sync":
Expand All @@ -234,7 +228,7 @@ suite "Onchain group manager":

asyncTest "startGroupSync: should sync to the state of the group":
let manager = await setup()

let credentials = generateCredentials(manager.rlnInstance)
await manager.init()

let merkleRootBeforeRes = manager.rlnInstance.getMerkleRoot()
Expand All @@ -248,13 +242,14 @@ suite "Onchain group manager":
proc callback(registrations: seq[Membership]): Future[void] {.async.} =
require:
registrations.len == 1
registrations[0].idCommitment == manager.idCredentials.get().idCommitment
registrations[0].index == 0
registrations[0].idCommitment == credentials.idCommitment
registrations[0].index == 1
fut.complete()
return callback

manager.onRegister(generateCallback(fut))

await manager.register(credentials)
await manager.startGroupSync()

await fut
Expand Down Expand Up @@ -291,7 +286,6 @@ suite "Onchain group manager":
futs[futureIndex].complete()
futureIndex += 1
return callback

manager.onRegister(generateCallback(futures, credentials))
await manager.startGroupSync()

Expand All @@ -317,7 +311,7 @@ suite "Onchain group manager":
await manager.register(dummyCommitment)

asyncTest "register: should register successfully":
let manager = await setup(false)
let manager = await setup()
await manager.init()
await manager.startGroupSync()

Expand All @@ -336,7 +330,7 @@ suite "Onchain group manager":
manager.latestIndex == 1

asyncTest "register: callback is called":
let manager = await setup(false)
let manager = await setup()

let idCommitment = generateCredentials(manager.rlnInstance).idCommitment

Expand Down Expand Up @@ -366,19 +360,24 @@ suite "Onchain group manager":

asyncTest "validateRoot: should validate good root":
let manager = await setup()
let credentials = generateCredentials(manager.rlnInstance)
await manager.init()


let fut = newFuture[void]()

proc callback(registrations: seq[Membership]): Future[void] {.async.} =
if registrations.len == 1 and
registrations[0].idCommitment == manager.idCredentials.get().idCommitment and
registrations[0].index == 0:
registrations[0].idCommitment == credentials.idCommitment and
registrations[0].index == 1:
manager.idCredentials = some(credentials)
manager.membershipIndex = some(registrations[0].index)
fut.complete()

manager.onRegister(callback)

await manager.startGroupSync()
await manager.register(credentials)
await fut

let messageBytes = "Hello".toBytes()
Expand All @@ -405,10 +404,10 @@ suite "Onchain group manager":
await manager.init()
await manager.startGroupSync()

let idCredential = generateCredentials(manager.rlnInstance)
let credentials = generateCredentials(manager.rlnInstance)

## Assume the registration occured out of band
manager.idCredentials = some(idCredential)
manager.idCredentials = some(credentials)
manager.membershipIndex = some(MembershipIndex(0))

let messageBytes = "Hello".toBytes()
Expand All @@ -432,19 +431,23 @@ suite "Onchain group manager":

asyncTest "verifyProof: should verify valid proof":
let manager = await setup()
let credentials = generateCredentials(manager.rlnInstance)
await manager.init()

let fut = newFuture[void]()

proc callback(registrations: seq[Membership]): Future[void] {.async.} =
if registrations.len == 1 and
registrations[0].idCommitment == manager.idCredentials.get().idCommitment and
registrations[0].index == 0:
registrations[0].idCommitment == credentials.idCommitment and
registrations[0].index == 1:
manager.idCredentials = some(credentials)
manager.membershipIndex = some(registrations[0].index)
fut.complete()

manager.onRegister(callback)

await manager.startGroupSync()
await manager.register(credentials)
await fut

let messageBytes = "Hello".toBytes()
Expand Down
4 changes: 1 addition & 3 deletions tools/rln_keystore_generator/rln_keystore_generator.nim
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,7 @@ when isMainModule:
rlnInstance: rlnInstance,
keystorePath: none(string),
keystorePassword: none(string),
ethPrivateKey: some(conf.rlnRelayEthPrivateKey),
# saveKeystore = false, since we're managing it
saveKeystore: false)
ethPrivateKey: some(conf.rlnRelayEthPrivateKey))
try:
waitFor groupManager.init()
except CatchableError:
Expand Down
Loading