@@ -79,11 +79,9 @@ impl<const MAX_DEPTH: usize> MerkleProofCircuit<MAX_DEPTH> {
7979
8080 // define the case_i_selector as true when both existence and
8181 // case_ii_selector are false:
82- // case_i_selector = (1 - existence) * (1 - case_ii_selector)
83- let one = builder. one ( ) ;
84- let existence_inv = builder. sub ( one, existence. target ) ;
85- let case_ii_inv = builder. sub ( one, case_ii_selector. target ) ;
86- let case_i_selector = BoolTarget :: new_unsafe ( builder. mul ( existence_inv, case_ii_inv) ) ;
82+ let not_existence = builder. not ( existence) ;
83+ let not_case_ii_selector = builder. not ( case_ii_selector) ;
84+ let case_i_selector = builder. and ( not_existence, not_case_ii_selector) ;
8785
8886 // use (key,value) or (other_key, other_value) depending if it's a proof
8987 // of existence or of non-existence, ie:
@@ -141,8 +139,8 @@ impl<const MAX_DEPTH: usize> MerkleProofCircuit<MAX_DEPTH> {
141139 value : Value ,
142140 ) -> Result < ( ) > {
143141 pw. set_hash_target ( self . root , HashOut :: from_vec ( root. 0 . to_vec ( ) ) ) ?;
144- pw. set_target_arr ( & self . key , & key. 0 . to_vec ( ) ) ?;
145- pw. set_target_arr ( & self . value , & value. 0 . to_vec ( ) ) ?;
142+ pw. set_target_arr ( & self . key , & key. 0 ) ?;
143+ pw. set_target_arr ( & self . value , & value. 0 ) ?;
146144 pw. set_bool_target ( self . existence , existence) ?;
147145
148146 // pad siblings with zeros to length MAX_DEPTH
@@ -154,16 +152,19 @@ impl<const MAX_DEPTH: usize> MerkleProofCircuit<MAX_DEPTH> {
154152 pw. set_hash_target ( self . siblings [ i] , HashOut :: from_vec ( sibling. 0 . to_vec ( ) ) ) ?;
155153 }
156154
157- if !existence && proof. other_leaf . is_some ( ) {
158- // non-existence case ii) expected leaf does exist but it has a different key
159- pw. set_bool_target ( self . case_ii_selector , true ) ?;
160- pw. set_target_arr ( & self . other_key , & proof. other_leaf . unwrap ( ) . 0 . 0 . to_vec ( ) ) ?;
161- pw. set_target_arr ( & self . other_value , & proof. other_leaf . unwrap ( ) . 1 . 0 . to_vec ( ) ) ?;
162- } else {
163- // existence & non-existence case i) expected leaf does not exist
164- pw. set_bool_target ( self . case_ii_selector , false ) ?;
165- pw. set_target_arr ( & self . other_key , & EMPTY_VALUE . 0 . to_vec ( ) ) ?;
166- pw. set_target_arr ( & self . other_value , & EMPTY_VALUE . 0 . to_vec ( ) ) ?;
155+ match proof. other_leaf {
156+ Some ( ( k, v) ) if !existence => {
157+ // non-existence case ii) expected leaf does exist but it has a different key
158+ pw. set_bool_target ( self . case_ii_selector , true ) ?;
159+ pw. set_target_arr ( & self . other_key , & k. 0 ) ?;
160+ pw. set_target_arr ( & self . other_value , & v. 0 ) ?;
161+ }
162+ _ => {
163+ // existence & non-existence case i) expected leaf does not exist
164+ pw. set_bool_target ( self . case_ii_selector , false ) ?;
165+ pw. set_target_arr ( & self . other_key , & EMPTY_VALUE . 0 ) ?;
166+ pw. set_target_arr ( & self . other_value , & EMPTY_VALUE . 0 ) ?;
167+ }
167168 }
168169
169170 Ok ( ( ) )
@@ -217,8 +218,8 @@ impl<const MAX_DEPTH: usize> MerkleProofExistenceCircuit<MAX_DEPTH> {
217218 value : Value ,
218219 ) -> Result < ( ) > {
219220 pw. set_hash_target ( self . root , HashOut :: from_vec ( root. 0 . to_vec ( ) ) ) ?;
220- pw. set_target_arr ( & self . key , & key. 0 . to_vec ( ) ) ?;
221- pw. set_target_arr ( & self . value , & value. 0 . to_vec ( ) ) ?;
221+ pw. set_target_arr ( & self . key , & key. 0 ) ?;
222+ pw. set_target_arr ( & self . value , & value. 0 ) ?;
222223
223224 // pad siblings with zeros to length MAX_DEPTH
224225 let mut siblings = proof. siblings . clone ( ) ;
@@ -377,7 +378,7 @@ pub mod tests {
377378 }
378379
379380 // assign the input values to the targets
380- pw. set_target_arr ( & key_targ, & key. 0 . to_vec ( ) ) ?;
381+ pw. set_target_arr ( & key_targ, & key. 0 ) ?;
381382 for i in 0 ..MD {
382383 pw. set_bool_target ( expected_path_targ[ i] , expected_path[ i] ) ?;
383384 }
@@ -410,8 +411,8 @@ pub mod tests {
410411 builder. connect_hashes ( computed_h, h_targ) ;
411412
412413 // assign the input values to the targets
413- pw. set_target_arr ( & key_targ, & key. 0 . to_vec ( ) ) ?;
414- pw. set_target_arr ( & value_targ, & value. 0 . to_vec ( ) ) ?;
414+ pw. set_target_arr ( & key_targ, & key. 0 ) ?;
415+ pw. set_target_arr ( & value_targ, & value. 0 ) ?;
415416 pw. set_hash_target ( h_targ, HashOut :: from_vec ( h. 0 . to_vec ( ) ) ) ?;
416417
417418 // generate & verify proof
0 commit comments