2024-01-29 20:58:14 +00:00
|
|
|
## 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/chronicles
|
|
|
|
import pkg/circomcompat
|
|
|
|
import pkg/poseidon2
|
|
|
|
import pkg/questionable/results
|
|
|
|
|
|
|
|
import pkg/libp2p/cid
|
|
|
|
|
|
|
|
import ../../manifest
|
|
|
|
import ../../merkletree
|
|
|
|
import ../../stores
|
|
|
|
import ../../market
|
|
|
|
|
|
|
|
import ../builder
|
|
|
|
import ../sampler
|
|
|
|
|
|
|
|
import ./backends
|
|
|
|
import ../types
|
|
|
|
|
|
|
|
export backends
|
|
|
|
|
|
|
|
type
|
|
|
|
AnyProof* = CircomProof
|
|
|
|
AnyInputs* = CircomInputs
|
|
|
|
AnyKeys* = CircomKey
|
|
|
|
AnyHash* = Poseidon2Hash
|
|
|
|
AnyBackend* = CircomCompat
|
|
|
|
|
|
|
|
Prover* = ref object of RootObj
|
|
|
|
backend: AnyBackend
|
|
|
|
store: BlockStore
|
|
|
|
|
|
|
|
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)
|