move prover logic from node

This commit is contained in:
Dmitriy Ryajov 2024-01-29 14:58:14 -06:00
parent 79088c2383
commit 9e78970b21
No known key found for this signature in database
GPG Key ID: DA8C680CE7C657A4

View File

@ -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)