Skip to content

Commit 7f811cc

Browse files
committed
Refactor zkapp and add test with more account updates
1 parent 041c8f1 commit 7f811cc

File tree

3 files changed

+97
-114
lines changed

3 files changed

+97
-114
lines changed

ledger/src/proofs/merge.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub fn read_witnesses() -> std::io::Result<Vec<Fp>> {
5353
}
5454

5555
fn merge_main(
56-
statement: Statement<SokDigest>,
56+
statement: &Statement<SokDigest>,
5757
proofs: &[v2::LedgerProofProdStableV2; 2],
5858
w: &mut Witness<Fp>,
5959
) -> (Statement<SokDigest>, Statement<SokDigest>) {
@@ -179,11 +179,11 @@ pub fn generate_merge_proof(params: MergeParams, w: &mut Witness<Fp>) -> WrapPro
179179
} = params;
180180

181181
let sok_digest = message.digest();
182-
let statement_with_sok = statement.with_digest(sok_digest);
182+
let statement_with_sok = Rc::new(statement.with_digest(sok_digest));
183183

184-
w.exists(&statement_with_sok);
184+
w.exists(&*statement_with_sok);
185185

186-
let (s1, s2) = merge_main(statement_with_sok.clone(), proofs, w);
186+
let (s1, s2) = merge_main(&statement_with_sok, proofs, w);
187187

