|
1 | 1 | use crate::cache::Cache;
|
| 2 | +use crate::imports::create_import_object; |
| 3 | +use crate::store::make_store; |
2 | 4 | use crate::vm::{self, Environment};
|
3 | 5 |
|
4 | 6 | pub use crate::error::Error;
|
5 | 7 | pub use std::ptr::NonNull;
|
6 |
| -use std::sync::Arc; |
7 |
| -use wasmer::Universal; |
8 | 8 | use wasmer_middlewares::metering::{get_remaining_points, MeteringPoints};
|
9 | 9 |
|
10 |
| -use wasmer::Singlepass; |
11 |
| - |
12 |
| -use wasmer::{imports, wasmparser::Operator, CompilerConfig, Function, Store}; |
13 |
| -use wasmer_middlewares::Metering; |
14 |
| - |
15 |
| -// use owasm_crypto::ecvrf; |
16 |
| - |
17 |
| -fn require_mem_range(max_range: usize, require_range: usize) -> Result<(), Error> { |
18 |
| - if max_range < require_range { |
19 |
| - return Err(Error::MemoryOutOfBoundError); |
20 |
| - } |
21 |
| - Ok(()) |
22 |
| -} |
23 |
| - |
24 |
| -fn cost(_operator: &Operator) -> u64 { |
25 |
| - // A flat fee for each operation |
26 |
| - 1 |
27 |
| -} |
28 |
| - |
29 | 10 | pub fn run<E>(
|
30 | 11 | cache: &mut Cache,
|
31 | 12 | code: &[u8],
|
32 |
| - gas: u64, |
| 13 | + gas_limit: u64, |
33 | 14 | is_prepare: bool,
|
34 | 15 | env: E,
|
35 | 16 | ) -> Result<u64, Error>
|
36 | 17 | where
|
37 | 18 | E: vm::Env + 'static,
|
38 | 19 | {
|
39 | 20 | let owasm_env = Environment::new(env);
|
40 |
| - |
41 |
| - let mut compiler = Singlepass::new(); |
42 |
| - let metering = Arc::new(Metering::new(0, cost)); |
43 |
| - compiler.push_middleware(metering); |
44 |
| - let engine = Universal::new(compiler).engine(); |
45 |
| - let store = Store::new(&engine); |
46 |
| - |
47 |
| - let import_object = imports! { |
48 |
| - "env" => { |
49 |
| - "gas" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>, _gas: u32| { |
50 |
| - env.decrease_gas_left(1) |
51 |
| - }), |
52 |
| - "get_span_size" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>| { |
53 |
| - env.with_vm(|vm| { |
54 |
| - vm.env.get_span_size() |
55 |
| - }) |
56 |
| - }), |
57 |
| - "read_calldata" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>, ptr: i64| { |
58 |
| - env.with_mut_vm(|vm| -> Result<i64, Error>{ |
59 |
| - let span_size = vm.env.get_span_size(); |
60 |
| - // consume gas equal size of span when read calldata |
61 |
| - env.decrease_gas_left(span_size as u64)?; |
62 |
| - |
63 |
| - let memory = env.memory()?; |
64 |
| - require_mem_range(memory.size().bytes().0, (ptr + span_size) as usize)?; |
65 |
| - |
66 |
| - let data = vm.env.get_calldata()?; |
67 |
| - |
68 |
| - for (idx, byte) in data.iter().enumerate() { |
69 |
| - memory.view()[ptr as usize + idx].set(*byte); |
70 |
| - } |
71 |
| - |
72 |
| - Ok(data.len() as i64) |
73 |
| - }) |
74 |
| - }), |
75 |
| - "set_return_data" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>, ptr: i64, len: i64| { |
76 |
| - env.with_mut_vm(|vm| { |
77 |
| - let span_size = vm.env.get_span_size(); |
78 |
| - |
79 |
| - if len > span_size { |
80 |
| - return Err(Error::SpanTooSmallError); |
81 |
| - } |
82 |
| - |
83 |
| - // consume gas equal size of span when save data to memory |
84 |
| - env.decrease_gas_left(span_size as u64)?; |
85 |
| - |
86 |
| - let memory = env.memory()?; |
87 |
| - require_mem_range(memory.size().bytes().0, (ptr + span_size) as usize)?; |
88 |
| - |
89 |
| - let data: Vec<u8> = memory.view()[ptr as usize..(ptr + len) as usize].iter().map(|cell| cell.get()).collect(); |
90 |
| - vm.env.set_return_data(&data) |
91 |
| - }) |
92 |
| - }), |
93 |
| - "get_ask_count" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>| { |
94 |
| - env.with_vm(|vm| { |
95 |
| - vm.env.get_ask_count() |
96 |
| - }) |
97 |
| - }), |
98 |
| - "get_min_count" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>| { |
99 |
| - env.with_vm(|vm| { |
100 |
| - vm.env.get_min_count() |
101 |
| - }) |
102 |
| - }), |
103 |
| - "get_prepare_time" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>| { |
104 |
| - env.with_vm(|vm| { |
105 |
| - vm.env.get_prepare_time() |
106 |
| - }) |
107 |
| - }), |
108 |
| - "get_execute_time" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>| { |
109 |
| - env.with_vm(|vm| { |
110 |
| - vm.env.get_execute_time() |
111 |
| - }) |
112 |
| - }), |
113 |
| - "get_ans_count" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>| { |
114 |
| - env.with_vm(|vm| { |
115 |
| - vm.env.get_ans_count() |
116 |
| - }) |
117 |
| - }), |
118 |
| - "ask_external_data" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>, eid: i64, did: i64, ptr: i64, len: i64| { |
119 |
| - env.with_mut_vm(|vm| { |
120 |
| - let span_size = vm.env.get_span_size(); |
121 |
| - |
122 |
| - if len > span_size { |
123 |
| - return Err(Error::SpanTooSmallError); |
124 |
| - } |
125 |
| - |
126 |
| - // consume gas equal size of span when write calldata for raw request |
127 |
| - env.decrease_gas_left(span_size as u64)?; |
128 |
| - |
129 |
| - let memory = env.memory()?; |
130 |
| - require_mem_range(memory.size().bytes().0, (ptr + span_size) as usize)?; |
131 |
| - |
132 |
| - let data: Vec<u8> = memory.view()[ptr as usize..(ptr + len) as usize].iter().map(|cell| cell.get()).collect(); |
133 |
| - vm.env.ask_external_data(eid, did, &data) |
134 |
| - }) |
135 |
| - }), |
136 |
| - "get_external_data_status" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>, eid: i64, vid: i64| { |
137 |
| - env.with_vm(|vm| { |
138 |
| - vm.env.get_external_data_status(eid, vid) |
139 |
| - }) |
140 |
| - }), |
141 |
| - "read_external_data" => Function::new_native_with_env(&store, owasm_env.clone(), |env: &Environment<E>, eid: i64, vid: i64, ptr: i64| { |
142 |
| - env.with_mut_vm(|vm| -> Result<i64, Error>{ |
143 |
| - let span_size = vm.env.get_span_size(); |
144 |
| - // consume gas equal size of span when read data from report |
145 |
| - env.decrease_gas_left(span_size as u64)?; |
146 |
| - |
147 |
| - let memory = env.memory()?; |
148 |
| - require_mem_range(memory.size().bytes().0, (ptr + span_size) as usize)?; |
149 |
| - |
150 |
| - let data = vm.env.get_external_data(eid, vid)?; |
151 |
| - |
152 |
| - for (idx, byte) in data.iter().enumerate() { |
153 |
| - memory.view()[ptr as usize + idx].set(*byte); |
154 |
| - } |
155 |
| - |
156 |
| - Ok(data.len() as i64) |
157 |
| - }) |
158 |
| - }), |
159 |
| - // "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| { |
160 |
| - // env.with_mut_vm(|vm| -> Result<u32, Error>{ |
161 |
| - // // consume gas relatively to the function running time (~12ms) |
162 |
| - // vm.consume_gas(500000)?; |
163 |
| - // env.decrease_gas_left(500000)?; |
164 |
| - |
165 |
| - // let y: Vec<u8> = get_from_mem(env, y_ptr, y_len)?; |
166 |
| - // let pi: Vec<u8>= get_from_mem(env, pi_ptr, pi_len)?; |
167 |
| - // let alpha: Vec<u8> = get_from_mem(env, alpha_ptr, alpha_len)?; |
168 |
| - // Ok(ecvrf::ecvrf_verify(&y, &pi, &alpha) as u32) |
169 |
| - // }) |
170 |
| - // }), |
171 |
| - }, |
172 |
| - }; |
| 21 | + let store = make_store(); |
| 22 | + let import_object = create_import_object(&store, owasm_env.clone()); |
173 | 23 |
|
174 | 24 | let instance = cache.get_instance(code, &store, &import_object)?;
|
175 | 25 | let instance_ptr = NonNull::from(&instance);
|
176 | 26 | owasm_env.set_wasmer_instance(Some(instance_ptr));
|
177 |
| - owasm_env.set_gas_left(gas); |
| 27 | + owasm_env.set_gas_left(gas_limit); |
178 | 28 |
|
179 | 29 | // get function and exec
|
180 | 30 | let entry = if is_prepare { "prepare" } else { "execute" };
|
|
197 | 47 | })?;
|
198 | 48 |
|
199 | 49 | match get_remaining_points(&instance) {
|
200 |
| - MeteringPoints::Remaining(count) => Ok(gas.saturating_sub(count)), |
| 50 | + MeteringPoints::Remaining(count) => Ok(gas_limit.saturating_sub(count)), |
201 | 51 | MeteringPoints::Exhausted => Err(Error::OutOfGasError),
|
202 | 52 | }
|
203 | 53 | }
|
|
0 commit comments