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
78
79
use snarkvm_algorithms::traits::SNARK;
use snarkvm_fields::PrimeField;
use snarkvm_r1cs::{errors::SynthesisError, ConstraintSystem};
use crate::{
traits::alloc::AllocGadget,
AllocBytesGadget,
FromFieldElementsGadget,
MergeGadget,
ToBitsLEGadget,
ToBytesGadget,
ToConstraintFieldGadget,
ToMinimalBitsGadget,
UInt8,
};
pub trait PrepareGadget<T, F: PrimeField> {
fn prepare<CS: ConstraintSystem<F>>(&self, cs: CS) -> Result<T, SynthesisError>;
}
pub trait SNARKVerifierGadget<S: SNARK> {
type PreparedVerificationKeyGadget: Clone;
type VerificationKeyGadget: AllocGadget<S::VerifyingKey, S::BaseField>
+ ToConstraintFieldGadget<S::BaseField>
+ ToBytesGadget<S::BaseField>
+ PrepareGadget<Self::PreparedVerificationKeyGadget, S::BaseField>
+ AllocBytesGadget<Vec<u8>, S::BaseField>
+ ToMinimalBitsGadget<S::BaseField>;
type ProofGadget: AllocGadget<S::Proof, S::BaseField> + AllocBytesGadget<Vec<u8>, S::BaseField>;
type InputGadget: Clone
+ AllocGadget<Vec<S::ScalarField>, S::BaseField>
+ ToBitsLEGadget<S::BaseField>
+ FromFieldElementsGadget<S::ScalarField, S::BaseField>
+ MergeGadget<S::BaseField>
+ ?Sized;
fn input_gadget_from_bytes<CS: ConstraintSystem<S::BaseField>>(
cs: CS,
bytes: &[UInt8],
) -> Result<Self::InputGadget, SynthesisError>;
fn check_verify<CS: ConstraintSystem<S::BaseField>>(
mut cs: CS,
verification_key: &Self::VerificationKeyGadget,
input: &Self::InputGadget,
proof: &Self::ProofGadget,
) -> Result<(), SynthesisError> {
let prepared_verification_key = verification_key.prepare(cs.ns(|| "prepare"))?;
Self::prepared_check_verify(
cs.ns(|| "prepared verification"),
&prepared_verification_key,
input,
proof,
)
}
fn prepared_check_verify<CS: ConstraintSystem<S::BaseField>>(
cs: CS,
prepared_verification_key: &Self::PreparedVerificationKeyGadget,
input: &Self::InputGadget,
proof: &Self::ProofGadget,
) -> Result<(), SynthesisError>;
}