chore: benchmark for proof generation and verification (#3567)

This commit is contained in:
Darshan K 2025-09-23 17:37:56 +05:30 committed by GitHub
parent 2691dcb325
commit 794c3a850d
2 changed files with 43 additions and 35 deletions

View File

@ -11,32 +11,27 @@ import
],
tests/waku_rln_relay/utils_onchain
proc main(): Future[string] {.async, gcsafe.} =
# Spin up a local Ethereum JSON-RPC (Anvil) and deploy the RLN contract
let anvilProc = runAnvil()
defer:
stopAnvil(anvilProc)
# Set up an On-chain group manager (includes contract deployment)
let manager = await setupOnchainGroupManager()
(await manager.init()).isOkOr:
raiseAssert $error
proc benchmark(
manager: OnChainGroupManager, registerCount: int, messageLimit: int
): Future[string] {.async, gcsafe.} =
# Register a new member so that we can later generate proofs
let idCredentials = generateCredentials(manager.rlnInstance)
let idCredentials = generateCredentials(manager.rlnInstance, registerCount)
try:
await manager.register(idCredentials, UserMessageLimit(100))
except Exception, CatchableError:
assert false, "exception raised: " & getCurrentExceptionMsg()
var start_time = getTime()
for i in 0 .. registerCount - 1:
try:
await manager.register(idCredentials[i], UserMessageLimit(messageLimit + 1))
except Exception, CatchableError:
assert false, "exception raised: " & getCurrentExceptionMsg()
let rootUpdated = await manager.updateRoots()
debug "registration finished",
iter = i, elapsed_ms = (getTime() - start_time).inMilliseconds
if rootUpdated:
let proofResult = await manager.fetchMerkleProofElements()
if proofResult.isErr():
error "Failed to fetch Merkle proof", error = proofResult.error
manager.merkleProofCache = proofResult.get()
discard await manager.updateRoots()
let proofResult = await manager.fetchMerkleProofElements()
if proofResult.isErr():
error "Failed to fetch Merkle proof", error = proofResult.error
manager.merkleProofCache = proofResult.get()
let epoch = default(Epoch)
debug "epoch in bytes", epochHex = epoch.inHex()
@ -45,22 +40,35 @@ proc main(): Future[string] {.async, gcsafe.} =
var proofGenTimes: seq[times.Duration] = @[]
var proofVerTimes: seq[times.Duration] = @[]
for i in 1 .. 100:
var time = getTime()
start_time = getTime()
for i in 1 .. messageLimit:
var generate_time = getTime()
let proof = manager.generateProof(data, epoch, MessageId(i.uint8)).valueOr:
raiseAssert $error
proofGenTimes.add(getTime() - time)
proofGenTimes.add(getTime() - generate_time)
time = getTime()
let verify_time = getTime()
let ok = manager.verifyProof(data, proof).valueOr:
raiseAssert $error
proofVerTimes.add(getTime() - time)
proofVerTimes.add(getTime() - verify_time)
debug "iteration finished",
iter = i, elapsed_ms = (getTime() - start_time).inMilliseconds
echo "Proof generation times: ", sum(proofGenTimes) div len(proofGenTimes)
echo "Proof verification times: ", sum(proofVerTimes) div len(proofVerTimes)
proc main() =
# Start a local Ethereum JSON-RPC (Anvil) so that the group-manager setup can connect.
let anvilProc = runAnvil()
defer:
stopAnvil(anvilProc)
# Set up an On-chain group manager (includes contract deployment)
let manager = waitFor setupOnchainGroupManager()
(waitFor manager.init()).isOkOr:
raiseAssert $error
discard waitFor benchmark(manager, 200, 20)
when isMainModule:
try:
discard waitFor main()
except CatchableError as e:
raise e
main()

View File

@ -585,12 +585,12 @@ proc setupOnchainGroupManager*(
# If the generated account wishes to register a membership, it needs to approve the contract to spend its tokens
let tokenApprovalResult = await approveTokenAllowanceAndVerify(
web3,
acc, # owner
acc,
privateKey,
testTokenAddress, # ERC20 token address
contractAddress, # spender - the proxy contract that will spend the tokens
testTokenAddress,
contractAddress,
ethToWei(200.u256),
some(0.u256), # expected allowance before approval
some(0.u256),
)
assert tokenApprovalResult.isOk, tokenApprovalResult.error()