188188
let proofs: [&v2::PicklesProofProofsVerified2ReprStableV2; 2] = {
189189
let [p1, p2] = proofs;
@@ -228,7 +228,7 @@ pub fn generate_merge_proof(params: MergeParams, w: &mut Witness<Fp>) -> WrapPro
228228
proof,
229229
} = step::<StepMergeProof, MERGE_N_PREVIOUS_PROOFS>(
230230
StepParams {
231-
app_state: Rc::new(statement_with_sok.clone()),
231+
app_state: Rc::clone(&statement_with_sok) as _,
232232
rule,
233233
for_step_datas,
234234
indexes,
@@ -253,7 +253,7 @@ pub fn generate_merge_proof(params: MergeParams, w: &mut Witness<Fp>) -> WrapPro
253253

254254
wrap::<WrapMergeProof>(
255255
WrapParams {
256-
app_state: Rc::new(statement_with_sok),
256+
app_state: statement_with_sok,
257257
proof: &proof,
258258
step_statement: statement,
259259
prev_evals: &prev_evals,

ledger/src/proofs/transaction.rs

Lines changed: 48 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -4669,22 +4669,18 @@ mod tests {
46694669
zkapp_step_proof_prover,
46704670
} = make_provers();
46714671

4672-
let mut witnesses: Witness<Fp> = Witness::new::<StepZkappOptSignedOptSignedProof>();
4673-
let LedgerProof { proof, .. } = generate_zkapp_proof(
4674-
ZkappParams {
4675-
statement: &statement,
4676-
tx_witness: &tx_witness,
4677-
message: &message,
4678-
step_opt_signed_opt_signed_prover: &zkapp_step_opt_signed_opt_signed_prover,
4679-
step_opt_signed_prover: &zkapp_step_opt_signed_prover,
4680-
step_proof_prover: &zkapp_step_proof_prover,
4681-
merge_step_prover: &merge_step_prover,
4682-
tx_wrap_prover: &tx_wrap_prover,
4683-
opt_signed_path: Some("zkapp_opt_signed"),
4684-
proved_path: None,
4685-
},
4686-
&mut witnesses,
4687-
);
4672+
let LedgerProof { proof, .. } = generate_zkapp_proof(ZkappParams {
4673+
statement: &statement,
4674+
tx_witness: &tx_witness,
4675+
message: &message,
4676+
step_opt_signed_opt_signed_prover: &zkapp_step_opt_signed_opt_signed_prover,
4677+
step_opt_signed_prover: &zkapp_step_opt_signed_prover,
4678+
step_proof_prover: &zkapp_step_proof_prover,
4679+
merge_step_prover: &merge_step_prover,
4680+
tx_wrap_prover: &tx_wrap_prover,
4681+
opt_signed_path: Some("zkapp_opt_signed"),
4682+
proved_path: None,
4683+
});
46884684

46894685
let proof_json = serde_json::to_vec(&proof.proof).unwrap();
46904686
let sum = dbg!(sha256_sum(&proof_json));
@@ -4719,22 +4715,18 @@ mod tests {
47194715
zkapp_step_proof_prover,
47204716
} = make_provers();
47214717

4722-
let mut witnesses: Witness<Fp> = Witness::new::<StepZkappProofProof>();
4723-
let LedgerProof { proof, .. } = generate_zkapp_proof(
4724-
ZkappParams {
4725-
statement: &statement,
4726-
tx_witness: &tx_witness,
4727-
message: &message,
4728-
step_opt_signed_opt_signed_prover: &zkapp_step_opt_signed_opt_signed_prover,
4729-
step_opt_signed_prover: &zkapp_step_opt_signed_prover,
4730-
step_proof_prover: &zkapp_step_proof_prover,
4731-
merge_step_prover: &merge_step_prover,
4732-
tx_wrap_prover: &tx_wrap_prover,
4733-
opt_signed_path: Some("zkapp_proof"),
4734-
proved_path: Some("zkapp_proof2"),
4735-
},
4736-
&mut witnesses,
4737-
);
4718+
let LedgerProof { proof, .. } = generate_zkapp_proof(ZkappParams {
4719+
statement: &statement,
4720+
tx_witness: &tx_witness,
4721+
message: &message,
4722+
step_opt_signed_opt_signed_prover: &zkapp_step_opt_signed_opt_signed_prover,
4723+
step_opt_signed_prover: &zkapp_step_opt_signed_prover,
4724+
step_proof_prover: &zkapp_step_proof_prover,
4725+
merge_step_prover: &merge_step_prover,
4726+
tx_wrap_prover: &tx_wrap_prover,
4727+
opt_signed_path: Some("zkapp_proof"),
4728+
proved_path: Some("zkapp_proof2"),
4729+
});
47384730

47394731
let proof_json = serde_json::to_vec(&proof.proof).unwrap();
47404732
let sum = dbg!(sha256_sum(&proof_json));
@@ -4824,66 +4816,37 @@ mod tests {
48244816
zkapp_step_proof_prover,
48254817
} = make_provers();
48264818

4827-
// zkapp proof with signature authorization
4828-
{
4829-
let data = std::fs::read(base_dir.join("zkapp_0_rampup4.bin")).unwrap();
4830-
let (statement, tx_witness, message) = extract_request(&data);
4831-
4832-
let mut witnesses: Witness<Fp> = Witness::new::<StepZkappOptSignedOptSignedProof>();
4833-
let LedgerProof { proof, .. } = generate_zkapp_proof(
4834-
ZkappParams {
4835-
statement: &statement,
4836-
tx_witness: &tx_witness,
4837-
message: &message,
4838-
step_opt_signed_opt_signed_prover: &zkapp_step_opt_signed_opt_signed_prover,
4839-
step_opt_signed_prover: &zkapp_step_opt_signed_prover,
4840-
step_proof_prover: &zkapp_step_proof_prover,
4841-
merge_step_prover: &merge_step_prover,
4842-
tx_wrap_prover: &tx_wrap_prover,
4843-
opt_signed_path: Some("zkapp_opt_signed"),
4844-
proved_path: None,
4845-
},
4846-
&mut witnesses,
4847-
);
4848-
4849-
let proof_json = serde_json::to_vec(&proof.proof).unwrap();
4850-
let sum = dbg!(sha256_sum(&proof_json));
4851-
4852-
assert_eq!(
4853-
sum,
4854-
"6e9bb6ed613cf0aa737188e0e8ddde7438211ca54c02e89aff32816c181caca9"
4855-
);
4856-
}
4819+
#[rustfmt::skip]
4820+
let zkapp_cases = [
4821+
// zkapp proof with signature authorization
4822+
("zkapp_0_rampup4.bin", Some("zkapp_opt_signed"), None, "6e9bb6ed613cf0aa737188e0e8ddde7438211ca54c02e89aff32816c181caca9"),
4823+
// zkapp proof with proof authorization
4824+
("zkapp_10_rampup4.bin", Some("zkapp_proof"), Some("zkapp_proof2"), "e2ca355ce4ed5aaf379e992c0c8c5b1c4ac1687546ceac5a5c6c9c4994002249"),
4825+
// zkapp with multiple account updates
4826+
("zkapp_2_0_rampup4.bin", None, None, "03153d1c5b934e00c7102d3683f27572b6e8bfe0335817cb822d701c83415930"),
4827+
];
48574828

4858-
// zkapp proof with proof authorization
4859-
{
4860-
let data = std::fs::read(base_dir.join("zkapp_10_rampup4.bin")).unwrap();
4829+
for (file, opt_signed_path, proved_path, expected_sum) in zkapp_cases {
4830+
let data = std::fs::read(base_dir.join(file)).unwrap();
48614831
let (statement, tx_witness, message) = extract_request(&data);
48624832

4863-
let mut witnesses: Witness<Fp> = Witness::new::<StepZkappProofProof>();
4864-
let LedgerProof { proof, .. } = generate_zkapp_proof(
4865-
ZkappParams {
4866-
statement: &statement,
4867-
tx_witness: &tx_witness,
4868-
message: &message,
4869-
step_opt_signed_opt_signed_prover: &zkapp_step_opt_signed_opt_signed_prover,
4870-
step_opt_signed_prover: &zkapp_step_opt_signed_prover,
4871-
step_proof_prover: &zkapp_step_proof_prover,
4872-
merge_step_prover: &merge_step_prover,
4873-
tx_wrap_prover: &tx_wrap_prover,
4874-
opt_signed_path: Some("zkapp_proof"),
4875-
proved_path: Some("zkapp_proof2"),
4876-
},
4877-
&mut witnesses,
4878-
);
4833+
let LedgerProof { proof, .. } = generate_zkapp_proof(ZkappParams {
4834+
statement: &statement,
4835+
tx_witness: &tx_witness,
4836+
message: &message,
4837+
step_opt_signed_opt_signed_prover: &zkapp_step_opt_signed_opt_signed_prover,
4838+
step_opt_signed_prover: &zkapp_step_opt_signed_prover,
4839+
step_proof_prover: &zkapp_step_proof_prover,
4840+
merge_step_prover: &merge_step_prover,
4841+
tx_wrap_prover: &tx_wrap_prover,
4842+
opt_signed_path,
4843+
proved_path,
4844+
});
48794845

48804846
let proof_json = serde_json::to_vec(&proof.proof).unwrap();
48814847
let sum = dbg!(sha256_sum(&proof_json));
48824848

4883-
assert_eq!(
4884-
sum,
4885-
"e2ca355ce4ed5aaf379e992c0c8c5b1c4ac1687546ceac5a5c6c9c4994002249"
4886-
);
4849+
assert_eq!(sum, expected_sum);
48874850
}
48884851

48894852
// Block proof

ledger/src/proofs/zkapp.rs

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,7 +1197,18 @@ fn zkapp_main(
11971197
};
11981198
finish(v, (&mut global, &mut local))
11991199
}
1200-
IsStart::Yes => todo!(),
1200+
IsStart::Yes => {
1201+
assert!(local.stack_frame.data.calls.data.is_empty());
1202+
1203+
let v = match start_zkapp_command {
1204+
[] => unreachable!(),
1205+
[p, ps @ ..] => {
1206+
start_zkapp_command = ps;
1207+
StartOrSkip::Start(p)
1208+
}
1209+
};
1210+
finish(v, (&mut global, &mut local))
1211+
}
12011212
};
12021213

12031214
new_acc.unwrap() // TODO: Remove unwrap
@@ -1282,7 +1293,7 @@ fn snapp_proof_data<'a>(
12821293

12831294
fn of_zkapp_command_segment_exn<StepConstants, WrapConstants>(
12841295
statement: Statement<SokDigest>,
1285-
witness: &ZkappCommandSegmentWitness,
1296+
zkapp_witness: &ZkappCommandSegmentWitness,
12861297
spec: &SegmentBasic,
12871298
step_prover: &Prover<Fp>,
12881299
tx_wrap_prover: &Prover<Fq>,
@@ -1302,7 +1313,7 @@ where
13021313
w.ocaml_aux = read_witnesses(path);
13031314
};
13041315

1305-
let (zkapp_input, must_verify) = zkapp_main(statement.clone(), witness, &s, &mut w);
1316+
let (zkapp_input, must_verify) = zkapp_main(statement.clone(), zkapp_witness, &s, &mut w);
13061317

13071318
let StepProof {
13081319
statement: step_statement,
@@ -1323,7 +1334,7 @@ where
13231334
&mut w,
13241335
),
13251336
Proved => {
1326-
let (proof, vk) = snapp_proof_data(witness).unwrap();
1337+
let (proof, vk) = snapp_proof_data(zkapp_witness).unwrap();
13271338
let proof = proof.into();
13281339

13291340
let dlog_plonk_index_cvar = vk.wrap_index.to_cvar(CircuitVar::Var);
@@ -1614,7 +1625,7 @@ impl From<&WrapProof> for v2::PicklesProofProofsVerified2ReprStableV2 {
16141625

16151626
fn of_zkapp_command_segment(
16161627
statement: Statement<SokDigest>,
1617-
witness: &ZkappCommandSegmentWitness,
1628+
zkapp_witness: &ZkappCommandSegmentWitness,
16181629
spec: &SegmentBasic,
16191630
step_opt_signed_opt_signed_prover: &Prover<Fp>,
16201631
step_opt_signed_prover: &Prover<Fp>,
@@ -1651,7 +1662,7 @@ fn of_zkapp_command_segment(
16511662

16521663
of_zkapp_command_segment_exn(
16531664
statement,
1654-
witness,
1665+
zkapp_witness,
16551666
spec,
16561667
step_prover,
16571668
tx_wrap_prover,
@@ -1660,7 +1671,7 @@ fn of_zkapp_command_segment(
16601671
)
16611672
}
16621673

1663-
pub fn generate_zkapp_proof(params: ZkappParams, w: &mut Witness<Fp>) -> LedgerProof {
1674+
pub fn generate_zkapp_proof(params: ZkappParams) -> LedgerProof {
16641675
let ZkappParams {
16651676
statement,
16661677
tx_witness,
@@ -1703,11 +1714,11 @@ pub fn generate_zkapp_proof(params: ZkappParams, w: &mut Witness<Fp>) -> LedgerP
17031714
});
17041715

17051716
let of_zkapp_command_segment = |statement: Statement<SokDigest>,
1706-
witness: &ZkappCommandSegmentWitness<'_>,
1717+
zkapp_witness: &ZkappCommandSegmentWitness<'_>,
17071718
spec: &SegmentBasic| {
17081719
of_zkapp_command_segment(
17091720
statement,
1710-
witness,
1721+
zkapp_witness,
17111722
spec,
17121723
step_opt_signed_opt_signed_prover,
17131724
step_opt_signed_prover,
@@ -1720,23 +1731,32 @@ pub fn generate_zkapp_proof(params: ZkappParams, w: &mut Witness<Fp>) -> LedgerP
17201731

17211732
let sok_digest = message.digest();
17221733
let mut witnesses_specs_stmts = witnesses_specs_stmts.into_iter().rev();
1723-
let (witness, spec, statement) = witnesses_specs_stmts.next().unwrap(); // last one
1734+
let (zkapp_witness, spec, statement) = witnesses_specs_stmts.next().unwrap(); // last one
17241735

1725-
let mut first_proof =
1726-
of_zkapp_command_segment(statement.with_digest(sok_digest.clone()), &witness, &spec);
1736+
let mut first_proof = of_zkapp_command_segment(
1737+
statement.with_digest(sok_digest.clone()),
1738+
&zkapp_witness,
1739+
&spec,
1740+
);
17271741

1728-
witnesses_specs_stmts.fold(first_proof, |prev_proof, (witness, spec, statement)| {
1729-
let curr_proof =
1730-
of_zkapp_command_segment(statement.with_digest(sok_digest.clone()), &witness, &spec);
1742+
witnesses_specs_stmts.fold(
1743+
first_proof,
1744+
|prev_proof, (zkapp_witness, spec, statement)| {
1745+
let curr_proof = of_zkapp_command_segment(
1746+
statement.with_digest(sok_digest.clone()),
1747+
&zkapp_witness,
1748+
&spec,
1749+
);
17311750

1732-
merge_zkapp_proofs(
1733-
prev_proof,
1734-
curr_proof,
1735-
message,
1736-
merge_step_prover,
1737-
tx_wrap_prover,
1738-
)
1739-
})
1751+
merge_zkapp_proofs(
1752+
prev_proof,
1753+
curr_proof,
1754+
message,
1755+
merge_step_prover,
1756+
tx_wrap_prover,
1757+
)
1758+
},
1759+
)
17401760
}
17411761

17421762
fn merge_zkapp_proofs(

0 commit comments

Comments
 (0)