@@ -2,23 +2,22 @@ use super::{fnv, CircomBase, SafeMemory, Wasm};
2
2
use color_eyre:: Result ;
3
3
use num_bigint:: BigInt ;
4
4
use num_traits:: Zero ;
5
- use std:: cell:: Cell ;
6
5
use wasmer:: { imports, Function , Instance , Memory , MemoryType , Module , RuntimeError , Store } ;
7
6
8
7
#[ cfg( feature = "circom-2" ) ]
9
8
use num:: ToPrimitive ;
10
9
10
+ use super :: Circom1 ;
11
11
#[ cfg( feature = "circom-2" ) ]
12
12
use super :: Circom2 ;
13
13
14
- use super :: Circom ;
15
-
16
14
#[ derive( Clone , Debug ) ]
17
15
pub struct WitnessCalculator {
18
16
pub instance : Wasm ,
19
- pub memory : SafeMemory ,
17
+ pub memory : Option < SafeMemory > ,
20
18
pub n64 : u32 ,
21
19
pub circom_version : u32 ,
20
+ pub prime : BigInt ,
22
21
}
23
22
24
23
// Error type to signal end of execution.
@@ -92,9 +91,8 @@ impl WitnessCalculator {
92
91
93
92
// Circom 2 feature flag with version 2
94
93
#[ cfg( feature = "circom-2" ) ]
95
- fn new_circom2 ( instance : Wasm , memory : Memory , version : u32 ) -> Result < WitnessCalculator > {
94
+ fn new_circom2 ( instance : Wasm , version : u32 ) -> Result < WitnessCalculator > {
96
95
let n32 = instance. get_field_num_len32 ( ) ?;
97
- let mut safe_memory = SafeMemory :: new ( memory, n32 as usize , BigInt :: zero ( ) ) ;
98
96
instance. get_raw_prime ( ) ?;
99
97
let mut arr = vec ! [ 0 ; n32 as usize ] ;
100
98
for i in 0 ..n32 {
@@ -104,13 +102,13 @@ impl WitnessCalculator {
104
102
let prime = from_array32 ( arr) ;
105
103
106
104
let n64 = ( ( prime. bits ( ) - 1 ) / 64 + 1 ) as u32 ;
107
- safe_memory. prime = prime;
108
105
109
106
Ok ( WitnessCalculator {
110
107
instance,
111
- memory : safe_memory ,
108
+ memory : None ,
112
109
n64,
113
110
circom_version : version,
111
+ prime,
114
112
} )
115
113
}
116
114
@@ -122,13 +120,14 @@ impl WitnessCalculator {
122
120
let prime = safe_memory. read_big ( ptr as usize , n32 as usize ) ?;
123
121
124
122
let n64 = ( ( prime. bits ( ) - 1 ) / 64 + 1 ) as u32 ;
125
- safe_memory. prime = prime;
123
+ safe_memory. prime = prime. clone ( ) ;
126
124
127
125
Ok ( WitnessCalculator {
128
126
instance,
129
- memory : safe_memory,
127
+ memory : Some ( safe_memory) ,
130
128
n64,
131
129
circom_version : version,
130
+ prime,
132
131
} )
133
132
}
134
133
@@ -142,7 +141,7 @@ impl WitnessCalculator {
142
141
cfg_if:: cfg_if! {
143
142
if #[ cfg( feature = "circom-2" ) ] {
144
143
match version {
145
- 2 => new_circom2( instance, memory , version) ,
144
+ 2 => new_circom2( instance, version) ,
146
145
1 => new_circom1( instance, memory, version) ,
147
146
_ => panic!( "Unknown Circom version" )
148
147
}
@@ -180,9 +179,9 @@ impl WitnessCalculator {
180
179
) -> Result < Vec < BigInt > > {
181
180
self . instance . init ( sanity_check) ?;
182
181
183
- let old_mem_free_pos = self . memory . free_pos ( ) ;
184
- let p_sig_offset = self . memory . alloc_u32 ( ) ;
185
- let p_fr = self . memory . alloc_fr ( ) ;
182
+ let old_mem_free_pos = self . memory . as_ref ( ) . unwrap ( ) . free_pos ( ) ;
183
+ let p_sig_offset = self . memory . as_mut ( ) . unwrap ( ) . alloc_u32 ( ) ;
184
+ let p_fr = self . memory . as_mut ( ) . unwrap ( ) . alloc_fr ( ) ;
186
185
187
186
// allocate the inputs
188
187
for ( name, values) in inputs. into_iter ( ) {
@@ -191,10 +190,17 @@ impl WitnessCalculator {
191
190
self . instance
192
191
. get_signal_offset32 ( p_sig_offset, 0 , msb, lsb) ?;
193
192
194
- let sig_offset = self . memory . read_u32 ( p_sig_offset as usize ) as usize ;
193
+ let sig_offset = self
194
+ . memory
195
+ . as_ref ( )
196
+ . unwrap ( )
197
+ . read_u32 ( p_sig_offset as usize ) as usize ;
195
198
196
199
for ( i, value) in values. into_iter ( ) . enumerate ( ) {
197
- self . memory . write_fr ( p_fr as usize , & value) ?;
200
+ self . memory
201
+ . as_mut ( )
202
+ . unwrap ( )
203
+ . write_fr ( p_fr as usize , & value) ?;
198
204
self . instance
199
205
. set_signal ( 0 , 0 , ( sig_offset + i) as u32 , p_fr) ?;
200
206
}
@@ -205,11 +211,11 @@ impl WitnessCalculator {
205
211
let n_vars = self . instance . get_n_vars ( ) ?;
206
212
for i in 0 ..n_vars {
207
213
let ptr = self . instance . get_ptr_witness ( i) ? as usize ;
208
- let el = self . memory . read_fr ( ptr) ?;
214
+ let el = self . memory . as_ref ( ) . unwrap ( ) . read_fr ( ptr) ?;
209
215
w. push ( el) ;
210
216
}
211
217
212
- self . memory . set_free_pos ( old_mem_free_pos) ;
218
+ self . memory . as_mut ( ) . unwrap ( ) . set_free_pos ( old_mem_free_pos) ;
213
219
214
220
Ok ( w)
215
221
}
@@ -283,20 +289,6 @@ impl WitnessCalculator {
283
289
284
290
Ok ( witness)
285
291
}
286
-
287
- pub fn get_witness_buffer ( & self ) -> Result < Vec < u8 > > {
288
- let ptr = self . instance . get_ptr_witness_buffer ( ) ? as usize ;
289
-
290
- let view = self . memory . memory . view :: < u8 > ( ) ;
291
-
292
- let len = self . instance . get_n_vars ( ) ? * self . n64 * 8 ;
293
- let arr = view[ ptr..ptr + len as usize ]
294
- . iter ( )
295
- . map ( Cell :: get)
296
- . collect :: < Vec < _ > > ( ) ;
297
-
298
- Ok ( arr)
299
- }
300
292
}
301
293
302
294
// callback hooks for debugging
@@ -463,7 +455,7 @@ mod tests {
463
455
fn run_test ( case : TestCase ) {
464
456
let mut wtns = WitnessCalculator :: new ( case. circuit_path ) . unwrap ( ) ;
465
457
assert_eq ! (
466
- wtns. memory . prime. to_str_radix( 16 ) ,
458
+ wtns. prime. to_str_radix( 16 ) ,
467
459
"30644E72E131A029B85045B68181585D2833E84879B9709143E1F593F0000001" . to_lowercase( )
468
460
) ;
469
461
assert_eq ! ( { wtns. instance. get_n_vars( ) . unwrap( ) } , case. n_vars) ;
0 commit comments