Skip to content

Commit

Permalink
consensus: add stub groth16::Verifier
Browse files Browse the repository at this point in the history
Co-authored-by: Deirdre Connolly <deirdre@zfnd.org>
  • Loading branch information
hdevalence and dconnolly committed Oct 20, 2020
1 parent eb56666 commit 9dc8d76
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 1 deletion.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion zebra-consensus/Cargo.toml
Expand Up @@ -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"
Expand All @@ -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"
Expand Down
1 change: 1 addition & 0 deletions zebra-consensus/src/primitives.rs
@@ -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.
Expand Down
55 changes: 55 additions & 0 deletions zebra-consensus/src/primitives/groth16.rs
@@ -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!()
}
}

0 comments on commit 9dc8d76

Please sign in to comment.