Skip to content

Commit 3cf2d0e

Browse files
committed
use MerkleClaimAndProof in merkle circuit set_targets
1 parent e934e92 commit 3cf2d0e

File tree

5 files changed

+77
-140
lines changed

5 files changed

+77
-140
lines changed

src/backends/plonky2/circuits/mainpod.rs

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -495,15 +495,7 @@ impl MainPodVerifyTarget {
495495
assert_eq!(input.merkle_proofs.len(), self.params.max_merkle_proofs);
496496
for (i, mp) in input.merkle_proofs.iter().enumerate() {
497497
assert_eq!(mp.proof.siblings.len(), self.params.max_depth_mt_gadget);
498-
self.merkle_proofs[i].set_targets(
499-
pw,
500-
mp.enabled,
501-
mp.proof.existence,
502-
mp.root,
503-
mp.proof.clone(),
504-
mp.key,
505-
mp.value,
506-
)?;
498+
self.merkle_proofs[i].set_targets(pw, mp)?;
507499
}
508500
Ok(())
509501
}
@@ -526,26 +518,23 @@ impl MainPodVerifyCircuit {
526518

527519
#[cfg(test)]
528520
mod tests {
529-
use merkletree::MerkleTree;
530521
use plonky2::plonk::{circuit_builder::CircuitBuilder, circuit_data::CircuitConfig};
531522

532523
use super::*;
533524
use crate::{
534525
backends::plonky2::{
535526
basetypes::C,
536-
mock::{
537-
mainpod,
538-
mainpod::{OperationArg, OperationAux},
539-
},
527+
mainpod::{OperationArg, OperationAux},
528+
primitives::merkletree::{MerkleClaimAndProof, MerkleTree},
540529
},
541-
middleware::{OperationType, PodId, RawValue},
530+
middleware::{Hash, OperationType, PodId, RawValue},
542531
};
543532

544533
fn operation_verify(
545534
st: mainpod::Statement,
546535
op: mainpod::Operation,
547536
prev_statements: Vec<mainpod::Statement>,
548-
merkle_proofs: Vec<mainpod::MerkleClaimAndProof>,
537+
merkle_proofs: Vec<MerkleClaimAndProof>,
549538
) -> Result<()> {
550539
let params = Params::default();
551540
let mp_gadget = MerkleProofGadget {
@@ -590,15 +579,7 @@ mod tests {
590579
for (merkle_proof_target, merkle_proof) in
591580
merkle_proofs_target.iter().zip(merkle_proofs.iter())
592581
{
593-
merkle_proof_target.set_targets(
594-
&mut pw,
595-
merkle_proof.enabled,
596-
merkle_proof.existence,
597-
merkle_proof.root,
598-
merkle_proof.clone().try_into()?,
599-
merkle_proof.key,
600-
merkle_proof.value,
601-
)?
582+
merkle_proof_target.set_targets(&mut pw, &merkle_proof)?
602583
}
603584

604585
// generate & verify proof
@@ -725,10 +706,10 @@ mod tests {
725706
OperationAux::MerkleProofIndex(0),
726707
);
727708

728-
let merkle_proofs = vec![mainpod::MerkleClaimAndProof::try_from_middleware(
729-
&params,
730-
&root.raw(),
731-
&key,
709+
let merkle_proofs = vec![MerkleClaimAndProof::new(
710+
params.max_depth_mt_gadget,
711+
Hash::from(root.raw()),
712+
key,
732713
None,
733714
&no_key_pf,
734715
)?];

src/backends/plonky2/circuits/signedpod.rs

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@ use crate::{
1616
basetypes::D,
1717
circuits::common::{CircuitBuilderPod, StatementArgTarget, StatementTarget, ValueTarget},
1818
primitives::{
19-
merkletree::{MerkleProof, MerkleProofExistenceGadget, MerkleProofExistenceTarget},
19+
merkletree::{
20+
MerkleClaimAndProof, MerkleProofExistenceGadget, MerkleProofExistenceTarget,
21+
},
2022
signature::{PublicKey, SignatureVerifyGadget, SignatureVerifyTarget},
2123
},
2224
signedpod::SignedPod,
2325
},
2426
middleware::{
25-
hash_str, Key, NativePredicate, Params, PodType, Predicate, RawValue, ToFields, Value,
26-
EMPTY_VALUE, F, KEY_SIGNER, KEY_TYPE, SELF,
27+
hash_str, Key, NativePredicate, Params, PodType, Predicate, RawValue, ToFields, Value, F,
28+
KEY_SIGNER, KEY_TYPE, SELF,
2729
},
2830
};
2931

@@ -132,11 +134,13 @@ impl SignedPodVerifyTarget {
132134
let (v, proof) = pod.dict.prove(k)?;
133135
self.mt_proofs[i].set_targets(
134136
pw,
135-
true,
136-
pod.dict.commitment(),
137-
proof,
138-
k.raw(),
139-
v.raw(),
137+
&MerkleClaimAndProof::new(
138+
self.params.max_depth_mt_gadget,
139+
pod.dict.commitment(),
140+
k.raw(),
141+
Some(v.raw()),
142+
&proof,
143+
)?,
140144
)?;
141145
Ok(v)
142146
})
@@ -156,11 +160,13 @@ impl SignedPodVerifyTarget {
156160

157161
self.mt_proofs[curr].set_targets(
158162
pw,
159-
true,
160-
pod.dict.commitment(),
161-
proof,
162-
k.raw(),
163-
v.raw(),
163+
&MerkleClaimAndProof::new(
164+
self.params.max_depth_mt_gadget,
165+
pod.dict.commitment(),
166+
k.raw(),
167+
Some(v.raw()),
168+
&proof,
169+
)?,
164170
)?;
165171
curr += 1;
166172
}
@@ -171,16 +177,7 @@ impl SignedPodVerifyTarget {
171177
for i in curr..self.params.max_signed_pod_values {
172178
self.mt_proofs[i].set_targets(
173179
pw,
174-
false, // disable verification
175-
pod.dict.commitment(),
176-
// use an empty proof:
177-
MerkleProof {
178-
existence: true,
179-
siblings: vec![],
180-
other_leaf: None,
181-
},
182-
EMPTY_VALUE,
183-
EMPTY_VALUE,
180+
&MerkleClaimAndProof::empty(self.params.max_depth_mt_gadget),
184181
)?;
185182
}
186183

src/backends/plonky2/mainpod/mod.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ pub(crate) fn extract_merkle_proofs(
5252
pf,
5353
) => Some(MerkleClaimAndProof::new(
5454
params.max_depth_mt_gadget,
55-
&root.raw(),
56-
&key.raw(),
57-
Some(&value.raw()),
55+
Hash::from(root.raw()),
56+
key.raw(),
57+
Some(value.raw()),
5858
pf,
5959
)),
6060
middleware::Operation::NotContainsFromEntries(
@@ -63,8 +63,8 @@ pub(crate) fn extract_merkle_proofs(
6363
pf,
6464
) => Some(MerkleClaimAndProof::new(
6565
params.max_depth_mt_gadget,
66-
&root.raw(),
67-
&key.raw(),
66+
Hash::from(root.raw()),
67+
key.raw(),
6868
None,
6969
pf,
7070
)),
@@ -435,7 +435,9 @@ pub mod tests {
435435
use super::*;
436436
use crate::{
437437
backends::plonky2::{
438-
mock::mainpod::MockProver, primitives::signature::SecretKey, signedpod::Signer,
438+
mock::mainpod::{MockMainPod, MockProver},
439+
primitives::signature::SecretKey,
440+
signedpod::Signer,
439441
},
440442
examples::{zu_kyc_pod_builder, zu_kyc_sign_pod_builders},
441443
frontend, middleware,

src/backends/plonky2/primitives/merkletree.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,9 +291,9 @@ impl MerkleClaimAndProof {
291291
}
292292
pub fn new(
293293
max_depth: usize,
294-
root: &RawValue,
295-
key: &RawValue,
296-
value: Option<&RawValue>,
294+
root: Hash,
295+
key: RawValue,
296+
value: Option<RawValue>,
297297
proof: &MerkleProof,
298298
) -> Result<Self> {
299299
if proof.siblings.len() > max_depth {
@@ -305,9 +305,9 @@ impl MerkleClaimAndProof {
305305
} else {
306306
Ok(Self {
307307
enabled: true,
308-
root: (*root).into(),
309-
key: *key,
310-
value: value.cloned().unwrap_or(EMPTY_VALUE),
308+
root,
309+
key,
310+
value: value.unwrap_or(EMPTY_VALUE),
311311
proof: MerkleProof {
312312
existence: proof.existence,
313313
siblings: proof

src/backends/plonky2/primitives/merkletree_circuit.rs

Lines changed: 33 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ use crate::{
2828
backends::plonky2::{
2929
basetypes::D,
3030
circuits::common::{CircuitBuilderPod, ValueTarget},
31-
primitives::merkletree::MerkleProof,
31+
primitives::merkletree::MerkleClaimAndProof,
3232
},
33-
middleware::{Hash, RawValue, EMPTY_HASH, EMPTY_VALUE, F, HASH_SIZE},
33+
middleware::{EMPTY_HASH, EMPTY_VALUE, F, HASH_SIZE},
3434
};
3535

3636
/// `MerkleProofGadget` allows to verify both proofs of existence and proofs
@@ -158,33 +158,20 @@ impl MerkleProofGadget {
158158
impl MerkleClaimAndProofTarget {
159159
/// assigns the given values to the targets
160160
#[allow(clippy::too_many_arguments)]
161-
pub fn set_targets(
162-
&self,
163-
pw: &mut PartialWitness<F>,
164-
enabled: bool,
165-
existence: bool,
166-
root: Hash,
167-
proof: MerkleProof,
168-
key: RawValue,
169-
value: RawValue,
170-
) -> Result<()> {
171-
pw.set_bool_target(self.enabled, enabled)?;
172-
pw.set_hash_target(self.root, HashOut::from_vec(root.0.to_vec()))?;
173-
pw.set_target_arr(&self.key.elements, &key.0)?;
174-
pw.set_target_arr(&self.value.elements, &value.0)?;
175-
pw.set_bool_target(self.existence, existence)?;
176-
177-
// pad siblings with zeros to length max_depth
178-
let mut siblings = proof.siblings.clone();
179-
siblings.resize(self.max_depth, EMPTY_HASH);
180-
assert_eq!(self.siblings.len(), siblings.len());
181-
182-
for (i, sibling) in siblings.iter().enumerate() {
161+
pub fn set_targets(&self, pw: &mut PartialWitness<F>, mp: &MerkleClaimAndProof) -> Result<()> {
162+
pw.set_bool_target(self.enabled, mp.enabled)?;
163+
pw.set_hash_target(self.root, HashOut::from_vec(mp.root.0.to_vec()))?;
164+
pw.set_target_arr(&self.key.elements, &mp.key.0)?;
165+
pw.set_target_arr(&self.value.elements, &mp.value.0)?;
166+
pw.set_bool_target(self.existence, mp.proof.existence)?;
167+
168+
assert_eq!(mp.proof.siblings.len(), self.max_depth);
169+
for (i, sibling) in mp.proof.siblings.iter().enumerate() {
183170
pw.set_hash_target(self.siblings[i], HashOut::from_vec(sibling.0.to_vec()))?;
184171
}
185172

186-
match proof.other_leaf {
187-
Some((k, v)) if !existence => {
173+
match mp.proof.other_leaf {
174+
Some((k, v)) if !mp.proof.existence => {
188175
// non-existence case ii) expected leaf does exist but it has a different key
189176
pw.set_bool_target(self.case_ii_selector, true)?;
190177
pw.set_target_arr(&self.other_key.elements, &k.0)?;
@@ -263,29 +250,18 @@ impl MerkleProofExistenceGadget {
263250

264251
impl MerkleProofExistenceTarget {
265252
/// assigns the given values to the targets
266-
pub fn set_targets(
267-
&self,
268-
pw: &mut PartialWitness<F>,
269-
// `enabled` determines if the merkleproof verification is enabled
270-
enabled: bool,
271-
root: Hash,
272-
proof: MerkleProof,
273-
key: RawValue,
274-
value: RawValue,
275-
) -> Result<()> {
276-
assert!(proof.existence); // sanity check
253+
pub fn set_targets(&self, pw: &mut PartialWitness<F>, mp: &MerkleClaimAndProof) -> Result<()> {
254+
assert!(mp.proof.existence); // sanity check
277255

278-
pw.set_bool_target(self.enabled, enabled)?;
279-
pw.set_hash_target(self.root, HashOut::from_vec(root.0.to_vec()))?;
280-
pw.set_target_arr(&self.key.elements, &key.0)?;
281-
pw.set_target_arr(&self.value.elements, &value.0)?;
256+
pw.set_bool_target(self.enabled, mp.enabled)?;
257+
pw.set_hash_target(self.root, HashOut::from_vec(mp.root.0.to_vec()))?;
258+
pw.set_target_arr(&self.key.elements, &mp.key.0)?;
259+
pw.set_target_arr(&self.value.elements, &mp.value.0)?;
282260

283261
// pad siblings with zeros to length max_depth
284-
let mut siblings = proof.siblings.clone();
285-
siblings.resize(self.max_depth, EMPTY_HASH);
286-
assert_eq!(self.siblings.len(), siblings.len());
262+
assert_eq!(mp.proof.siblings.len(), self.max_depth);
287263

288-
for (i, sibling) in siblings.iter().enumerate() {
264+
for (i, sibling) in mp.proof.siblings.iter().enumerate() {
289265
pw.set_hash_target(self.siblings[i], HashOut::from_vec(sibling.0.to_vec()))?;
290266
}
291267

@@ -539,12 +515,7 @@ pub mod tests {
539515
let targets = MerkleProofGadget { max_depth }.eval(&mut builder)?;
540516
targets.set_targets(
541517
&mut pw,
542-
true, // verification enabled
543-
existence,
544-
tree.root(),
545-
proof,
546-
key,
547-
value,
518+
&MerkleClaimAndProof::new(max_depth, tree.root(), key, Some(value), &proof)?,
548519
)?;
549520

550521
// generate & verify proof
@@ -587,7 +558,10 @@ pub mod tests {
587558
let mut pw = PartialWitness::<F>::new();
588559

589560
let targets = MerkleProofExistenceGadget { max_depth }.eval(&mut builder)?;
590-
targets.set_targets(&mut pw, true, tree.root(), proof, key, value)?;
561+
targets.set_targets(
562+
&mut pw,
563+
&MerkleClaimAndProof::new(max_depth, tree.root(), key, Some(value), &proof)?,
564+
)?;
591565

592566
// generate & verify proof
593567
let data = builder.build::<C>();
@@ -660,12 +634,7 @@ pub mod tests {
660634
let targets = MerkleProofGadget { max_depth }.eval(&mut builder)?;
661635
targets.set_targets(
662636
&mut pw,
663-
true, // verification enabled
664-
proof.existence,
665-
tree.root(),
666-
proof,
667-
key,
668-
value,
637+
&MerkleClaimAndProof::new(max_depth, tree.root(), key, Some(value), &proof)?,
669638
)?;
670639

671640
// generate & verify proof
@@ -707,15 +676,9 @@ pub mod tests {
707676
let mut pw = PartialWitness::<F>::new();
708677

709678
let targets = MerkleProofGadget { max_depth }.eval(&mut builder)?;
710-
targets.set_targets(
711-
&mut pw,
712-
true, // verification enabled
713-
true, // proof of existence
714-
tree2.root(),
715-
proof.clone(),
716-
key,
717-
value,
718-
)?;
679+
// verification enabled & proof of existence
680+
let mut mp = MerkleClaimAndProof::new(max_depth, tree2.root(), key, Some(value), &proof)?;
681+
targets.set_targets(&mut pw, &mp)?;
719682

720683
// generate proof, expecting it to fail (since we're using the wrong
721684
// root)
@@ -729,15 +692,9 @@ pub mod tests {
729692
let mut pw = PartialWitness::<F>::new();
730693

731694
let targets = MerkleProofGadget { max_depth }.eval(&mut builder)?;
732-
targets.set_targets(
733-
&mut pw,
734-
false, // verification disabled
735-
true, // proof of existence
736-
tree2.root(),
737-
proof,
738-
key,
739-
value,
740-
)?;
695+
// verification disabled & proof of existence
696+
mp.enabled = false;
697+
targets.set_targets(&mut pw, &mp)?;
741698

742699
// generate proof, should pass despite using wrong witness, since the
743700
// `enabled=false`

0 commit comments

Comments
 (0)