Skip to content

Commit d966399

Browse files
committed
refactor read/write memory
1 parent 32dd806 commit d966399

File tree

1 file changed

+26
-34
lines changed

1 file changed

+26
-34
lines changed

packages/vm/src/imports.rs

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,14 @@ where
3434
{
3535
env.with_querier_from_context(|querier| {
3636
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-
4137
let data = querier.get_calldata()?;
42-
env.decrease_gas_left(3_000_000_000 + (data.len() as u64) * 30_000_000)?;
4338

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);
4641
}
4742

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)
4945
})
5046
}
5147

@@ -61,13 +57,7 @@ where
6157
}
6258
env.decrease_gas_left(1_500_000_000 + (len as u64) * 50_000_000)?;
6359

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)?;
7161
querier.set_return_data(&data)
7262
})
7363
}
@@ -130,13 +120,7 @@ where
130120
}
131121
env.decrease_gas_left(1_500_000_000 + (len as u64) * 50_000_000)?;
132122

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)?;
140124
querier.ask_external_data(eid, did, &data)
141125
})
142126
}
@@ -160,22 +144,18 @@ where
160144
{
161145
env.with_querier_from_context(|querier| {
162146
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-
167147
let data = querier.get_external_data(eid, vid)?;
168-
env.decrease_gas_left(3_000_000_000 + (data.len() as u64) * 60_000_000)?;
169148

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);
172151
}
173152

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)
175155
})
176156
}
177157

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>
179159
where
180160
Q: Querier + 'static,
181161
{
@@ -184,6 +164,18 @@ where
184164
Ok(memory.view()[ptr as usize..(ptr + len) as usize].iter().map(|cell| cell.get()).collect())
185165
}
186166

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+
187179
fn do_ecvrf_verify<Q>(
188180
env: &Environment<Q>,
189181
y_ptr: i64,
@@ -198,9 +190,9 @@ where
198190
{
199191
// consume gas relatively to the function running time (~12ms)
200192
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)?;
204196
Ok(ecvrf::ecvrf_verify(&y, &pi, &alpha) as u32)
205197
}
206198

0 commit comments

Comments
 (0)