@@ -5,26 +5,58 @@ use wasmer::{imports, Function, ImportObject, Store};
5
5
6
6
use owasm_crypto:: ecvrf;
7
7
8
+ const IMPORTED_FUNCTION_GAS : u64 = 750_000_000 ;
9
+ const ECVRF_VERIFY_GAS : u64 = 7_500_000_000_000 ;
10
+
8
11
fn require_mem_range ( max_range : usize , require_range : usize ) -> Result < ( ) , Error > {
9
12
if max_range < require_range {
10
13
return Err ( Error :: MemoryOutOfBoundError ) ;
11
14
}
12
15
Ok ( ( ) )
13
16
}
14
17
18
+ fn read_memory < Q > ( env : & Environment < Q > , ptr : i64 , len : i64 ) -> Result < Vec < u8 > , Error >
19
+ where
20
+ Q : Querier + ' static ,
21
+ {
22
+ let memory = env. memory ( ) ?;
23
+ require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr + len) as usize ) ?;
24
+ Ok ( memory. view ( ) [ ptr as usize ..( ptr + len) as usize ] . iter ( ) . map ( |cell| cell. get ( ) ) . collect ( ) )
25
+ }
26
+
27
+ fn write_memory < Q > ( env : & Environment < Q > , ptr : i64 , data : Vec < u8 > ) -> Result < i64 , Error >
28
+ where
29
+ Q : Querier + ' static ,
30
+ {
31
+ let memory = env. memory ( ) ?;
32
+ require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr + data. len ( ) as i64 ) as usize ) ?;
33
+ for ( idx, byte) in data. iter ( ) . enumerate ( ) {
34
+ memory. view ( ) [ ptr as usize + idx] . set ( * byte) ;
35
+ }
36
+ Ok ( data. len ( ) as i64 )
37
+ }
38
+
39
+ fn calculate_read_memory_gas ( len : i64 ) -> u64 {
40
+ 1_000_000_000 + ( len as u64 ) * 1_500_000
41
+ }
42
+
43
+ fn calculate_write_memory_gas ( len : usize ) -> u64 {
44
+ 2_250_000_000 + ( len as u64 ) * 30_000_000
45
+ }
46
+
15
47
fn do_gas < Q > ( env : & Environment < Q > , _gas : u32 ) -> Result < ( ) , Error >
16
48
where
17
49
Q : Querier + ' static ,
18
50
{
19
- env. decrease_gas_left ( 750_000_000 ) ?;
51
+ env. decrease_gas_left ( IMPORTED_FUNCTION_GAS ) ?;
20
52
Ok ( ( ) )
21
53
}
22
54
23
55
fn do_get_span_size < Q > ( env : & Environment < Q > ) -> Result < i64 , Error >
24
56
where
25
57
Q : Querier + ' static ,
26
58
{
27
- env. decrease_gas_left ( 750_000_000 ) ?;
59
+ env. decrease_gas_left ( IMPORTED_FUNCTION_GAS ) ?;
28
60
Ok ( env. with_querier_from_context ( |querier| querier. get_span_size ( ) ) )
29
61
}
30
62
40
72
return Err ( Error :: SpanTooSmallError ) ;
41
73
}
42
74
43
- env. decrease_gas_left ( 3_000_000_000 + ( data. len ( ) as u64 ) * 30_000_000 ) ?;
75
+ env. decrease_gas_left ( IMPORTED_FUNCTION_GAS + calculate_write_memory_gas ( data. len ( ) ) ) ?;
44
76
write_memory ( env, ptr, data)
45
77
} )
46
78
}
55
87
if len > span_size {
56
88
return Err ( Error :: SpanTooSmallError ) ;
57
89
}
58
- env. decrease_gas_left ( 1_750_000_000 + ( len as u64 ) * 1_500_000 ) ?;
90
+ env. decrease_gas_left ( IMPORTED_FUNCTION_GAS + calculate_read_memory_gas ( len) ) ?;
59
91
60
92
let data: Vec < u8 > = read_memory ( env, ptr, len) ?;
61
93
querier. set_return_data ( & data)
@@ -66,39 +98,39 @@ fn do_get_ask_count<Q>(env: &Environment<Q>) -> Result<i64, Error>
66
98
where
67
99
Q : Querier + ' static ,
68
100
{
69
- env. decrease_gas_left ( 750_000_000 ) ?;
101
+ env. decrease_gas_left ( IMPORTED_FUNCTION_GAS ) ?;
70
102
Ok ( env. with_querier_from_context ( |querier| querier. get_ask_count ( ) ) )
71
103
}
72
104
73
105
fn do_get_min_count < Q > ( env : & Environment < Q > ) -> Result < i64 , Error >
74
106
where
75
107
Q : Querier + ' static ,
76
108
{
77
- env. decrease_gas_left ( 750_000_000 ) ?;
109
+ env. decrease_gas_left ( IMPORTED_FUNCTION_GAS ) ?;
78
110
Ok ( env. with_querier_from_context ( |querier| querier. get_min_count ( ) ) )
79
111
}
80
112
81
113
fn do_get_prepare_time < Q > ( env : & Environment < Q > ) -> Result < i64 , Error >
82
114
where
83
115
Q : Querier + ' static ,
84
116
{
85
- env. decrease_gas_left ( 750_000_000 ) ?;
117
+ env. decrease_gas_left ( IMPORTED_FUNCTION_GAS ) ?;
86
118
Ok ( env. with_querier_from_context ( |querier| querier. get_prepare_time ( ) ) )
87
119
}
88
120
89
121
fn do_get_execute_time < Q > ( env : & Environment < Q > ) -> Result < i64 , Error >
90
122
where
91
123
Q : Querier + ' static ,
92
124
{
93
- env. decrease_gas_left ( 750_000_000 ) ?;
125
+ env. decrease_gas_left ( IMPORTED_FUNCTION_GAS ) ?;
94
126
env. with_querier_from_context ( |querier| querier. get_execute_time ( ) )
95
127
}
96
128
97
129
fn do_get_ans_count < Q > ( env : & Environment < Q > ) -> Result < i64 , Error >
98
130
where
99
131
Q : Querier + ' static ,
100
132
{
101
- env. decrease_gas_left ( 750_000_000 ) ?;
133
+ env. decrease_gas_left ( IMPORTED_FUNCTION_GAS ) ?;
102
134
env. with_querier_from_context ( |querier| querier. get_ans_count ( ) )
103
135
}
104
136
@@ -118,7 +150,7 @@ where
118
150
if len > span_size {
119
151
return Err ( Error :: SpanTooSmallError ) ;
120
152
}
121
- env. decrease_gas_left ( 1_750_000_000 + ( len as u64 ) * 1_500_000 ) ?;
153
+ env. decrease_gas_left ( IMPORTED_FUNCTION_GAS + calculate_read_memory_gas ( len) ) ?;
122
154
123
155
let data: Vec < u8 > = read_memory ( env, ptr, len) ?;
124
156
querier. ask_external_data ( eid, did, & data)
@@ -129,7 +161,7 @@ fn do_get_external_data_status<Q>(env: &Environment<Q>, eid: i64, vid: i64) -> R
129
161
where
130
162
Q : Querier + ' static ,
131
163
{
132
- env. decrease_gas_left ( 750_000_000 ) ?;
164
+ env. decrease_gas_left ( IMPORTED_FUNCTION_GAS ) ?;
133
165
env. with_querier_from_context ( |querier| querier. get_external_data_status ( eid, vid) )
134
166
}
135
167
@@ -150,32 +182,11 @@ where
150
182
return Err ( Error :: SpanTooSmallError ) ;
151
183
}
152
184
153
- env. decrease_gas_left ( 3_000_000_000 + ( data. len ( ) as u64 ) * 30_000_000 ) ?;
185
+ env. decrease_gas_left ( IMPORTED_FUNCTION_GAS + calculate_write_memory_gas ( data. len ( ) ) ) ?;
154
186
write_memory ( env, ptr, data)
155
187
} )
156
188
}
157
189
158
- fn read_memory < Q > ( env : & Environment < Q > , ptr : i64 , len : i64 ) -> Result < Vec < u8 > , Error >
159
- where
160
- Q : Querier + ' static ,
161
- {
162
- let memory = env. memory ( ) ?;
163
- require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr + len) as usize ) ?;
164
- Ok ( memory. view ( ) [ ptr as usize ..( ptr + len) as usize ] . iter ( ) . map ( |cell| cell. get ( ) ) . collect ( ) )
165
- }
166
-
167
- fn write_memory < Q > ( env : & Environment < Q > , ptr : i64 , data : Vec < u8 > ) -> Result < i64 , Error >
168
- where
169
- Q : Querier + ' static ,
170
- {
171
- let memory = env. memory ( ) ?;
172
- require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr + data. len ( ) as i64 ) as usize ) ?;
173
- for ( idx, byte) in data. iter ( ) . enumerate ( ) {
174
- memory. view ( ) [ ptr as usize + idx] . set ( * byte) ;
175
- }
176
- Ok ( data. len ( ) as i64 )
177
- }
178
-
179
190
fn do_ecvrf_verify < Q > (
180
191
env : & Environment < Q > ,
181
192
y_ptr : i64 ,
@@ -189,7 +200,7 @@ where
189
200
Q : Querier + ' static ,
190
201
{
191
202
// consume gas relatively to the function running time (~7.5ms)
192
- env. decrease_gas_left ( 7_500_000_000_000 ) ?;
203
+ env. decrease_gas_left ( ECVRF_VERIFY_GAS ) ?;
193
204
let y: Vec < u8 > = read_memory ( env, y_ptr, y_len) ?;
194
205
let pi: Vec < u8 > = read_memory ( env, pi_ptr, pi_len) ?;
195
206
let alpha: Vec < u8 > = read_memory ( env, alpha_ptr, alpha_len) ?;
0 commit comments