diff --git a/codex/slots/proofs/backends/converters.nim b/codex/slots/proofs/backends/converters.nim index b0c197f8..5506a9db 100644 --- a/codex/slots/proofs/backends/converters.nim +++ b/codex/slots/proofs/backends/converters.nim @@ -25,8 +25,6 @@ type CircomInputs* = Inputs VerifyResult* = Atomic[bool] -export VerifyResult - proc toCircomInputs*(inputs: ProofInputs[Poseidon2Hash]): CircomInputs = var slotIndex = inputs.slotIndex.toF.toBytes.toArray32 diff --git a/tests/codex/slots/backends/testcircomcompat.nim b/tests/codex/slots/backends/testcircomcompat.nim index b61d4f18..a9e1fdf3 100644 --- a/tests/codex/slots/backends/testcircomcompat.nim +++ b/tests/codex/slots/backends/testcircomcompat.nim @@ -26,29 +26,36 @@ suite "Test Circom Compat Backend - control inputs": var circom: CircomCompat proofInputs: ProofInputs[Poseidon2Hash] + taskpool: Taskpool setup: let inputData = readFile("tests/circuits/fixtures/input.json") inputJson = !JsonNode.parse(inputData) + taskpool = Taskpool.new() proofInputs = Poseidon2Hash.jsonToProofInput(inputJson) - circom = CircomCompat.init(r1cs, wasm, zkey) + circom = CircomCompat.init(r1cs, wasm, zkey, taskpool = taskpool) teardown: circom.release() # this comes from the rust FFI + taskpool.shutdown() test "Should verify with correct inputs": - let proof = circom.prove(proofInputs).tryGet + let proof = (await circom.prove(proofInputs)).tryGet - check circom.verify(proof, proofInputs).tryGet + var resp = (await circom.verify(proof, proofInputs)).tryGet + + check resp test "Should not verify with incorrect inputs": proofInputs.slotIndex = 1 # change slot index - let proof = circom.prove(proofInputs).tryGet + let proof = (await circom.prove(proofInputs)).tryGet - check circom.verify(proof, proofInputs).tryGet == false + var resp = (await circom.verify(proof, proofInputs)).tryGet + + check resp == false suite "Test Circom Compat Backend": let @@ -77,6 +84,7 @@ suite "Test Circom Compat Backend": challenge: array[32, byte] builder: Poseidon2Builder sampler: Poseidon2Sampler + taskpool: Taskpool setup: let @@ -91,8 +99,9 @@ suite "Test Circom Compat Backend": builder = Poseidon2Builder.new(store, verifiable).tryGet sampler = Poseidon2Sampler.new(slotId, store, builder).tryGet + taskpool = Taskpool.new() - circom = CircomCompat.init(r1cs, wasm, zkey) + circom = CircomCompat.init(r1cs, wasm, zkey, taskpool = taskpool) challenge = 1234567.toF.toBytes.toArray32 proofInputs = (await sampler.getProofInput(challenge, samples)).tryGet @@ -101,15 +110,20 @@ suite "Test Circom Compat Backend": circom.release() # this comes from the rust FFI await repoTmp.destroyDb() await metaTmp.destroyDb() + taskpool.shutdown() test "Should verify with correct input": - var proof = circom.prove(proofInputs).tryGet + var proof = (await circom.prove(proofInputs)).tryGet - check circom.verify(proof, proofInputs).tryGet + var resp = (await circom.verify(proof, proofInputs)).tryGet + + check resp == true test "Should not verify with incorrect input": proofInputs.slotIndex = 1 # change slot index - let proof = circom.prove(proofInputs).tryGet + let proof = (await circom.prove(proofInputs)).tryGet - check circom.verify(proof, proofInputs).tryGet == false + var resp = (await circom.verify(proof, proofInputs)).tryGet + + check resp == false diff --git a/tests/codex/slots/testbackendfactory.nim b/tests/codex/slots/testbackendfactory.nim index a24bc41a..3ed03857 100644 --- a/tests/codex/slots/testbackendfactory.nim +++ b/tests/codex/slots/testbackendfactory.nim @@ -52,7 +52,7 @@ suite "Test BackendFactory": circomWasm: InputFile("tests/circuits/fixtures/proof_main.wasm"), circomZkey: InputFile("tests/circuits/fixtures/proof_main.zkey"), ) - backend = config.initializeBackend(utilsMock).tryGet + backend = config.initializeBackend(utilsMock, taskpool = nil).tryGet check: backend.vkp != nil @@ -73,7 +73,7 @@ suite "Test BackendFactory": # will be picked up as local files: circuitDir: OutDir("tests/circuits/fixtures"), ) - backend = config.initializeBackend(utilsMock).tryGet + backend = config.initializeBackend(utilsMock, taskpool = nil).tryGet check: backend.vkp != nil @@ -91,7 +91,7 @@ suite "Test BackendFactory": marketplaceAddress: EthAddress.example.some, circuitDir: OutDir(circuitDir), ) - backendResult = config.initializeBackend(utilsMock) + backendResult = config.initializeBackend(utilsMock, taskpool = nil) check: backendResult.isErr diff --git a/tests/codex/slots/testprover.nim b/tests/codex/slots/testprover.nim index 1a7c99a4..dc955569 100644 --- a/tests/codex/slots/testprover.nim +++ b/tests/codex/slots/testprover.nim @@ -19,7 +19,6 @@ import ./helpers import ../helpers suite "Test Prover": - var backend: AnyBackend let samples = 5 blockSize = DefaultBlockSize @@ -31,6 +30,8 @@ suite "Test Prover": var store: BlockStore prover: Prover + backend: AnyBackend + taskpool: Taskpool setup: let @@ -46,8 +47,8 @@ suite "Test Prover": circomZkey: InputFile("tests/circuits/fixtures/proof_main.zkey"), numProofSamples: samples, ) - - backend = config.initializeBackend(taskpool = Taskpool.new()).tryGet() + taskpool = Taskpool.new() + backend = config.initializeBackend(taskpool = taskpool).tryGet() store = RepoStore.new(repoDs, metaDs) prover = Prover.new(store, backend, config.numProofSamples) @@ -55,6 +56,7 @@ suite "Test Prover": teardown: await repoTmp.destroyDb() await metaTmp.destroyDb() + taskpool.shutdown() test "Should sample and prove a slot": let (_, _, verifiable) = await createVerifiableManifest( @@ -90,6 +92,37 @@ suite "Test Prover": check: (await prover.verify(proof, inputs)).tryGet == true + test "Should concurrently prove/verify": + const iterations = 5 + + var proveTasks = newSeq[Future[?!(AnyProofInputs, AnyProof)]]() + var verifyTasks = newSeq[Future[?!bool]]() + + for i in 0 ..< iterations: + # create multiple prove tasks + let (_, _, verifiable) = await createVerifiableManifest( + store, + 8, # number of blocks in the original dataset (before EC) + 5, # ecK + 3, # ecM + blockSize, + cellSize, + ) + + proveTasks.add(prover.prove(1, verifiable, challenge)) + + let proveResults = await allFinished(proveTasks) + # + for i in 0 ..< proveResults.len: + var (inputs, proofs) = proveTasks[i].read().tryGet() + verifyTasks.add(prover.verify(proofs, inputs)) + + let verifyResults = await allFinished(verifyTasks) + + for i in 0 ..< verifyResults.len: + check: + verifyResults[i].read().isErr == false + test "Should complete prove/verify task when cancelled": let (_, _, verifiable) = await createVerifiableManifest( store,