Skip to content

Commit 4635cd4

Browse files
committed
feat: handle padding in set_target
1 parent 17e6c2a commit 4635cd4

File tree

5 files changed

+46
-72
lines changed

5 files changed

+46
-72
lines changed

src/backends/plonky2/circuits/mainpod.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -707,12 +707,11 @@ mod tests {
707707
);
708708

709709
let merkle_proofs = vec![MerkleClaimAndProof::new(
710-
params.max_depth_mt_gadget,
711710
Hash::from(root.raw()),
712711
key,
713712
None,
714-
&no_key_pf,
715-
)?];
713+
no_key_pf,
714+
)];
716715
let prev_statements = vec![root_st, key_st];
717716
operation_verify(st, op, prev_statements, merkle_proofs.clone())?;
718717

src/backends/plonky2/circuits/signedpod.rs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,7 @@ impl SignedPodVerifyTarget {
134134
let (v, proof) = pod.dict.prove(k)?;
135135
self.mt_proofs[i].set_targets(
136136
pw,
137-
&MerkleClaimAndProof::new(
138-
self.params.max_depth_mt_gadget,
139-
pod.dict.commitment(),
140-
k.raw(),
141-
Some(v.raw()),
142-
&proof,
143-
)?,
137+
&MerkleClaimAndProof::new(pod.dict.commitment(), k.raw(), Some(v.raw()), proof),
144138
)?;
145139
Ok(v)
146140
})
@@ -160,21 +154,15 @@ impl SignedPodVerifyTarget {
160154

161155
self.mt_proofs[curr].set_targets(
162156
pw,
163-
&MerkleClaimAndProof::new(
164-
self.params.max_depth_mt_gadget,
165-
pod.dict.commitment(),
166-
k.raw(),
167-
Some(v.raw()),
168-
&proof,
169-
)?,
157+
&MerkleClaimAndProof::new(pod.dict.commitment(), k.raw(), Some(v.raw()), proof),
170158
)?;
171159
curr += 1;
172160
}
173161
// sanity check
174162
assert!(curr <= self.params.max_signed_pod_values);
175163

