@@ -20,7 +20,7 @@ use wasmer::Singlepass;
20
20
use wasmer:: { imports, wasmparser, wasmparser:: Operator , CompilerConfig , Function , Store } ;
21
21
use wasmer_middlewares:: Metering ;
22
22
23
- use owasm_crypto:: ecvrf;
23
+ // use owasm_crypto::ecvrf;
24
24
25
25
// inspired by https://github.com/CosmWasm/cosmwasm/issues/81
26
26
// 512 pages = 32mb
@@ -156,11 +156,11 @@ fn require_mem_range(max_range: usize, require_range: usize) -> Result<(), Error
156
156
Ok ( ( ) )
157
157
}
158
158
159
- fn get_from_mem < E : vm:: Env > ( env : & Environment < E > , ptr : i64 , len : i64 ) -> Result < Vec < u8 > , Error > {
160
- let memory = env. memory ( ) ?;
161
- require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr + len) as usize ) ?;
162
- Ok ( memory. view ( ) [ ptr as usize ..( ptr + len) as usize ] . iter ( ) . map ( |cell| cell. get ( ) ) . collect ( ) )
163
- }
159
+ // fn get_from_mem<E: vm::Env>(env: &Environment<E>, ptr: i64, len: i64) -> Result<Vec<u8>, Error> {
160
+ // let memory = env.memory()?;
161
+ // require_mem_range(memory.size().bytes().0, (ptr + len) as usize)?;
162
+ // Ok(memory.view()[ptr as usize..(ptr + len) as usize].iter().map(|cell| cell.get()).collect())
163
+ // }
164
164
165
165
fn cost ( _operator : & Operator ) -> u64 {
166
166
// A flat fee for each operation
@@ -170,18 +170,17 @@ fn cost(_operator: &Operator) -> u64 {
170
170
pub fn run < E > (
171
171
cache : & mut Cache ,
172
172
code : & [ u8 ] ,
173
- gas : u32 ,
173
+ gas : u64 ,
174
174
is_prepare : bool ,
175
175
env : E ,
176
- ) -> Result < u32 , Error >
176
+ ) -> Result < u64 , Error >
177
177
where
178
178
E : vm:: Env + ' static ,
179
179
{
180
180
let owasm_env = Environment :: new ( env, gas) ;
181
181
182
182
let mut compiler = Singlepass :: new ( ) ;
183
-
184
- let metering = Arc :: new ( Metering :: new ( 4294967290 , cost) ) ;
183
+ let metering = Arc :: new ( Metering :: new ( 0 , cost) ) ;
185
184
compiler. push_middleware ( metering) ;
186
185
let engine = Universal :: new ( compiler) . engine ( ) ;
187
186
let store = Store :: new ( & engine) ;
@@ -270,8 +269,8 @@ where
270
269
}
271
270
272
271
// consume gas equal size of span when write calldata for raw request
273
- vm. consume_gas( span_size as u32 ) ?;
274
- env. decrease_gas_left( span_size as u32 ) ?;
272
+ // vm.consume_gas(span_size as u32)?;
273
+ // env.decrease_gas_left(span_size as u32)?;
275
274
276
275
let memory = env. memory( ) ?;
277
276
require_mem_range( memory. size( ) . bytes( ) . 0 , ( ptr + span_size) as usize ) ?;
@@ -304,24 +303,32 @@ where
304
303
Ok ( data. len( ) as i64 )
305
304
} )
306
305
} ) ,
307
- "ecvrf_verify" => Function :: new_native_with_env( & store, owasm_env. clone( ) , |env: & Environment <E >, y_ptr: i64 , y_len: i64 , pi_ptr: i64 , pi_len: i64 , alpha_ptr: i64 , alpha_len: i64 | {
308
- env. with_mut_vm( |vm| -> Result <u32 , Error >{
309
- // consume gas relatively to the function running time (~12ms)
310
- vm. consume_gas( 500000 ) ?;
311
- env. decrease_gas_left( 500000 ) ?;
312
-
313
- let y: Vec <u8 > = get_from_mem( env, y_ptr, y_len) ?;
314
- let pi: Vec <u8 >= get_from_mem( env, pi_ptr, pi_len) ?;
315
- let alpha: Vec <u8 > = get_from_mem( env, alpha_ptr, alpha_len) ?;
316
- Ok ( ecvrf:: ecvrf_verify( & y, & pi, & alpha) as u32 )
317
- } )
318
- } ) ,
306
+ // "ecvrf_verify" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>, y_ptr: i64, y_len: i64, pi_ptr: i64, pi_len: i64, alpha_ptr: i64, alpha_len: i64| {
307
+ // env.with_mut_vm(|vm| -> Result<u32, Error>{
308
+ // // consume gas relatively to the function running time (~12ms)
309
+ // vm.consume_gas(500000)?;
310
+ // env.decrease_gas_left(500000)?;
311
+
312
+ // let y: Vec<u8> = get_from_mem(env, y_ptr, y_len)?;
313
+ // let pi: Vec<u8>= get_from_mem(env, pi_ptr, pi_len)?;
314
+ // let alpha: Vec<u8> = get_from_mem(env, alpha_ptr, alpha_len)?;
315
+ // Ok(ecvrf::ecvrf_verify(&y, &pi, &alpha) as u32)
316
+ // })
317
+ // }),
319
318
} ,
320
319
} ;
321
320
322
321
let instance = cache. get_instance ( code, & store, & import_object) ?;
323
322
let instance_ptr = NonNull :: from ( & instance) ;
324
323
owasm_env. set_wasmer_instance ( Some ( instance_ptr) ) ;
324
+ owasm_env. set_gas_left ( gas) ;
325
+
326
+ match get_remaining_points ( & instance) {
327
+ MeteringPoints :: Remaining ( count) => {
328
+ println ! ( "gas {:?}, count {:?}, gas_used {:?}" , gas, count, gas. saturating_sub( count) ) ;
329
+ }
330
+ MeteringPoints :: Exhausted => { }
331
+ }
325
332
326
333
// get function and exec
327
334
let entry = if is_prepare { "prepare" } else { "execute" } ;
@@ -344,10 +351,12 @@ where
344
351
} ) ?;
345
352
346
353
match get_remaining_points ( & instance) {
347
- MeteringPoints :: Remaining ( count) => return Ok ( gas - ( count as u32 ) ) ,
348
- MeteringPoints :: Exhausted => return Ok ( gas) ,
349
- } ;
350
- // Ok(owasm_env.with_vm(|vm| vm.gas_used))
354
+ MeteringPoints :: Remaining ( count) => {
355
+ println ! ( "gas {:?}, count {:?}, gas_used {:?}" , gas, count, gas. saturating_sub( count) ) ;
356
+ Ok ( gas. saturating_sub ( count) )
357
+ }
358
+ MeteringPoints :: Exhausted => Err ( Error :: OutOfGasError ) ,
359
+ }
351
360
}
352
361
353
362
#[ cfg( test) ]
@@ -536,7 +545,7 @@ mod test {
536
545
let mut cache = Cache :: new ( CacheOptions { cache_size : 10000 } ) ;
537
546
let env = MockEnv { } ;
538
547
let gas_used = run ( & mut cache, & code, 4294967290 , true , env) . unwrap ( ) ;
539
- assert_eq ! ( gas_used, 1000015 as u32 ) ;
548
+ assert_eq ! ( gas_used, 1000015 as u64 ) ;
540
549
}
541
550
542
551
// #[test]
0 commit comments