Skip to content

Commit

Permalink
chore(rln-relay-v2): added tests for onchain rln-relay-v2
Browse files Browse the repository at this point in the history
  • Loading branch information
rymnc committed Feb 27, 2024
1 parent a499300 commit e77c0b6
Show file tree
Hide file tree
Showing 3 changed files with 145 additions and 58 deletions.
163 changes: 124 additions & 39 deletions tests/waku_rln_relay/test_rln_group_manager_onchain.nim
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ proc generateCredentials(rlnInstance: ptr RLN): IdentityCredential =
let credRes = membershipKeyGen(rlnInstance)
return credRes.get()

when defined(rln_v2):
proc getRateCommitment(idCredential: IdentityCredential, userMessageLimit: UserMessageLimit): RateCommitment =
return RateCommitment(idCommitment: idCredential.idCommitment,
userMessageLimit: userMessageLimit)

proc generateCredentials(rlnInstance: ptr RLN, n: int): seq[IdentityCredential] =
var credentials: seq[IdentityCredential]
for i in 0 ..< n:
Expand Down Expand Up @@ -84,7 +89,11 @@ proc uploadRLNContract*(ethClientAddress: string): Future[Address] {.async.} =
debug "Address of the deployed registry contract: ", contractAddress

let registryContract = web3.contractSender(WakuRlnRegistry, contractAddress)
let newStorageReceipt = await registryContract.newStorage().send()
when defined(rln_v2):
let initReceipt = await registryContract.initialize().send()
let newStorageReceipt = await registryContract.newStorage(20.u256).send()
else:
let newStorageReceipt = await registryContract.newStorage().send()

debug "Receipt of the newStorage transaction: ", newStorageReceipt
let newBalance = await web3.provider.eth_getBalance(web3.defaultAccount, "latest")
Expand Down Expand Up @@ -278,14 +287,24 @@ suite "Onchain group manager":
proc callback(registrations: seq[Membership]): Future[void] {.async.} =
require:
registrations.len == 1
registrations[0].idCommitment == credentials.idCommitment
registrations[0].index == 0
when defined(rln_v2):
require:
registrations[0].rateCommitment == getRateCommitment(credentials, UserMessageLimit(1))
else:
require:
registrations[0].idCommitment == credentials.idCommitment
require:
registrations[0].index == 0
fut.complete()
return callback

try:
manager.onRegister(generateCallback(fut))
await manager.register(credentials)
when defined(rln_v2):
await manager.register(credentials, UserMessageLimit(1))
else:
await manager.register(credentials)
await manager.startGroupSync()
except Exception, CatchableError:
assert false, "exception raised: " & getCurrentExceptionMsg()
Expand Down Expand Up @@ -319,19 +338,29 @@ suite "Onchain group manager":
proc generateCallback(futs: TestGroupSyncFuts, credentials: seq[IdentityCredential]): OnRegisterCallback =
var futureIndex = 0
proc callback(registrations: seq[Membership]): Future[void] {.async.} =
if registrations.len == 1 and
registrations[0].idCommitment == credentials[futureIndex].idCommitment and
registrations[0].index == MembershipIndex(futureIndex):
futs[futureIndex].complete()
futureIndex += 1
when defined(rln_v2):
if registrations.len == 1 and
registrations[0].rateCommitment == getRateCommitment(credentials[futureIndex], UserMessageLimit(1)) and
registrations[0].index == MembershipIndex(futureIndex):
futs[futureIndex].complete()
futureIndex += 1
else:
if registrations.len == 1 and
registrations[0].idCommitment == credentials[futureIndex].idCommitment and
registrations[0].index == MembershipIndex(futureIndex):
futs[futureIndex].complete()
futureIndex += 1
return callback

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

for i in 0 ..< credentials.len():
await manager.register(credentials[i])
when defined(rln_v2):
await manager.register(credentials[i], UserMessageLimit(1))
else:
await manager.register(credentials[i])
except Exception, CatchableError:
assert false, "exception raised: " & getCurrentExceptionMsg()

Expand All @@ -352,7 +381,11 @@ suite "Onchain group manager":
let dummyCommitment = default(IDCommitment)

try:
await manager.register(dummyCommitment)
when defined(rln_v2):
await manager.register(RateCommitment(idCommitment: dummyCommitment,
userMessageLimit: UserMessageLimit(1)))
else:
await manager.register(dummyCommitment)
except CatchableError:
assert true
except Exception:
Expand All @@ -375,7 +408,11 @@ suite "Onchain group manager":
let merkleRootBefore = merkleRootBeforeRes.get()

try:
await manager.register(idCommitment)
when defined(rln_v2):
await manager.register(RateCommitment(idCommitment: idCommitment,
userMessageLimit: UserMessageLimit(1)))
else:
await manager.register(idCommitment)
except Exception, CatchableError:
assert false, "exception raised when calling register: " & getCurrentExceptionMsg()

