Skip to content

Commit 8846bd4

Browse files
committed
cleanup, doc
1 parent 4d2be34 commit 8846bd4

File tree

10 files changed

+117
-311
lines changed

10 files changed

+117
-311
lines changed

aggregator/src/recursion.rs

+18-15
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,46 @@
55
66
/// Circuit implementation of recursion circuit.
77
mod circuit;
8+
9+
/// Common functionality utilised by the recursion circuit.
810
mod common;
11+
912
/// Config for recursion circuit
1013
mod config;
14+
15+
/// Some utility functions.
1116
mod util;
1217

18+
pub use circuit::RecursionCircuit;
1319
pub(crate) use common::dynamic_verify;
1420
pub use util::{gen_recursion_pk, initial_recursion_snark};
1521

16-
// define the halo2base importing from snark_verifier;
17-
use snark_verifier::loader::halo2::halo2_ecc::halo2_base as sv_halo2_base;
18-
use sv_halo2_base::halo2_proofs;
19-
// fix the circuit on Bn256
2022
use halo2_proofs::{
2123
halo2curves::{
2224
bn256::{Bn256, Fq, Fr, G1Affine},
2325
group::ff::Field,
2426
},
2527
plonk::{Circuit, ConstraintSystem, Error, ProvingKey, Selector, VerifyingKey},
2628
};
27-
// exports Snark and specs for F-S scheme
28-
use snark_verifier_sdk::{
29-
types::{PoseidonTranscript, POSEIDON_SPEC},
30-
CircuitExt, Snark,
31-
};
32-
33-
use crate::constants::{BITS, LIMBS};
34-
3529
use itertools::Itertools;
3630
use rand::Rng;
3731
use snark_verifier::{
38-
loader::{native::NativeLoader, Loader, ScalarLoader},
32+
loader::{
33+
halo2::halo2_ecc::halo2_base as sv_halo2_base, native::NativeLoader, Loader, ScalarLoader,
34+
},
3935
system::halo2::{compile, Config},
4036
verifier::{PlonkProof, PlonkVerifier},
4137
};
38+
use snark_verifier_sdk::{
39+
types::{PoseidonTranscript, POSEIDON_SPEC},
40+
CircuitExt, Snark,
41+
};
42+
use sv_halo2_base::halo2_proofs;
43+
44+
use crate::constants::{BITS, LIMBS};
4245

46+
/// Any data that can be recursively bundled must implement the described state transition
47+
/// trait.
4348
pub trait StateTransition: Sized {
4449
type Input: Clone;
4550
type Circuit: CircuitExt<Fr>;
@@ -109,5 +114,3 @@ pub trait StateTransition: Sized {
109114
(start..end).collect()
110115
}
111116
}
112-
113-
pub use circuit::RecursionCircuit;

aggregator/src/recursion/circuit.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#![allow(clippy::type_complexity)]
2+
use std::{fs::File, iter, marker::PhantomData, rc::Rc};
23

