1
1
use crate :: {
2
- nova:: utils:: { next_rom_index_and_pc, Digest } ,
3
- tree:: { Hasher , InsertProof , SPARSE_MERKLE_PLACEHOLDER_HASH } ,
2
+ nova:: utils:: {
3
+ allocate_bits_to_binary_number, next_rom_index_and_pc, verify_membership_proof, Digest ,
4
+ } ,
5
+ tree:: InsertProof ,
4
6
} ;
5
7
use anyhow:: Result ;
6
8
use arecibo:: supernova:: StepCircuit ;
7
- use bellpepper:: gadgets:: sha256:: sha256;
8
- use bellpepper_core:: {
9
- boolean:: { AllocatedBit , Boolean } ,
10
- num:: AllocatedNum ,
11
- ConstraintSystem , SynthesisError ,
12
- } ;
9
+ use bellpepper_core:: { num:: AllocatedNum , ConstraintSystem , SynthesisError } ;
13
10
use ff:: { PrimeField , PrimeFieldBits } ;
14
- use jmt :: proof :: { SparseMerkleLeafNode , SparseMerkleNode , SparseMerkleProof } ;
11
+ use sha2 :: Sha256 ;
15
12
16
13
#[ derive( Clone ) ]
17
14
pub struct InsertCircuit < F > {
@@ -54,11 +51,6 @@ impl<Scalar: PrimeField + PrimeFieldBits> StepCircuit<Scalar> for InsertCircuit<
54
51
pc,
55
52
) ?;
56
53
57
- let old_root_bits = allocate_bits_to_binary_number (
58
- cs,
59
- Some ( self . proof . non_membership_proof . root . to_bytes ( ) . to_vec ( ) ) ,
60
- ) ?;
61
-
62
54
let pre_insertion_scalar = Digest :: new ( self . proof . non_membership_proof . root )
63
55
. to_scalar ( )
64
56
. map_err ( |_| SynthesisError :: Unsatisfiable ) ;
@@ -81,6 +73,13 @@ impl<Scalar: PrimeField + PrimeFieldBits> StepCircuit<Scalar> for InsertCircuit<
81
73
. map_err ( |_| SynthesisError :: Unsatisfiable )
82
74
} ) ?;
83
75
76
+ let new_root_bits =
77
+ allocate_bits_to_binary_number ( cs, self . proof . membership_proof . root_hash ( ) . 0 . to_vec ( ) ) ?;
78
+
79
+ self . proof
80
+ . verify ( )
81
+ . map_err ( |_| SynthesisError :: Unsatisfiable ) ?;
82
+
84
83
// Verify the non-membership proof
85
84
// verify_non_membership_proof(
86
85
// cs.namespace(|| "non_membership_proof"),
@@ -95,8 +94,7 @@ impl<Scalar: PrimeField + PrimeFieldBits> StepCircuit<Scalar> for InsertCircuit<
95
94
. leaf ( )
96
95
. ok_or ( SynthesisError :: AssignmentMissing ) ?;
97
96
98
- // Verify the membership proof (update)
99
- verify_membership_proof ( cs, & self . proof . membership_proof , & old_root_bits, * leaf) ?;
97
+ verify_membership_proof ( cs, & self . proof . membership_proof , & new_root_bits, * leaf) ?;
100
98
101
99
let mut z_next = vec ! [ new_root] ;
102
100
z_next. push ( rom_index_next) ;
@@ -109,89 +107,3 @@ impl<Scalar: PrimeField + PrimeFieldBits> StepCircuit<Scalar> for InsertCircuit<
109
107
0
110
108
}
111
109
}
112
-
113
- fn allocate_bits_to_binary_number < Scalar : PrimeField , CS : ConstraintSystem < Scalar > > (
114
- cs : & mut CS ,
115
- value : Option < Vec < u8 > > ,
116
- ) -> Result < Vec < Boolean > , SynthesisError > {
117
- let bits = value
118
- . map ( |bytes| {
119
- bytes
120
- . iter ( )
121
- . flat_map ( |byte| ( 0 ..8 ) . map ( move |i| ( byte >> i) & 1 == 1 ) )
122
- . collect :: < Vec < _ > > ( )
123
- } )
124
- . unwrap_or_else ( || vec ! [ false ; 256 ] ) ;
125
-
126
- let mut result = Vec :: new ( ) ;
127
- for ( i, & bit) in bits. iter ( ) . enumerate ( ) {
128
- let allocated_bit = AllocatedBit :: alloc ( cs. namespace ( || format ! ( "bit {}" , i) ) , Some ( bit) ) ?;
129
- result. push ( Boolean :: from ( allocated_bit) ) ;
130
- }
131
- Ok ( result)
132
- }
133
-
134
- // fn verify_non_membership_proof<Scalar: PrimeField, CS: ConstraintSystem<Scalar>>(
135
- // mut cs: CS,
136
- // proof: &NonMembershipProof,
137
- // root: &[Boolean],
138
- // key: &[Boolean],
139
- // ) -> Result<(), SynthesisError> {
140
- // // 1. Hash the key
141
- // let key_hash = sha256(cs.namespace(|| "hash key"), key)?;
142
-
143
- // // 2. Traverse the Merkle path
144
-
145
- // // 3. Check that the computed root does not match the given root
146
-
147
- // Ok(())
148
- // }
149
-
150
- fn hash_node < Scalar : PrimeField , CS : ConstraintSystem < Scalar > > (
151
- cs : & mut CS ,
152
- node : & SparseMerkleNode ,
153
- ) -> Result < Vec < Boolean > , SynthesisError > {
154
- match node {
155
- SparseMerkleNode :: Leaf ( node) => {
156
- let node_bits = allocate_bits_to_binary_number ( cs, Some ( node. to_bytes ( ) ) ) ?;
157
- sha256 ( cs. namespace ( || "hash key" ) , & node_bits)
158
- }
159
- SparseMerkleNode :: Internal ( node) => {
160
- let node_bits = allocate_bits_to_binary_number ( cs, Some ( node. to_bytes ( ) ) ) ?;
161
- sha256 ( cs. namespace ( || "hash key" ) , & node_bits)
162
- }
163
- SparseMerkleNode :: Null => allocate_bits_to_binary_number (
164
- cs,
165
- Some ( SPARSE_MERKLE_PLACEHOLDER_HASH . to_bytes ( ) . to_vec ( ) ) ,
166
- ) ,
167
- }
168
- }
169
-
170
- fn verify_membership_proof < Scalar : PrimeField , CS : ConstraintSystem < Scalar > > (
171
- cs : & mut CS ,
172
- proof : & SparseMerkleProof < Hasher > ,
173
- root : & Vec < Boolean > ,
174
- leaf : SparseMerkleLeafNode ,
175
- ) -> Result < ( ) , SynthesisError > {
176
- // let leaf = self.proof.membership_proof.leaf().ok_or(SynthesisError::Unsatisfiable)?;
177
- let mut current = hash_node ( cs, & SparseMerkleNode :: Leaf ( leaf) ) ?;
178
-
179
- for ( i, sibling) in proof. siblings ( ) . iter ( ) . enumerate ( ) {
180
- let sibling_hash = hash_node ( cs, sibling) ?;
181
-
182
- current = sha256 (
183
- cs. namespace ( || format ! ( "hash node {}" , i) ) ,
184
- & [ current, sibling_hash] . concat ( ) ,
185
- ) ?;
186
- }
187
-
188
- for ( i, ( computed_bit, given_bit) ) in current. iter ( ) . zip ( root. iter ( ) ) . enumerate ( ) {
189
- Boolean :: enforce_equal (
190
- cs. namespace ( || format ! ( "root bit {} should be equal" , i) ) ,
191
- computed_bit,
192
- given_bit,
193
- ) ?;
194
- }
195
-
196
- Ok ( ( ) )
197
- }
0 commit comments