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

fix(rln-relay): handle empty metadata returned by getMetadata proc #2516

Merged
merged 3 commits into from
Mar 8, 2024
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
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ LIBRLN_BUILDDIR := $(CURDIR)/vendor/zerokit
ifeq ($(RLN_V2),true)
LIBRLN_VERSION := v0.4.1
else
LIBRLN_VERSION := v0.3.4
LIBRLN_VERSION := v0.3.6
endif

ifeq ($(OS),Windows_NT)
Expand Down
18 changes: 11 additions & 7 deletions tests/waku_rln_relay/test_rln_group_manager_onchain.nim
Original file line number Diff line number Diff line change
Expand Up @@ -226,12 +226,13 @@ suite "Onchain group manager":

let metadataSetRes = manager.setMetadata()
assert metadataSetRes.isOk(), metadataSetRes.error
let metadataRes = manager.rlnInstance.getMetadata()
assert metadataRes.isOk(), metadataRes.error
let metadata = metadataRes.get()
require:
metadata.chainId == 1337
metadata.contractAddress == manager.ethContractAddress
let metadataOpt = manager.rlnInstance.getMetadata().valueOr:
raiseAssert $error
assert metadataOpt.isSome(), "metadata is not set"
let metadata = metadataOpt.get()

assert metadata.chainId == 1337, "chainId is not equal to 1337"
assert metadata.contractAddress == manager.ethContractAddress, "contractAddress is not equal to " & manager.ethContractAddress

await manager.stop()

Expand Down Expand Up @@ -458,8 +459,11 @@ suite "Onchain group manager":

await fut

let metadataOpt = manager.rlnInstance.getMetadata().valueOr:
raiseAssert $error
assert metadataOpt.isSome(), "metadata is not set"
check:
manager.rlnInstance.getMetadata().get().validRoots == manager.validRoots.toSeq()
metadataOpt.get().validRoots == manager.validRoots.toSeq()
await manager.stop()

asyncTest "withdraw: should guard against uninitialized state":
Expand Down
20 changes: 14 additions & 6 deletions tests/waku_rln_relay/test_waku_rln_relay.nim
Original file line number Diff line number Diff line change
Expand Up @@ -260,18 +260,26 @@ suite "Waku rln relay":
chainId: 1155511,
contractAddress: "0x9c09146844c1326c2dbc41c451766c7138f88155")).isOk()

let metadataRes = rln.getMetadata()

require:
metadataRes.isOk()

let metadata = metadataRes.get()
let metadataOpt = rln.getMetadata().valueOr:
raiseAssert $error

assert metadataOpt.isSome(), "metadata is not set"
let metadata = metadataOpt.get()
check:
metadata.lastProcessedBlock == 128
metadata.chainId == 1155511
metadata.contractAddress == "0x9c09146844c1326c2dbc41c451766c7138f88155"

test "getMetadata: empty rln metadata":
# create an RLN instance which also includes an empty Merkle tree
let rln = createRLNInstanceWrapper().valueOr:
raiseAssert $error
let metadata = rln.getMetadata().valueOr:
raiseAssert $error

check:
metadata.isNone()

test "Merkle tree consistency check between deletion and insertion":
# create an RLN instance
let rlnInstance = createRLNInstanceWrapper()
Expand Down
7 changes: 6 additions & 1 deletion tools/rln_db_inspector/rln_db_inspector.nim
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,14 @@ proc doInspectRlnDb*(conf: WakuNodeConf) =
quit(1)

# 3. get metadata
let metadata = rlnInstance.getMetadata().valueOr:
let metadataOpt = rlnInstance.getMetadata().valueOr:
error "failure while getting RLN metadata", error
quit(1)

if metadataOpt.isNone():
error "RLN metadata does not exist"
quit(1)
let metadata = metadataOpt.get()

info "RLN metadata", lastProcessedBlock = metadata.lastProcessedBlock,
chainId = metadata.chainId,
Expand Down
2 changes: 1 addition & 1 deletion vendor/zerokit
8 changes: 4 additions & 4 deletions waku/waku_rln_relay/group_manager/on_chain/group_manager.nim
Original file line number Diff line number Diff line change
Expand Up @@ -666,11 +666,11 @@ method init*(g: OnchainGroupManager): Future[void] {.async.} =

g.idCredentials = some(keystoreCred.identityCredential)

let metadataGetRes = g.rlnInstance.getMetadata()
if metadataGetRes.isErr():
let metadataGetOptRes = g.rlnInstance.getMetadata()
if metadataGetOptRes.isErr():
warn "could not initialize with persisted rln metadata"
else:
let metadata = metadataGetRes.get()
elif metadataGetOptRes.get().isSome():
let metadata = metadataGetOptRes.get().get()
if metadata.chainId != uint64(g.chainId.get()):
raise newException(ValueError, "persisted data: chain id mismatch")

Expand Down
13 changes: 8 additions & 5 deletions waku/waku_rln_relay/rln/wrappers.nim
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ proc setMetadata*(rlnInstance: ptr RLN, metadata: RlnMetadata): RlnRelayResult[v
return err("could not set the metadata")
return ok()

proc getMetadata*(rlnInstance: ptr RLN): RlnRelayResult[RlnMetadata] =
proc getMetadata*(rlnInstance: ptr RLN): RlnRelayResult[Option[RlnMetadata]] =
## gets the metadata of the RLN instance
## returns an error if the metadata could not be retrieved
## returns the metadata if the metadata is retrieved successfully
Expand All @@ -514,6 +514,9 @@ proc getMetadata*(rlnInstance: ptr RLN): RlnRelayResult[RlnMetadata] =
return err("could not get the metadata")
trace "metadata length", metadataLen = metadata.len

if metadata.len == 0:
return ok(none(RlnMetadata))

let
lastProcessedBlockOffset = 0
chainIdOffset = lastProcessedBlockOffset + 8
Expand All @@ -536,7 +539,7 @@ proc getMetadata*(rlnInstance: ptr RLN): RlnRelayResult[RlnMetadata] =
let validRootsBytes = metadataBytes[validRootsOffset..metadataBytes.high]
validRoots = MerkleNodeSeq.deserialize(validRootsBytes)

return ok(RlnMetadata(lastProcessedBlock: lastProcessedBlock,
chainId: chainId,
contractAddress: "0x" & contractAddress,
validRoots: validRoots))
return ok(some(RlnMetadata(lastProcessedBlock: lastProcessedBlock,
chainId: chainId,
contractAddress: "0x" & contractAddress,
validRoots: validRoots)))
Loading