Skip to content

Commit 55fb1e0

Browse files
committed
separate import function
1 parent feb6acb commit 55fb1e0

File tree

1 file changed

+207
-0
lines changed

1 file changed

+207
-0
lines changed

packages/vm/src/imports.rs

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,214 @@ fn require_mem_range(max_range: usize, require_range: usize) -> Result<(), Error
1414
Ok(())
1515
}
1616

17+
fn do_gas<E>(env: &Environment<E>, _gas: u32) -> Result<(), Error>
18+
where
19+
E: vm::Env + 'static,
20+
{
21+
env.decrease_gas_left(1)
22+
}
23+
24+
fn do_get_span_size<E>(env: &Environment<E>) -> i64
25+
where
26+
E: vm::Env + 'static,
27+
{
28+
env.with_vm(|vm| vm.env.get_span_size())
29+
}
30+
31+
fn do_read_calldata<E>(env: &Environment<E>, ptr: i64) -> Result<(i64), Error>
32+
where
33+
E: vm::Env + 'static,
34+
{
35+
env.with_mut_vm(|vm| -> Result<i64, Error> {
36+
let span_size = vm.env.get_span_size();
37+
// consume gas equal size of span when read calldata
38+
env.decrease_gas_left(span_size as u64)?;
39+
40+
let memory = env.memory()?;
41+
require_mem_range(memory.size().bytes().0, (ptr + span_size) as usize)?;
42+
43+
let data = vm.env.get_calldata()?;
44+
45+
for (idx, byte) in data.iter().enumerate() {
46+
memory.view()[ptr as usize + idx].set(*byte);
47+
}
48+
49+
Ok(data.len() as i64)
50+
})
51+
}
52+
53+
fn do_set_return_data<E>(env: &Environment<E>, ptr: i64, len: i64) -> Result<(), Error>
54+
where
55+
E: vm::Env + 'static,
56+
{
57+
env.with_mut_vm(|vm| {
58+
let span_size = vm.env.get_span_size();
59+
60+
if len > span_size {
61+
return Err(Error::SpanTooSmallError);
62+
}
63+
64+
// consume gas equal size of span when save data to memory
65+
env.decrease_gas_left(span_size as u64)?;
66+
67+
let memory = env.memory()?;
68+
require_mem_range(memory.size().bytes().0, (ptr + span_size) as usize)?;
69+
70+
let data: Vec<u8> = memory.view()[ptr as usize..(ptr + len) as usize]
71+
.iter()
72+
.map(|cell| cell.get())
73+
.collect();
74+
vm.env.set_return_data(&data)
75+
})
76+
}
77+
78+
fn do_get_ask_count<E>(env: &Environment<E>) -> i64
79+
where
80+
E: vm::Env + 'static,
81+
{
82+
env.with_vm(|vm| vm.env.get_ask_count())
83+
}
84+
85+
fn do_get_min_count<E>(env: &Environment<E>) -> i64
86+
where
87+
E: vm::Env + 'static,
88+
{
89+
env.with_vm(|vm| vm.env.get_min_count())
90+
}
91+
92+
fn do_get_prepare_time<E>(env: &Environment<E>) -> i64
93+
where
94+
E: vm::Env + 'static,
95+
{
96+
env.with_vm(|vm| vm.env.get_prepare_time())
97+
}
98+
99+
fn do_get_execute_time<E>(env: &Environment<E>) -> Result<i64, Error>
100+
where
101+
E: vm::Env + 'static,
102+
{
103+
env.with_vm(|vm| vm.env.get_execute_time())
104+
}
105+
106+
fn do_get_ans_count<E>(env: &Environment<E>) -> Result<i64, Error>
107+
where
108+
E: vm::Env + 'static,
109+
{
110+
env.with_vm(|vm| vm.env.get_ans_count())
111+
}
112+
113+
fn do_ask_external_data<E>(
114+
env: &Environment<E>,
115+
eid: i64,
116+
did: i64,
117+
ptr: i64,
118+
len: i64,
119+
) -> Result<(), Error>
120+
where
121+
E: vm::Env + 'static,
122+
{
123+
env.with_mut_vm(|vm| {
124+
let span_size = vm.env.get_span_size();
125+
126+
if len > span_size {
127+
return Err(Error::SpanTooSmallError);
128+
}
129+
130+
// consume gas equal size of span when write calldata for raw request
131+
env.decrease_gas_left(span_size as u64)?;
132+
133+
let memory = env.memory()?;
134+
require_mem_range(memory.size().bytes().0, (ptr + span_size) as usize)?;
135+
136+
let data: Vec<u8> = memory.view()[ptr as usize..(ptr + len) as usize]
137+
.iter()
138+
.map(|cell| cell.get())
139+
.collect();
140+
vm.env.ask_external_data(eid, did, &data)
141+
})
142+
}
143+
144+
fn do_get_external_data_status<E>(env: &Environment<E>, eid: i64, vid: i64) -> Result<i64, Error>
145+
where
146+
E: vm::Env + 'static,
147+
{
148+
env.with_vm(|vm| vm.env.get_external_data_status(eid, vid))
149+
}
150+
151+
fn do_read_external_data<E>(
152+
env: &Environment<E>,
153+
eid: i64,
154+
vid: i64,
155+
ptr: i64,
156+
) -> Result<i64, Error>
157+
where
158+
E: vm::Env + 'static,
159+
{
160+
env.with_mut_vm(|vm| -> Result<i64, Error> {
161+
let span_size = vm.env.get_span_size();
162+
// consume gas equal size of span when read data from report
163+
env.decrease_gas_left(span_size as u64)?;
164+
165+
let memory = env.memory()?;
166+
require_mem_range(memory.size().bytes().0, (ptr + span_size) as usize)?;
167+
168+
let data = vm.env.get_external_data(eid, vid)?;
169+
170+
for (idx, byte) in data.iter().enumerate() {
171+
memory.view()[ptr as usize + idx].set(*byte);
172+
}
173+
174+
Ok(data.len() as i64)
175+
})
176+
}
177+
178+
// fn do_ecvrf_verify<E>(
179+
// env: &Environment<E>,
180+
// y_ptr: i64,
181+
// y_len: i64,
182+
// pi_ptr: i64,
183+
// pi_len: i64,
184+
// alpha_ptr: i64,
185+
// alpha_len: i64,
186+
// ) -> Result<u32, Error>
187+
// where
188+
// E: vm::Env + 'static,
189+
// {
190+
// env.with_mut_vm(|vm| -> Result<u32, Error> {
191+
// // consume gas relatively to the function running time (~12ms)
192+
// env.decrease_gas_left(500000)?;
193+
194+
// let y: Vec<u8> = get_from_mem(env, y_ptr, y_len)?;
195+
// let pi: Vec<u8> = get_from_mem(env, pi_ptr, pi_len)?;
196+
// let alpha: Vec<u8> = get_from_mem(env, alpha_ptr, alpha_len)?;
197+
// Ok(ecvrf::ecvrf_verify(&y, &pi, &alpha) as u32)
198+
// })
199+
// }
200+
17201
pub fn create_import_object<E>(store: &Store, owasm_env: Environment<E>) -> ImportObject
202+
where
203+
E: vm::Env + 'static,
204+
{
205+
imports! {
206+
"env" => {
207+
"gas" => Function::new_native_with_env(&store, owasm_env.clone(), do_gas),
208+
"get_span_size" => Function::new_native_with_env(&store, owasm_env.clone(), do_get_span_size),
209+
"read_calldata" => Function::new_native_with_env(&store, owasm_env.clone(), do_read_calldata),
210+
"set_return_data" => Function::new_native_with_env(&store, owasm_env.clone(), do_set_return_data),
211+
"get_ask_count" => Function::new_native_with_env(&store, owasm_env.clone(), do_get_ask_count),
212+
"get_min_count" => Function::new_native_with_env(&store, owasm_env.clone(), do_get_min_count),
213+
"get_prepare_time" => Function::new_native_with_env(&store, owasm_env.clone(), do_get_prepare_time),
214+
"get_execute_time" => Function::new_native_with_env(&store, owasm_env.clone(), do_get_execute_time),
215+
"get_ans_count" => Function::new_native_with_env(&store, owasm_env.clone(), do_get_ans_count),
216+
"ask_external_data" => Function::new_native_with_env(&store, owasm_env.clone(), do_ask_external_data),
217+
"get_external_data_status" => Function::new_native_with_env(&store, owasm_env.clone(), do_get_external_data_status),
218+
"read_external_data" => Function::new_native_with_env(&store, owasm_env.clone(), do_read_external_data),
219+
// "ecvrf_verify" => Function::new_native_with_env(&store, owasm_env.clone(), do_ecvrf_verify),
220+
},
221+
}
222+
}
223+
224+
pub fn _old_create_import_object<E>(store: &Store, owasm_env: Environment<E>) -> ImportObject
18225
where
19226
E: vm::Env + 'static,
20227
{

0 commit comments

Comments
 (0)