From 9e78970b2156f6f09af82bb553c3381fb7349d4c Mon Sep 17 00:00:00 2001 From: Dmitriy Ryajov Date: Mon, 29 Jan 2024 14:58:14 -0600 Subject: [PATCH] move prover logic from node --- codex/slots/proofs/prover.nim | 122 +++++++++++++++++++++++----------- 1 file changed, 85 insertions(+), 37 deletions(-) diff --git a/codex/slots/proofs/prover.nim b/codex/slots/proofs/prover.nim index ac0efa6b..4ae1dbb8 100644 --- a/codex/slots/proofs/prover.nim +++ b/codex/slots/proofs/prover.nim @@ -1,46 +1,94 @@ -# ## Nim-Codex -# ## Copyright (c) 2024 Status Research & Development GmbH -# ## Licensed under either of -# ## * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE)) -# ## * MIT license ([LICENSE-MIT](LICENSE-MIT)) -# ## at your option. -# ## This file may not be copied, modified, or distributed except according to -# ## those terms. -# ## +## Nim-Codex +## Copyright (c) 2024 Status Research & Development GmbH +## Licensed under either of +## * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE)) +## * MIT license ([LICENSE-MIT](LICENSE-MIT)) +## at your option. +## This file may not be copied, modified, or distributed except according to +## those terms. +## -# import pkg/chronos -# import pkg/circomcompat -# import pkg/poseidon2 -# import pkg/questionable/results +import pkg/chronos +import pkg/chronicles +import pkg/circomcompat +import pkg/poseidon2 +import pkg/questionable/results -# import ../../merkletree +import pkg/libp2p/cid -# import ./backends -# import ../types +import ../../manifest +import ../../merkletree +import ../../stores +import ../../market -# type -# Prover*[HashT, ProofT, BackendT] = ref object of RootObj -# backend: BackendT +import ../builder +import ../sampler -# AnyProof* = Proof -# AnyHash* = Poseidon2Hash -# AnyProverBacked* = CircomCompat -# AnyProver* = Prover[AnyHash, AnyProof, AnyProverBacked] +import ./backends +import ../types -# proc prove*( -# self: AnyProver, -# input: ProofInput[AnyHash]): Future[?!AnyProof] {.async.} = -# ## Prove a statement using backend. -# ## Returns a future that resolves to a proof. +export backends -# ## TODO: implement -# # discard self.backend.prove(input) +type + AnyProof* = CircomProof + AnyInputs* = CircomInputs + AnyKeys* = CircomKey + AnyHash* = Poseidon2Hash + AnyBackend* = CircomCompat -# proc verify*( -# self: AnyProver, -# proof: AnyProof): Future[?!bool] {.async.} = -# ## Prove a statement using backend. -# ## Returns a future that resolves to a proof. + Prover* = ref object of RootObj + backend: AnyBackend + store: BlockStore -# ## TODO: implement -# # discard self.backend.verify(proof) +proc prove*( + self: Prover, + slotIdx: int, + manifest: Manifest, + challenge: ProofChallenge): Future[?!AnyProof] {.async.} = + ## Prove a statement using backend. + ## Returns a future that resolves to a proof. + + logScope: + cid = manifest.treeCid + slot = slotIdx + challenge = challenge + + trace "Received proof challenge" + + without builder =? Poseidon2Builder.new(self.store, manifest), err: + error "Unable to create slots builder", err = err.msg + return failure(err) + + without sampler =? Poseidon2Sampler.new(slotIdx, self.store, builder), err: + error "Unable to create data sampler", err = err.msg + return failure(err) + + without proofInput =? await sampler.getProofInput(challenge, nSamples = 3), err: + error "Unable to get proof input for slot", err = err.msg + return failure(err) + + # prove slot + without proof =? self.backend.prove(proofInput), err: + error "Unable to prove slot", err = err.msg + return failure(err) + + success proof + +proc verify*( + self: Prover, + proof: AnyProof, + inputs: AnyInputs, + vpk: AnyKeys): Future[?!bool] {.async.} = + ## Prove a statement using backend. + ## Returns a future that resolves to a proof. + + discard self.backend.verify(proof, inputs, vpk) + +proc new*( + _: type Prover, + store: BlockStore, + backend: AnyBackend): Prover = + + Prover( + backend: backend, + store: store)