176164
// add the proofs of empty leaves (if needed), till the max_signed_pod_values
177-
let mut mp = MerkleClaimAndProof::empty(self.params.max_depth_mt_gadget);
165+
let mut mp = MerkleClaimAndProof::empty();
178166
mp.root = pod.dict.commitment();
179167
for i in curr..self.params.max_signed_pod_values {
180168
self.mt_proofs[i].set_targets(pw, &mp)?;

src/backends/plonky2/mainpod/mod.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub(crate) fn extract_merkle_proofs(
4242
params: &Params,
4343
operations: &[middleware::Operation],
4444
) -> Result<Vec<MerkleClaimAndProof>> {
45-
let mut merkle_proofs = operations
45+
let mut merkle_proofs: Vec<_> = operations
4646
.iter()
4747
.flat_map(|op| match op {
4848
middleware::Operation::ContainsFromEntries(
@@ -51,26 +51,24 @@ pub(crate) fn extract_merkle_proofs(
5151
middleware::Statement::ValueOf(_, value),
5252
pf,
5353
) => Some(MerkleClaimAndProof::new(
54-
params.max_depth_mt_gadget,
5554
Hash::from(root.raw()),
5655
key.raw(),
5756
Some(value.raw()),
58-
pf,
57+
pf.clone(),
5958
)),
6059
middleware::Operation::NotContainsFromEntries(
6160
middleware::Statement::ValueOf(_, root),
6261
middleware::Statement::ValueOf(_, key),
6362
pf,
6463
) => Some(MerkleClaimAndProof::new(
65-
params.max_depth_mt_gadget,
6664
Hash::from(root.raw()),
6765
key.raw(),
6866
None,
69-
pf,
67+
pf.clone(),
7068
)),
7169
_ => None,
7270
})
73-
.collect::<Result<Vec<_>>>()?;
71+
.collect();
7472
if merkle_proofs.len() > params.max_merkle_proofs {
7573
Err(anyhow!(
7674
"The number of required Merkle proofs ({}) exceeds the maximum number ({}).",
@@ -80,7 +78,7 @@ pub(crate) fn extract_merkle_proofs(
8078
} else {
8179
fill_pad(
8280
&mut merkle_proofs,
83-
MerkleClaimAndProof::empty(params.max_depth_mt_gadget),
81+
MerkleClaimAndProof::empty(),
8482
params.max_merkle_proofs,
8583
);
8684
Ok(merkle_proofs)
@@ -293,7 +291,6 @@ pub(crate) fn process_public_statements_operations(
293291
pub struct Prover {}
294292

295293
impl PodProver for Prover {
296-
// TODO: Be consistent on where we apply the padding, here, or in the set_targets?
297294
fn prove(&mut self, params: &Params, inputs: MainPodInputs) -> Result<Box<dyn Pod>> {
298295
let config = CircuitConfig::standard_recursion_config();
299296
let mut builder = CircuitBuilder::<F, D>::new(config);

src/backends/plonky2/primitives/merkletree.rs

Lines changed: 10 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
//! Module that implements the MerkleTree specified at
22
//! https://0xparc.github.io/pod2/merkletree.html .
3-
use std::{
4-
collections::HashMap,
5-
fmt,
6-
iter::{self, IntoIterator},
7-
};
3+
use std::{collections::HashMap, fmt, iter::IntoIterator};
84

95
use anyhow::{anyhow, Result};
106
use plonky2::field::types::Field;
@@ -271,55 +267,30 @@ pub struct MerkleClaimAndProof {
271267
pub root: Hash,
272268
pub key: RawValue,
273269
pub value: RawValue,
274-
/// The siblings in this proof are padded to max_depth
275270
pub proof: MerkleProof,
276271
}
277272

278273
impl MerkleClaimAndProof {
279-
pub fn empty(max_depth: usize) -> Self {
274+
pub fn empty() -> Self {
280275
Self {
281276
enabled: false,
282277
root: EMPTY_HASH,
283278
key: EMPTY_VALUE,
284279
value: EMPTY_VALUE,
285280
proof: MerkleProof {
286281
existence: true,
287-
siblings: iter::repeat(EMPTY_HASH).take(max_depth).collect(),
282+
siblings: vec![],
288283
other_leaf: None,
289284
},
290285
}
291286
}
292-
pub fn new(
293-
max_depth: usize,
294-
root: Hash,
295-
key: RawValue,
296-
value: Option<RawValue>,
297-
proof: &MerkleProof,
298-
) -> Result<Self> {
299-
if proof.siblings.len() > max_depth {
300-
Err(anyhow!(
301-
"Number of siblings ({}) exceeds maximum depth ({})",
302-
proof.siblings.len(),
303-
max_depth
304-
))
305-
} else {
306-
Ok(Self {
307-
enabled: true,
308-
root,
309-
key,
310-
value: value.unwrap_or(EMPTY_VALUE),
311-
proof: MerkleProof {
312-
existence: proof.existence,
313-
siblings: proof
314-
.siblings
315-
.iter()
316-
.cloned()
317-
.chain(iter::repeat(EMPTY_HASH))
318-
.take(max_depth)
319-
.collect(),
320-
other_leaf: proof.other_leaf,
321-
},
322-
})
287+
pub fn new(root: Hash, key: RawValue, value: Option<RawValue>, proof: MerkleProof) -> Self {
288+
Self {
289+
enabled: true,
290+
root,
291+
key,
292+
value: value.unwrap_or(EMPTY_VALUE),
293+
proof,
323294
}
324295
}
325296
}

src/backends/plonky2/primitives/merkletree_circuit.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,19 @@ impl MerkleClaimAndProofTarget {
165165
pw.set_target_arr(&self.value.elements, &mp.value.0)?;
166166
pw.set_bool_target(self.existence, mp.proof.existence)?;
167167

168+
// pad siblings with zeros to length max_depth
169+
assert!(mp.proof.siblings.len() <= self.max_depth);
170+
for (i, sibling) in mp
171+
.proof
172+
.siblings
173+
.iter()
174+
.chain(iter::repeat(&EMPTY_HASH))
175+
.take(self.max_depth)
176+
.enumerate()
177+
{
178+
pw.set_hash_target(self.siblings[i], HashOut::from_vec(sibling.0.to_vec()))?;
179+
}
180+
168181
assert_eq!(mp.proof.siblings.len(), self.max_depth);
169182
for (i, sibling) in mp.proof.siblings.iter().enumerate() {
170183
pw.set_hash_target(self.siblings[i], HashOut::from_vec(sibling.0.to_vec()))?;
@@ -259,9 +272,15 @@ impl MerkleProofExistenceTarget {
259272
pw.set_target_arr(&self.value.elements, &mp.value.0)?;
260273

261274
// pad siblings with zeros to length max_depth
262-
assert_eq!(mp.proof.siblings.len(), self.max_depth);
263-
264-
for (i, sibling) in mp.proof.siblings.iter().enumerate() {
275+
assert!(mp.proof.siblings.len() <= self.max_depth);
276+
for (i, sibling) in mp
277+
.proof
278+
.siblings
279+
.iter()
280+
.chain(iter::repeat(&EMPTY_HASH))
281+
.take(self.max_depth)
282+
.enumerate()
283+
{
265284
pw.set_hash_target(self.siblings[i], HashOut::from_vec(sibling.0.to_vec()))?;
266285
}
267286

@@ -515,7 +534,7 @@ pub mod tests {
515534
let targets = MerkleProofGadget { max_depth }.eval(&mut builder)?;
516535
targets.set_targets(
517536
&mut pw,
518-
&MerkleClaimAndProof::new(max_depth, tree.root(), key, Some(value), &proof)?,
537+
&MerkleClaimAndProof::new(tree.root(), key, Some(value), proof),
519538
)?;
520539

521540
// generate & verify proof
@@ -560,7 +579,7 @@ pub mod tests {
560579
let targets = MerkleProofExistenceGadget { max_depth }.eval(&mut builder)?;
561580
targets.set_targets(
562581
&mut pw,
563-
&MerkleClaimAndProof::new(max_depth, tree.root(), key, Some(value), &proof)?,
582+
&MerkleClaimAndProof::new(tree.root(), key, Some(value), proof),
564583
)?;
565584

566585
// generate & verify proof
@@ -634,7 +653,7 @@ pub mod tests {
634653
let targets = MerkleProofGadget { max_depth }.eval(&mut builder)?;
635654
targets.set_targets(
636655
&mut pw,
637-
&MerkleClaimAndProof::new(max_depth, tree.root(), key, Some(value), &proof)?,
656+
&MerkleClaimAndProof::new(tree.root(), key, Some(value), proof),
638657
)?;
639658

640659
// generate & verify proof
@@ -677,7 +696,7 @@ pub mod tests {
677696

678697
let targets = MerkleProofGadget { max_depth }.eval(&mut builder)?;
679698
// verification enabled & proof of existence
680-
let mut mp = MerkleClaimAndProof::new(max_depth, tree2.root(), key, Some(value), &proof)?;
699+
let mut mp = MerkleClaimAndProof::new(tree2.root(), key, Some(value), proof);
681700
targets.set_targets(&mut pw, &mp)?;
682701

683702
// generate proof, expecting it to fail (since we're using the wrong

0 commit comments

Comments
 (0)