mirror of
https://github.com/logos-messaging/logos-messaging-nim.git
synced 2026-01-05 15:33:08 +00:00
chore: benchmark for proof generation and verification (#3567)
This commit is contained in:
parent
2691dcb325
commit
794c3a850d
@ -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()
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user