@@ -34,18 +34,14 @@ where
34
34
{
35
35
env. with_querier_from_context ( |querier| {
36
36
let span_size = querier. get_span_size ( ) ;
37
-
38
- let memory = env. memory ( ) ?;
39
- require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr + span_size) as usize ) ?;
40
-
41
37
let data = querier. get_calldata ( ) ?;
42
- env. decrease_gas_left ( 3_000_000_000 + ( data. len ( ) as u64 ) * 30_000_000 ) ?;
43
38
44
- for ( idx , byte ) in data. iter ( ) . enumerate ( ) {
45
- memory . view ( ) [ ptr as usize + idx ] . set ( * byte ) ;
39
+ if data. len ( ) as i64 > span_size {
40
+ return Err ( Error :: SpanTooSmallError ) ;
46
41
}
47
42
48
- Ok ( data. len ( ) as i64 )
43
+ env. decrease_gas_left ( 3_000_000_000 + ( data. len ( ) as u64 ) * 30_000_000 ) ?;
44
+ write_memory ( env, ptr, data)
49
45
} )
50
46
}
51
47
61
57
}
62
58
env. decrease_gas_left ( 1_500_000_000 + ( len as u64 ) * 50_000_000 ) ?;
63
59
64
- let memory = env. memory ( ) ?;
65
- require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr + span_size) as usize ) ?;
66
-
67
- let data: Vec < u8 > = memory. view ( ) [ ptr as usize ..( ptr + len) as usize ]
68
- . iter ( )
69
- . map ( |cell| cell. get ( ) )
70
- . collect ( ) ;
60
+ let data: Vec < u8 > = read_memory ( env, ptr, len) ?;
71
61
querier. set_return_data ( & data)
72
62
} )
73
63
}
@@ -130,13 +120,7 @@ where
130
120
}
131
121
env. decrease_gas_left ( 1_500_000_000 + ( len as u64 ) * 50_000_000 ) ?;
132
122
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 ( ) ;
123
+ let data: Vec < u8 > = read_memory ( env, ptr, len) ?;
140
124
querier. ask_external_data ( eid, did, & data)
141
125
} )
142
126
}
@@ -160,22 +144,18 @@ where
160
144
{
161
145
env. with_querier_from_context ( |querier| {
162
146
let span_size = querier. get_span_size ( ) ;
163
-
164
- let memory = env. memory ( ) ?;
165
- require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr + span_size) as usize ) ?;
166
-
167
147
let data = querier. get_external_data ( eid, vid) ?;
168
- env. decrease_gas_left ( 3_000_000_000 + ( data. len ( ) as u64 ) * 60_000_000 ) ?;
169
148
170
- for ( idx , byte ) in data. iter ( ) . enumerate ( ) {
171
- memory . view ( ) [ ptr as usize + idx ] . set ( * byte ) ;
149
+ if data. len ( ) as i64 > span_size {
150
+ return Err ( Error :: SpanTooSmallError ) ;
172
151
}
173
152
174
- Ok ( data. len ( ) as i64 )
153
+ env. decrease_gas_left ( 3_000_000_000 + ( data. len ( ) as u64 ) * 60_000_000 ) ?;
154
+ write_memory ( env, ptr, data)
175
155
} )
176
156
}
177
157
178
- fn get_from_mem < Q > ( env : & Environment < Q > , ptr : i64 , len : i64 ) -> Result < Vec < u8 > , Error >
158
+ fn read_memory < Q > ( env : & Environment < Q > , ptr : i64 , len : i64 ) -> Result < Vec < u8 > , Error >
179
159
where
180
160
Q : Querier + ' static ,
181
161
{
@@ -184,6 +164,18 @@ where
184
164
Ok ( memory. view ( ) [ ptr as usize ..( ptr + len) as usize ] . iter ( ) . map ( |cell| cell. get ( ) ) . collect ( ) )
185
165
}
186
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
+
187
179
fn do_ecvrf_verify < Q > (
188
180
env : & Environment < Q > ,
189
181
y_ptr : i64 ,
@@ -198,9 +190,9 @@ where
198
190
{
199
191
// consume gas relatively to the function running time (~12ms)
200
192
env. decrease_gas_left ( 7_500_000_000_000 ) ?;
201
- let y: Vec < u8 > = get_from_mem ( env, y_ptr, y_len) ?;
202
- let pi: Vec < u8 > = get_from_mem ( env, pi_ptr, pi_len) ?;
203
- let alpha: Vec < u8 > = get_from_mem ( env, alpha_ptr, alpha_len) ?;
193
+ let y: Vec < u8 > = read_memory ( env, y_ptr, y_len) ?;
194
+ let pi: Vec < u8 > = read_memory ( env, pi_ptr, pi_len) ?;
195
+ let alpha: Vec < u8 > = read_memory ( env, alpha_ptr, alpha_len) ?;
204
196
Ok ( ecvrf:: ecvrf_verify ( & y, & pi, & alpha) as u32 )
205
197
}
206
198
0 commit comments