1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use core::fmt::Debug;
use snarkvm_algorithms::traits::SNARK;
use snarkvm_fields::{Field, PrimeField};
use snarkvm_r1cs::{errors::SynthesisError, ConstraintSystem};
use crate::{
bits::{Boolean, ToBitsBEGadget, ToBytesGadget},
traits::alloc::{AllocBytesGadget, AllocGadget},
FromFieldElementsGadget,
};
pub trait SNARKVerifierGadget<N: SNARK, F: Field> {
type VerificationKeyGadget: AllocGadget<N::VerifyingKey, F> + AllocBytesGadget<Vec<u8>, F> + ToBytesGadget<F>;
type ProofGadget: AllocGadget<N::Proof, F> + AllocBytesGadget<Vec<u8>, F>;
type Input: ToBitsBEGadget<F> + Clone + ?Sized;
fn check_verify<'a, CS: ConstraintSystem<F>, I: Iterator<Item = Self::Input>>(
cs: CS,
verification_key: &Self::VerificationKeyGadget,
input: I,
proof: &Self::ProofGadget,
) -> Result<(), SynthesisError>;
}
pub trait SNARKGadget<F: PrimeField, CF: PrimeField, S: SNARK> {
type PreparedVerifyingKeyVar: AllocGadget<S::PreparedVerifyingKey, CF> + Clone;
type VerifyingKeyVar: AllocGadget<S::VerifyingKey, CF> + ToBytesGadget<CF> + Clone;
type InputVar: AllocGadget<Vec<F>, CF> + Clone + FromFieldElementsGadget<F, CF>;
type ProofVar: AllocGadget<S::Proof, CF> + Clone;
type VerifierSize: PartialOrd + Clone + Debug;
fn verifier_size(circuit_vk: &S::VerifyingKey) -> Self::VerifierSize;
fn verify_with_processed_vk<CS: ConstraintSystem<CF>>(
cs: CS,
circuit_pvk: &Self::PreparedVerifyingKeyVar,
x: &Self::InputVar,
proof: &Self::ProofVar,
) -> Result<Boolean, SynthesisError>;
fn verify<CS: ConstraintSystem<CF>>(
cs: CS,
circuit_vk: &Self::VerifyingKeyVar,
x: &Self::InputVar,
proof: &Self::ProofVar,
) -> Result<Boolean, SynthesisError>;
}