Expand All @@ -396,17 +433,26 @@ suite "Onchain group manager":
let fut = newFuture[void]()

proc callback(registrations: seq[Membership]): Future[void] {.async.} =

when defined(rln_v2):
require:
registrations[0].rateCommitment == RateCommitment(idCommitment: idCommitment, userMessageLimit: UserMessageLimit(1))
else:
require:
registrations[0].idCommitment == idCommitment
require:
registrations.len == 1
registrations[0].idCommitment == idCommitment
registrations[0].index == 0
registrations.len == 1
fut.complete()

manager.onRegister(callback)
await manager.init()
try:
await manager.startGroupSync()
await manager.register(idCommitment)
when defined(rln_v2):
await manager.register(RateCommitment(idCommitment: idCommitment, userMessageLimit: UserMessageLimit(1)))
else:
await manager.register(idCommitment)
except Exception, CatchableError:
assert false, "exception raised: " & getCurrentExceptionMsg()

Expand Down Expand Up @@ -438,18 +484,27 @@ suite "Onchain group manager":
let fut = newFuture[void]()

proc callback(registrations: seq[Membership]): Future[void] {.async.} =
if registrations.len == 1 and
registrations[0].idCommitment == credentials.idCommitment and
registrations[0].index == 0:
manager.idCredentials = some(credentials)
manager.membershipIndex = some(registrations[0].index)
fut.complete()
when defined(rln_v2):
if registrations.len == 1 and
registrations[0].rateCommitment == getRateCommitment(credentials, UserMessageLimit(1)) and
registrations[0].index == 0:
manager.idCredentials = some(credentials)
fut.complete()
else:
if registrations.len == 1 and
registrations[0].idCommitment == credentials.idCommitment and
registrations[0].index == 0:
manager.idCredentials = some(credentials)
fut.complete()

manager.onRegister(callback)

try:
await manager.startGroupSync()
await manager.register(credentials)
when defined(rln_v2):
await manager.register(credentials, UserMessageLimit(1))
else:
await manager.register(credentials)
except Exception, CatchableError:
assert false, "exception raised: " & getCurrentExceptionMsg()

Expand All @@ -463,7 +518,8 @@ suite "Onchain group manager":

# generate proof
let validProofRes = manager.generateProof(data = messageBytes,
epoch = epoch)
epoch = epoch,
messageId = MessageId(1))
require:
validProofRes.isOk()
let validProof = validProofRes.get()
Expand All @@ -488,6 +544,8 @@ suite "Onchain group manager":
## Assume the registration occured out of band
manager.idCredentials = some(credentials)
manager.membershipIndex = some(MembershipIndex(0))
when defined(rln_v2):
manager.userMessageLimit = some(UserMessageLimit(1))

let messageBytes = "Hello".toBytes()

Expand All @@ -497,7 +555,8 @@ suite "Onchain group manager":

# generate proof
let validProofRes = manager.generateProof(data = messageBytes,
epoch = epoch)
epoch = epoch,
messageId = MessageId(0))
require:
validProofRes.isOk()
let validProof = validProofRes.get()
Expand All @@ -517,18 +576,27 @@ suite "Onchain group manager":
let fut = newFuture[void]()

proc callback(registrations: seq[Membership]): Future[void] {.async.} =
if registrations.len == 1 and
registrations[0].idCommitment == credentials.idCommitment and
registrations[0].index == 0:
manager.idCredentials = some(credentials)
manager.membershipIndex = some(registrations[0].index)
fut.complete()
when defined(rln_v2):
if registrations.len == 1 and
registrations[0].rateCommitment == getRateCommitment(credentials, UserMessageLimit(1)) and
registrations[0].index == 0:
manager.idCredentials = some(credentials)
fut.complete()
else:
if registrations.len == 1 and
registrations[0].idCommitment == credentials.idCommitment and
registrations[0].index == 0:
manager.idCredentials = some(credentials)
fut.complete()

manager.onRegister(callback)

try:
await manager.startGroupSync()
await manager.register(credentials)
when defined(rln_v2):
await manager.register(credentials, UserMessageLimit(1))
else:
await manager.register(credentials)
except Exception, CatchableError:
assert false, "exception raised: " & getCurrentExceptionMsg()
await fut
Expand All @@ -541,7 +609,8 @@ suite "Onchain group manager":

# generate proof
let validProofRes = manager.generateProof(data = messageBytes,
epoch = epoch)
epoch = epoch,
messageId = MessageId(0))
require:
validProofRes.isOk()
let validProof = validProofRes.get()
Expand All @@ -566,7 +635,10 @@ suite "Onchain group manager":
let idCredential = generateCredentials(manager.rlnInstance)