3-
use super::*;
4-
use crate::param::ConfigParams as BatchCircuitConfigParams;
54
use halo2_proofs::{
65
circuit::{Cell, Layouter, SimpleFloorPlanner, Value},
76
poly::{commitment::ParamsProver, kzg::commitment::ParamsKZG},
@@ -21,12 +20,15 @@ use snark_verifier_sdk::{
2120
types::{Halo2Loader, Plonk},
2221
SnarkWitness,
2322
};
24-
use std::{fs::File, iter, marker::PhantomData, rc::Rc};
2523
use sv_halo2_base::{
2624
gates::GateInstructions, halo2_proofs, AssignedValue, Context, ContextParams,
2725
QuantumCell::Existing,
2826
};
2927

28+
use crate::param::ConfigParams as BatchCircuitConfigParams;
29+
30+
use super::*;
31+
3032
type Svk = KzgSuccinctVerifyingKey<G1Affine>;
3133
type Pcs = Kzg<Bn256, Bdfg21>;
3234
type As = KzgAs<Pcs>;

aggregator/src/recursion/common.rs

+4-228
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use super::*;
1+
use std::rc::Rc;
2+
23
use snark_verifier::{
34
loader::halo2::EccInstructions,
45
pcs::{kzg::KzgAccumulator, MultiOpenScheme, PolynomialCommitmentScheme},
@@ -8,225 +9,8 @@ use snark_verifier_sdk::{
89
types::{BaseFieldEccChip, Halo2Loader, Plonk},
910
SnarkWitness,
1011
};
11-
use std::rc::Rc;
12-
13-
// pub const LIMBS: usize = 3;
14-
// pub const BITS: usize = 88;
15-
// pub const T: usize = 5;
16-
// pub const RATE: usize = 4;
17-
// pub const R_F: usize = 8;
18-
// pub const R_P: usize = 60;
19-
20-
// pub type Svk = KzgSuccinctVerifyingKey<G1Affine>;
21-
// pub type As = KzgAs<Pcs>;
22-
// pub use snark_verifier_sdk::types::{Plonk, Halo2Loader, BaseFieldEccChip};
23-
// pub type Poseidon<L> = hash::Poseidon<Fr, L, T, RATE>;
24-
// // TODO: replace with POSEIDON_SPEC
25-
// pub type PoseidonTranscript<L, S> =
26-
// halo2::transcript::halo2::PoseidonTranscript<G1Affine, L, S, T, RATE, R_F, R_P>;
27-
28-
// pub struct Snark {
29-
// pub protocol: Protocol<G1Affine>,
30-
// pub instances: Vec<Vec<Fr>>,
31-
// pub proof: Vec<u8>,
32-
// }
33-
34-
// impl Snark {
35-
// pub fn new(protocol: Protocol<G1Affine>, instances: Vec<Vec<Fr>>, proof: Vec<u8>) -> Self {
36-
// Self { protocol, instances, proof }
37-
// }
38-
// }
39-
40-
// impl From<Snark> for SnarkWitness {
41-
// fn from(snark: Snark) -> Self {
42-
// Self {
43-
// protocol: snark.protocol,
44-
// instances: snark
45-
// .instances
46-
// .into_iter()
47-
// .map(|instances| instances.into_iter().map(Value::known).collect_vec())
48-
// .collect(),
49-
// proof: Value::known(snark.proof),
50-
// }
51-
// }
52-
// }
53-
54-
// #[derive(Clone)]
55-
// pub struct SnarkWitness {
56-
// pub protocol: Protocol<G1Affine>,
57-
// pub instances: Vec<Vec<Value<Fr>>>,
58-
// pub proof: Value<Vec<u8>>,
59-
// }
60-
61-
// impl SnarkWitness {
62-
// pub fn without_witnesses(&self) -> Self {
63-
// SnarkWitness {
64-
// protocol: self.protocol.clone(),
65-
// instances: self
66-
// .instances
67-
// .iter()
68-
// .map(|instances| vec![Value::unknown(); instances.len()])
69-
// .collect(),
70-
// proof: Value::unknown(),
71-
// }
72-
// }
73-
74-
// pub fn proof(&self) -> Value<&[u8]> {
75-
// self.proof.as_ref().map(Vec::as_slice)
76-
// }
77-
// }
78-
79-
// pub fn gen_pk<C: Circuit<Fr>>(params: &ParamsKZG<Bn256>, circuit: &C) -> ProvingKey<G1Affine> {
80-
// let vk = keygen_vk(params, circuit).unwrap();
81-
// keygen_pk(params, vk, circuit).unwrap()
82-
// }
83-
84-
// pub fn gen_proof<C: Circuit<Fr>>(
85-
// params: &ParamsKZG<Bn256>,
86-
// pk: &ProvingKey<G1Affine>,
87-
// circuit: C,
88-
// rng: impl Rng + Send,
89-
// instances: Vec<Vec<Fr>>,
90-
// ) -> Vec<u8> {
91-
// if params.k() > 3 {
92-
// let mock = start_timer!(|| "Mock prover");
93-
// MockProver::run(params.k(), &circuit, instances.clone())
94-
// .unwrap()
95-
// .assert_satisfied_par();
96-
// end_timer!(mock);
97-
// }
9812

99-
// let instances = instances.iter().map(Vec::as_slice).collect_vec();
100-
// let proof = {
101-
// let mut transcript = PoseidonTranscript::<NativeLoader, _>::new(Vec::new());
102-
// create_proof::<_, ProverGWC<_>, _, _, _, _>(
103-
// params,
104-
// pk,
105-
// &[circuit],
106-
// &[instances.as_slice()],
107-
// rng,
108-
// &mut transcript,
109-
// )
110-
// .unwrap();
111-
// transcript.finalize()
112-
// };
113-
114-
// let accept = {
115-
// let mut transcript = PoseidonTranscript::<NativeLoader, _>::new(proof.as_slice());
116-
// VerificationStrategy::<_, VerifierGWC<_>>::finalize(
117-
// verify_proof::<_, VerifierGWC<_>, _, _, _>(
118-
// params.verifier_params(),
119-
// pk.get_vk(),
120-
// AccumulatorStrategy::new(params.verifier_params()),
121-
// &[instances.as_slice()],
122-
// &mut transcript,
123-
// )
124-
// .unwrap(),
125-
// )
126-
// };
127-
// assert!(accept);
128-
129-
// proof
130-
// }
131-
132-
// pub fn gen_snark<ConcreteCircuit: CircuitExt<Fr>>(
133-
// params: &ParamsKZG<Bn256>,
134-
// pk: &ProvingKey<G1Affine>,
135-
// circuit: ConcreteCircuit,
136-
// rng: impl Rng + Send,
137-
// ) -> Snark {
138-
// let protocol = compile(
139-
// params,
140-
// pk.get_vk(),
141-
// Config::kzg()
142-
// .with_num_instance(ConcreteCircuit::num_instance())
143-
// .with_accumulator_indices(ConcreteCircuit::accumulator_indices()),
144-
// );
145-
146-
// let instances = circuit.instances();
147-
// let proof = gen_proof(params, pk, circuit, rng, instances.clone());
148-
149-
// Snark::new(protocol, instances, proof)
150-
// }
151-
152-
// pub fn gen_dummy_snark<ConcreteCircuit: CircuitExt<Fr>>(
153-
// params: &ParamsKZG<Bn256>,
154-
// vk: Option<&VerifyingKey<G1Affine>>,
155-
// rng: impl Rng + Send,
156-
// ) -> Snark {
157-
// use std::{iter, marker::PhantomData};
158-
// struct CsProxy<F, C>(PhantomData<(F, C)>);
159-
160-
// impl<F: Field, C: CircuitExt<F>> Circuit<F> for CsProxy<F, C> {
161-
// type Config = C::Config;
162-
// type FloorPlanner = C::FloorPlanner;
163-
// #[cfg(feature = "circuit-params")]
164-
// type Params = ();
165-
166-
// fn without_witnesses(&self) -> Self {
167-
// CsProxy(PhantomData)
168-
// }
169-
170-
// fn configure(meta: &mut ConstraintSystem<F>) -> Self::Config {
171-
// C::configure(meta)
172-
// }
173-
174-
// fn synthesize(
175-
// &self,
176-
// config: Self::Config,
177-
// mut layouter: impl Layouter<F>,
178-
// ) -> Result<(), Error> {
179-
// // when `C` has simple selectors, we tell `CsProxy` not to over-optimize the selectors (e.g., compressing them all into one) by turning all selectors on in the first row
180-
// // currently this only works if all simple selector columns are used in the actual circuit and there are overlaps amongst all enabled selectors (i.e., the actual circuit will not optimize constraint system further)
181-
// layouter.assign_region(
182-
// || "",
183-
// |mut region| {
184-
// for q in C::selectors(&config).iter() {
185-
// q.enable(&mut region, 0)?;
186-
// }
187-
// Ok(())
188-
// },
189-
// )?;
190-
// Ok(())
191-
// }
192-
// }
193-
194-
// let dummy_vk = vk
195-
// .is_none()
196-
// .then(|| keygen_vk(params, &CsProxy::<Fr, ConcreteCircuit>(PhantomData)).unwrap());
197-
// let protocol = compile(
198-
// params,
199-
// vk.or(dummy_vk.as_ref()).unwrap(),
200-
// Config::kzg()
201-
// .with_num_instance(ConcreteCircuit::num_instance())
202-
// .with_accumulator_indices(ConcreteCircuit::accumulator_indices()),
203-
// );
204-
// let instances = ConcreteCircuit::num_instance()
205-
// .into_iter()
206-
// .map(|n| iter::repeat_with(|| Fr::random(rng)).take(n).collect())
207-
// .collect();
208-
// let proof = {
209-
// let mut transcript = PoseidonTranscript::<NativeLoader, _>::new(Vec::new());
210-
// for _ in 0..protocol
211-
// .num_witness
212-
// .iter()
213-
// .chain(Some(&protocol.quotient.num_chunk()))
214-
// .sum::<usize>()
215-
// {
216-
// transcript.write_ec_point(G1Affine::random(rng)).unwrap();
217-
// }
218-
// for _ in 0..protocol.evaluations.len() {
219-
// transcript.write_scalar(Fr::random(rng)).unwrap();
220-
// }
221-
// let queries = PlonkProof::<G1Affine, NativeLoader, Pcs>::empty_queries(&protocol);
222-
// for _ in 0..Pcs::estimate_cost(&queries).num_commitment {
223-
// transcript.write_ec_point(G1Affine::random(rng)).unwrap();
224-
// }
225-
// transcript.finalize()
226-
// };
227-
228-
// Snark::new(protocol, instances, proof)
229-
// }
13+
use super::*;
23014

23115
type AssignedScalar<'a> = <BaseFieldEccChip as EccInstructions<'a, G1Affine>>::AssignedScalar;
23216

@@ -236,17 +20,9 @@ fn poseidon<L: Loader<G1Affine>>(loader: &L, inputs: &[L::LoadedScalar]) -> L::L
23620
hasher.squeeze()
23721
}
23822

239-
// TODO: maybe it can be added into snark-verifier sdk later?
240-
// Now it is still a version specified for Kzg since the only
241-
// type support AccumulatorEncoding trait in verifier::Plonk
242-
// is LimbsEncoding, which only be generic with PCS whose Accmulator
243-
// is KzgAccmulator ...
244-
24523
/// It is similar to `succinct_verify` method inside of snark-verifier
24624
/// but allow it allow loader to load preprocessed part as witness (so ANY circuit)
247-
/// can be verified
248-
///
249-
///
25+
/// can be verified.
25026
pub fn dynamic_verify<'a, PCS>(
25127
svk: &PCS::SuccinctVerifyingKey,
25228
loader: &Rc<Halo2Loader<'a>>,

aggregator/src/recursion/config.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
1-
use super::*;
2-
use crate::param::ConfigParams as BatchCircuitConfigParams;
3-
41
use halo2_proofs::plonk::{Column, Instance};
52
use snark_verifier::loader::halo2::halo2_ecc::{
63
ecc::{BaseFieldEccChip, EccChip},
74
fields::fp::FpConfig,
85
halo2_base::gates::{flex_gate::FlexGateConfig, range::RangeConfig},
96
};
107

8+
use crate::param::ConfigParams as RecursionCircuitConfigParams;
9+
10+
use super::*;
11+
1112
#[derive(Clone)]
1213
pub struct RecursionConfig {
14+
/// The non-native field arithmetic config from halo2-lib.
1315
pub base_field_config: FpConfig<Fr, Fq>,
16+
/// The single instance column to hold the public input to the [`RecursionCircuit`].
1417
pub instance: Column<Instance>,
1518
}
1619

1720
impl RecursionConfig {
18-
pub fn configure(meta: &mut ConstraintSystem<Fr>, params: BatchCircuitConfigParams) -> Self {
21+
pub fn configure(
22+
meta: &mut ConstraintSystem<Fr>,
23+
params: RecursionCircuitConfigParams,
24+
) -> Self {
1925
assert!(
2026
params.limb_bits == BITS && params.num_limbs == LIMBS,
2127
"For now we fix limb_bits = {}, otherwise change code",

0 commit comments

Comments
 (0)