@@ -14,7 +14,214 @@ fn require_mem_range(max_range: usize, require_range: usize) -> Result<(), Error
14
14
Ok ( ( ) )
15
15
}
16
16
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
+
17
201
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
18
225
where
19
226
E : vm:: Env + ' static ,
20
227
{
0 commit comments