try:
await manager.register(idCredential.idCommitment)
when defined(rln_v2):
await manager.register(getRateCommitment(idCredential, UserMessageLimit(1)))
else:
await manager.register(idCredential.idCommitment)
except Exception, CatchableError:
assert false, "exception raised when calling startGroupSync: " & getCurrentExceptionMsg()

Expand All @@ -575,6 +647,8 @@ suite "Onchain group manager":
## Assume the registration occured out of band
manager.idCredentials = some(idCredential2)
manager.membershipIndex = some(MembershipIndex(0))
when defined(rln_v2):
manager.userMessageLimit = some(UserMessageLimit(1))

let messageBytes = "Hello".toBytes()

Expand All @@ -584,7 +658,8 @@ suite "Onchain group manager":

# generate proof
let invalidProofRes = manager.generateProof(data = messageBytes,
epoch = epoch)
epoch = epoch,
messageId = MessageId(0))
require:
invalidProofRes.isOk()
let invalidProof = invalidProofRes.get()
Expand Down Expand Up @@ -613,18 +688,28 @@ suite "Onchain group manager":
proc generateCallback(futs: TestBackfillFuts, credentials: seq[IdentityCredential]): OnRegisterCallback =
var futureIndex = 0
proc callback(registrations: seq[Membership]): Future[void] {.async.} =
if registrations.len == 1 and
registrations[0].idCommitment == credentials[futureIndex].idCommitment and
registrations[0].index == MembershipIndex(futureIndex):
futs[futureIndex].complete()
futureIndex += 1
when defined(rln_v2):
if registrations.len == 1 and
registrations[0].rateCommitment == getRateCommitment(credentials[futureIndex], UserMessageLimit(1)) and
registrations[0].index == MembershipIndex(futureIndex):
futs[futureIndex].complete()
futureIndex += 1
else:
if registrations.len == 1 and
registrations[0].idCommitment == credentials[futureIndex].idCommitment and
registrations[0].index == MembershipIndex(futureIndex):
futs[futureIndex].complete()
futureIndex += 1
return callback

try:
manager.onRegister(generateCallback(futures, credentials))
await manager.startGroupSync()
for i in 0 ..< credentials.len():
await manager.register(credentials[i])
when defined(rln_v2):
await manager.register(credentials[i], UserMessageLimit(1))
else:
await manager.register(credentials[i])
except Exception, CatchableError:
assert false, "exception raised: " & getCurrentExceptionMsg()

Expand Down
17 changes: 8 additions & 9 deletions waku/waku_rln_relay/group_manager/on_chain/group_manager.nim
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ when defined(rln_v2):
# this serves as an entrypoint into the rln storage contract
proc register(storageIndex: Uint16, idCommitment: Uint256, userMessageLimit: Uint256)
# this creates a new storage on the rln registry
proc newStorage()
proc newStorage(maxMessageLimit: Uint256)
# Initializes the implementation contract (only used in unit tests)
proc initialize()

# membership contract interface
contract(RlnStorage):
Expand Down Expand Up @@ -142,10 +144,8 @@ when defined(rln_v2):
initializedGuard(g)

# convert the rateCommitment struct to a leaf value
let leavesRes = rateCommitments.toLeaves()
if leavesRes.isErr():
raise newException(CatchableError, "failed to convert rateCommitments to leaves: " & leavesRes.error)
let leaves = cast[seq[seq[byte]]](leavesRes.get())
let leaves = rateCommitments.toLeaves().valueOr:
raise newException(ValueError, "failed to convert rateCommitments to leaves: " & $error)

waku_rln_membership_insertion_duration_seconds.nanosecondTime:
let operationSuccess = g.rlnInstance.atomicWrite(some(start),
Expand Down Expand Up @@ -269,11 +269,10 @@ when defined(rln_v2):
let
argumentsBytes = arguments
# In TX log data, uints are encoded in big endian
userMessageLimit = UInt256.fromBytesBE(argumentsBytes[32..64])
membershipIndex = UInt256.fromBytesBE(argumentsBytes[64..^1])

g.userMessageLimit = some(userMessageLimit)
g.membershipIndex = some(membershipIndex.toMembershipIndex())
g.userMessageLimit = some(userMessageLimit.toUserMessageLimit())

# don't handle member insertion into the tree here, it will be handled by the event listener
return
Expand Down Expand Up @@ -354,11 +353,11 @@ proc parseEvent(event: type MemberRegistered,
try:
# Parse the idComm
offset += decode(data, offset, idComm)
# Parse the index
offset += decode(data, offset, index)
when defined(rln_v2):
# Parse the userMessageLimit
offset += decode(data, offset, userMessageLimit)
# Parse the index
offset += decode(data, offset, index)
when defined(rln_v2):
return ok(Membership(rateCommitment: RateCommitment(idCommitment: idComm.toIDCommitment(),
userMessageLimit: userMessageLimit.toUserMessageLimit()),
Expand Down
Loading

0 comments on commit e77c0b6

Please sign in to comment.