consensus: add stub groth16::Verifier

Co-authored-by: Deirdre Connolly <deirdre@zfnd.org>
This commit is contained in:
Henry de Valence 2020-10-16 12:50:29 -07:00 committed by Deirdre Connolly
parent eb56666d30
commit 9dc8d76d68
4 changed files with 59 additions and 1 deletions

1
Cargo.lock generated
View File

@ -3186,6 +3186,7 @@ dependencies = [
"displaydoc",
"futures",
"futures-util",
"jubjub 0.5.1",
"metrics",
"once_cell",
"rand 0.7.3",

View File

@ -8,6 +8,8 @@ edition = "2018"
[dependencies]
chrono = "0.4.19"
color-eyre = "0.5"
displaydoc = "0.1.7"
jubjub = "0.5.1"
once_cell = "1.4"
rand = "0.7"
redjubjub = "0.2"
@ -28,7 +30,6 @@ tower-batch = { path = "../tower-batch/" }
zebra-chain = { path = "../zebra-chain" }
zebra-state = { path = "../zebra-state" }
zebra-script = { path = "../zebra-script" }
displaydoc = "0.1.7"
[dev-dependencies]
rand = "0.7"

View File

@ -1,5 +1,6 @@
//! Asynchronous verification of cryptographic primitives.
pub mod groth16;
pub mod redjubjub;
/// The maximum batch size for any of the batch verifiers.

View File

@ -0,0 +1,55 @@
use std::{
future::Future,
pin::Pin,
task::{Context, Poll},
};
use tower::Service;
use zebra_chain::primitives::Groth16Proof;
use crate::BoxError;
/// Provides verification of Groth16 proofs for a specific statement.
///
/// Groth16 proofs require a proof verification key; the [`Verifier`] type is
/// responsible for ownership of the PVK.
pub struct Verifier {
// XXX this needs to hold on to a verification key
}
impl Verifier {
/// Create a new Groth16 verifier, supplying the encoding of the verification key.
pub fn new(_encoded_verification_key: &[u8]) -> Result<Self, BoxError> {
// parse and turn into a bellman type,
// so that users don't have to have the entire bellman api
unimplemented!();
}
}
// XXX this is copied from the WIP batch bellman impl,
// in the future, replace with a re export
pub struct Item {
pub proof: Groth16Proof,
pub public_inputs: Vec<jubjub::Fr>,
}
// XXX in the future, Verifier will implement
// Service<BatchControl<Item>>> and be wrapped in a Batch
// to get a Service<Item>
// but for now, just implement Service<Item> and do unbatched verif.
//impl Service<BatchControl<Item>> for Verifier {
impl Service<Item> for Verifier {
type Response = ();
type Error = BoxError;
type Future = Pin<Box<dyn Future<Output = Result<(), BoxError>> + Send + 'static>>;
fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
Poll::Ready(Ok(()))
}
fn call(&mut self, _req: Item) -> Self::Future {
unimplemented!()
}
}