Skip to content

Commit 85bc62e

Browse files
committed
Make Provers and related methods public
1 parent afae2d9 commit 85bc62e

File tree

3 files changed

+342
-326
lines changed

3 files changed

+342
-326
lines changed

ledger/src/proofs/gates.rs

Lines changed: 328 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,328 @@
1+
use std::{collections::HashMap, path::Path, sync::Arc};
2+
3+
use kimchi::circuits::gate::CircuitGate;
4+
use mina_curves::pasta::Fq;
5+
use mina_hasher::Fp;
6+
use once_cell::sync::Lazy;
7+
8+
use super::{
9+
constants::{
10+
StepBlockProof, StepMergeProof, StepTransactionProof, StepZkappOptSignedOptSignedProof,
11+
StepZkappOptSignedProof, StepZkappProofProof, WrapBlockProof, WrapTransactionProof,
12+
},
13+
field::FieldWitness,
14+
transaction::{make_prover_index, InternalVars, Prover, V},
15+
};
16+
17+
use mina_p2p_messages::binprot::{
18+
self,
19+
macros::{BinProtRead, BinProtWrite},
20+
};
21+
22+
struct Gates {
23+
gates: Vec<CircuitGate<Fp>>,
24+
wrap_gates: Vec<CircuitGate<Fq>>,
25+
merge_gates: Vec<CircuitGate<Fp>>,
26+
block_gates: Vec<CircuitGate<Fp>>,
27+
block_wrap_gates: Vec<CircuitGate<Fq>>,
28+
zkapp_step_opt_signed_opt_signed_gates: Vec<CircuitGate<Fp>>,
29+
zkapp_step_opt_signed_gates: Vec<CircuitGate<Fp>>,
30+
zkapp_step_proof_gates: Vec<CircuitGate<Fp>>,
31+
internal_vars: HashMap<usize, (Vec<(Fp, V)>, Option<Fp>)>,
32+
rows_rev: Vec<Vec<Option<V>>>,
33+
internal_vars_wrap: HashMap<usize, (Vec<(Fq, V)>, Option<Fq>)>,
34+
rows_rev_wrap: Vec<Vec<Option<V>>>,
35+
merge_internal_vars: HashMap<usize, (Vec<(Fp, V)>, Option<Fp>)>,
36+
merge_rows_rev: Vec<Vec<Option<V>>>,
37+
block_internal_vars: HashMap<usize, (Vec<(Fp, V)>, Option<Fp>)>,
38+
block_rows_rev: Vec<Vec<Option<V>>>,
39+
block_wrap_internal_vars: HashMap<usize, (Vec<(Fq, V)>, Option<Fq>)>,
40+
block_wrap_rows_rev: Vec<Vec<Option<V>>>,
41+
zkapp_step_opt_signed_opt_signed_internal_vars: HashMap<usize, (Vec<(Fp, V)>, Option<Fp>)>,
42+
zkapp_step_opt_signed_opt_signed_rows_rev: Vec<Vec<Option<V>>>,
43+
zkapp_step_opt_signed_internal_vars: HashMap<usize, (Vec<(Fp, V)>, Option<Fp>)>,
44+
zkapp_step_opt_signed_rows_rev: Vec<Vec<Option<V>>>,
45+
zkapp_step_proof_internal_vars: HashMap<usize, (Vec<(Fp, V)>, Option<Fp>)>,
46+
zkapp_step_proof_rows_rev: Vec<Vec<Option<V>>>,
47+
}
48+
49+
fn read_gates() -> Gates {
50+
let base_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
51+
let base_dir = base_dir.join("rampup4");
52+
53+
fn read_gates_file<F: FieldWitness>(
54+
filepath: &impl AsRef<Path>,
55+
) -> std::io::Result<Vec<CircuitGate<F>>> {
56+
let file = std::fs::File::open(filepath)?;
57+
let reader = std::io::BufReader::new(file);
58+
serde_json::from_reader(reader).map_err(Into::into)
59+
}
60+
61+
let internal_vars_path = base_dir.join("internal_vars_rampup4.bin");
62+
let rows_rev_path = base_dir.join("rows_rev_rampup4.bin");
63+
let (internal_vars, rows_rev) =
64+
read_constraints_data::<Fp>(&internal_vars_path, &rows_rev_path).unwrap();
65+
66+
let internal_vars_path = base_dir.join("internal_vars_wrap_rampup4.bin");
67+
let rows_rev_path = base_dir.join("rows_rev_wrap_rampup4.bin");
68+
let (internal_vars_wrap, rows_rev_wrap) =
69+
read_constraints_data::<Fq>(&internal_vars_path, &rows_rev_path).unwrap();
70+
71+
let internal_vars_path = base_dir.join("merge_internal_vars.bin");
72+
let rows_rev_path = base_dir.join("merge_rows_rev.bin");
73+
let (merge_internal_vars, merge_rows_rev) =
74+
read_constraints_data::<Fp>(&internal_vars_path, &rows_rev_path).unwrap();
75+
76+
let internal_vars_path = base_dir.join("block_internal_vars.bin");
77+
let rows_rev_path = base_dir.join("block_rows_rev.bin");
78+
let (block_internal_vars, block_rows_rev) =
79+
read_constraints_data::<Fp>(&internal_vars_path, &rows_rev_path).unwrap();
80+
81+
let internal_vars_path = base_dir.join("block_wrap_internal_vars.bin");
82+
let rows_rev_path = base_dir.join("block_wrap_rows_rev.bin");
83+
let (block_wrap_internal_vars, block_wrap_rows_rev) =
84+
read_constraints_data::<Fq>(&internal_vars_path, &rows_rev_path).unwrap();
85+
86+
let internal_vars_path = base_dir.join("zkapp_step_internal_vars.bin");
87+
let rows_rev_path = base_dir.join("zkapp_step_rows_rev.bin");
88+
let (zkapp_step_opt_signed_opt_signed_internal_vars, zkapp_step_opt_signed_opt_signed_rows_rev) =
89+
read_constraints_data::<Fp>(&internal_vars_path, &rows_rev_path).unwrap();
90+
91+
let internal_vars_path = base_dir.join("zkapp_step_opt_signed_internal_vars.bin");
92+
let rows_rev_path = base_dir.join("zkapp_step_opt_signed_rows_rev.bin");
93+
let (zkapp_step_opt_signed_internal_vars, zkapp_step_opt_signed_rows_rev) =
94+
read_constraints_data::<Fp>(&internal_vars_path, &rows_rev_path).unwrap();
95+
96+
let gates: Vec<CircuitGate<Fp>> =
97+
read_gates_file(&base_dir.join("gates_step_rampup4.json")).unwrap();
98+
let wrap_gates: Vec<CircuitGate<Fq>> =
99+
read_gates_file(&base_dir.join("gates_wrap_rampup4.json")).unwrap();
100+
let merge_gates: Vec<CircuitGate<Fp>> =
101+
read_gates_file(&base_dir.join("gates_merge_rampup4.json")).unwrap();
102+
103+
let block_gates: Vec<CircuitGate<Fp>> =
104+
read_gates_file(&base_dir.join("block_gates.json")).unwrap();
105+
let block_wrap_gates: Vec<CircuitGate<Fq>> =
106+
read_gates_file(&base_dir.join("block_wrap_gates.json")).unwrap();
107+
let zkapp_step_opt_signed_opt_signed_gates: Vec<CircuitGate<Fp>> =
108+
read_gates_file(&base_dir.join("zkapp_step_gates.json")).unwrap();
109+
let zkapp_step_opt_signed_gates: Vec<CircuitGate<Fp>> =
110+
read_gates_file(&base_dir.join("zkapp_step_opt_signed_gates.json")).unwrap();
111+
112+
let internal_vars_path = base_dir.join("zkapp_step_proof_internal_vars.bin");
113+
let rows_rev_path = base_dir.join("zkapp_step_proof_rows_rev.bin");
114+
let (zkapp_step_proof_internal_vars, zkapp_step_proof_rows_rev) =
115+
read_constraints_data::<Fp>(&internal_vars_path, &rows_rev_path).unwrap();
116+
let zkapp_step_proof_gates: Vec<CircuitGate<Fp>> =
117+
read_gates_file(&base_dir.join("zkapp_step_proof_gates.json")).unwrap();
118+
119+
Gates {
120+
gates,
121+
wrap_gates,
122+
merge_gates,
123+
block_gates,
124+
internal_vars,
125+
rows_rev,
126+
internal_vars_wrap,
127+
rows_rev_wrap,
128+
merge_internal_vars,
129+
merge_rows_rev,
130+
block_internal_vars,
131+
block_rows_rev,
132+
block_wrap_gates,
133+
block_wrap_internal_vars,
134+
block_wrap_rows_rev,
135+
zkapp_step_opt_signed_opt_signed_gates,
136+
zkapp_step_opt_signed_opt_signed_internal_vars,
137+
zkapp_step_opt_signed_opt_signed_rows_rev,
138+
zkapp_step_opt_signed_gates,
139+
zkapp_step_opt_signed_internal_vars,
140+
zkapp_step_opt_signed_rows_rev,
141+
zkapp_step_proof_gates,
142+
zkapp_step_proof_internal_vars,
143+
zkapp_step_proof_rows_rev,
144+
}
145+
}
146+
147+
static PROVERS: Lazy<Arc<Provers>> = Lazy::new(|| Arc::new(make_provers()));
148+
149+
pub struct Provers {
150+
pub tx_step_prover: Prover<Fp>,
151+
pub tx_wrap_prover: Prover<Fq>,
152+
pub merge_step_prover: Prover<Fp>,
153+
pub block_step_prover: Prover<Fp>,
154+
pub block_wrap_prover: Prover<Fq>,
155+
pub zkapp_step_opt_signed_opt_signed_prover: Prover<Fp>,
156+
pub zkapp_step_opt_signed_prover: Prover<Fp>,
157+
pub zkapp_step_proof_prover: Prover<Fp>,
158+
}
159+
160+
pub fn get_provers() -> Arc<Provers> {
161+
Arc::clone(&*PROVERS)
162+
}
163+
164+
/// Slow, use `get_provers` instead
165+
fn make_provers() -> Provers {
166+
let Gates {
167+
gates,
168+
wrap_gates,
169+
merge_gates,
170+
block_gates,
171+
internal_vars,
172+
rows_rev,
173+
internal_vars_wrap,
174+
rows_rev_wrap,
175+
merge_internal_vars,
176+
merge_rows_rev,
177+
block_internal_vars,
178+
block_rows_rev,
179+
block_wrap_gates,
180+
block_wrap_internal_vars,
181+
block_wrap_rows_rev,
182+
zkapp_step_opt_signed_opt_signed_gates,
183+
zkapp_step_opt_signed_opt_signed_internal_vars,
184+
zkapp_step_opt_signed_opt_signed_rows_rev,
185+
zkapp_step_opt_signed_gates,
186+
zkapp_step_opt_signed_internal_vars,
187+
zkapp_step_opt_signed_rows_rev,
188+
zkapp_step_proof_gates,
189+
zkapp_step_proof_internal_vars,
190+
zkapp_step_proof_rows_rev,
191+
} = read_gates();
192+
193+
let tx_prover_index = make_prover_index::<StepTransactionProof, _>(gates);
194+
let merge_prover_index = make_prover_index::<StepMergeProof, _>(merge_gates);
195+
let wrap_prover_index = make_prover_index::<WrapTransactionProof, _>(wrap_gates);
196+
let wrap_block_prover_index = make_prover_index::<WrapBlockProof, _>(block_wrap_gates);
197+
let block_prover_index = make_prover_index::<StepBlockProof, _>(block_gates);
198+
let zkapp_step_opt_signed_opt_signed_prover_index =
199+
make_prover_index::<StepZkappOptSignedOptSignedProof, _>(
200+
zkapp_step_opt_signed_opt_signed_gates,
201+
);
202+
let zkapp_step_opt_signed_prover_index =
203+
make_prover_index::<StepZkappOptSignedProof, _>(zkapp_step_opt_signed_gates);
204+
let zkapp_step_proof_prover_index =
205+
make_prover_index::<StepZkappProofProof, _>(zkapp_step_proof_gates);
206+
207+
let tx_step_prover = Prover {
208+
internal_vars,
209+
rows_rev,
210+
index: tx_prover_index,
211+
};
212+
213+
let merge_step_prover = Prover {
214+
internal_vars: merge_internal_vars,
215+
rows_rev: merge_rows_rev,
216+
index: merge_prover_index,
217+
};
218+
219+
let tx_wrap_prover = Prover {
220+
internal_vars: internal_vars_wrap,
221+
rows_rev: rows_rev_wrap,
222+
index: wrap_prover_index,
223+
};
224+
225+
let block_step_prover = Prover {
226+
internal_vars: block_internal_vars,
227+
rows_rev: block_rows_rev,
228+
index: block_prover_index,
229+
};
230+
231+
let block_wrap_prover = Prover {
232+
internal_vars: block_wrap_internal_vars,
233+
rows_rev: block_wrap_rows_rev,
234+
index: wrap_block_prover_index,
235+
};
236+
237+
let zkapp_step_opt_signed_opt_signed_prover = Prover {
238+
internal_vars: zkapp_step_opt_signed_opt_signed_internal_vars,
239+
rows_rev: zkapp_step_opt_signed_opt_signed_rows_rev,
240+
index: zkapp_step_opt_signed_opt_signed_prover_index,
241+
};
242+
243+
let zkapp_step_opt_signed_prover = Prover {
244+
internal_vars: zkapp_step_opt_signed_internal_vars,
245+
rows_rev: zkapp_step_opt_signed_rows_rev,
246+
index: zkapp_step_opt_signed_prover_index,
247+
};
248+
249+
let zkapp_step_proof_prover = Prover {
250+
internal_vars: zkapp_step_proof_internal_vars,
251+
rows_rev: zkapp_step_proof_rows_rev,
252+
index: zkapp_step_proof_prover_index,
253+
};
254+
255+
Provers {
256+
tx_step_prover,
257+
tx_wrap_prover,
258+
merge_step_prover,
259+
block_step_prover,
260+
block_wrap_prover,
261+
zkapp_step_opt_signed_opt_signed_prover,
262+
zkapp_step_opt_signed_prover,
263+
zkapp_step_proof_prover,
264+
}
265+
}
266+
267+
pub fn read_constraints_data<F: FieldWitness>(
268+
internal_vars_path: &Path,
269+
rows_rev_path: &Path,
270+
) -> Option<(InternalVars<F>, Vec<Vec<Option<V>>>)> {
271+
use mina_p2p_messages::bigint::BigInt;
272+
273+
impl From<&VRaw> for V {
274+
fn from(value: &VRaw) -> Self {
275+
match value {
276+
VRaw::External(index) => Self::External(*index as usize),
277+
VRaw::Internal(id) => Self::Internal(*id as usize),
278+
}
279+
}
280+
}
281+
282+
#[derive(Clone, Debug, PartialEq, BinProtRead, BinProtWrite)]
283+
enum VRaw {
284+
External(u32),
285+
Internal(u32),
286+
}
287+
288+
use binprot::BinProtRead;
289+
290+
type InternalVarsRaw = HashMap<u32, (Vec<(BigInt, VRaw)>, Option<BigInt>)>;
291+
292+
// ((Fp.t * V.t) list * Fp.t option)
293+
let Ok(internal_vars) = std::fs::read(internal_vars_path)
294+
// std::fs::read(Path::new(env!("CARGO_MANIFEST_DIR")).join("internal_vars.bin"))
295+
else {
296+
return None;
297+
};
298+
let internal_vars: InternalVarsRaw =
299+
HashMap::binprot_read(&mut internal_vars.as_slice()).unwrap();
300+
301+
// V.t option array list
302+
let rows_rev = std::fs::read(rows_rev_path).unwrap();
303+
// std::fs::read(Path::new(env!("CARGO_MANIFEST_DIR")).join("rows_rev.bin")).unwrap();
304+
let rows_rev: Vec<Vec<Option<VRaw>>> = Vec::binprot_read(&mut rows_rev.as_slice()).unwrap();
305+
306+
let internal_vars: InternalVars<F> = internal_vars
307+
.into_iter()
308+
.map(|(id, (list, opt))| {
309+
let id = id as usize;
310+
let list: Vec<_> = list
311+
.iter()
312+
.map(|(n, v)| (n.to_field::<F>(), V::from(v)))
313+
.collect();
314+
let opt = opt.as_ref().map(BigInt::to_field::<F>);
315+
(id, (list, opt))
316+
})
317+
.collect();
318+
319+
let rows_rev: Vec<_> = rows_rev
320+
.iter()
321+
.map(|row| {
322+
let row: Vec<_> = row.iter().map(|v| v.as_ref().map(V::from)).collect();
323+
row
324+
})
325+
.collect();
326+
327+
Some((internal_vars, rows_rev))
328+
}

ledger/src/proofs/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ pub mod block;
33
pub mod caching;
44
pub mod constants;
55
pub mod field;
6+
pub mod gates;
67
pub mod group_map;
78
pub mod merge;
89
pub mod numbers;

0 commit comments

Comments
 (0)