Skip to content
This repository was archived by the owner on Nov 26, 2024. It is now read-only.

Commit d4e30af

Browse files
Merge pull request #191 from OffchainLabs/code
account_code and account_code_size host I/Os
2 parents abce7c5 + 5c9f1ee commit d4e30af

File tree

24 files changed

+347
-47
lines changed

24 files changed

+347
-47
lines changed

arbitrator/arbutil/src/evm/api.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ pub enum EvmApiMethod {
4242
GetReturnData,
4343
EmitLog,
4444
AccountBalance,
45+
AccountCode,
46+
AccountCodeSize,
4547
AccountCodeHash,
4648
AddPages,
4749
}
@@ -125,9 +127,23 @@ pub trait EvmApi: Send + 'static {
125127
/// Analogous to `vm.BALANCE`.
126128
fn account_balance(&mut self, address: Bytes20) -> (Bytes32, u64);
127129

130+
/// Returns the code and the access cost in gas.
131+
/// Analogous to `vm.EXTCODECOPY`.
132+
fn account_code(
133+
&mut self,
134+
address: Bytes20,
135+
offset: u32,
136+
size: u32,
137+
gas_left: u64,
138+
) -> (Vec<u8>, u64);
139+
140+
/// Returns the code size and the access cost in gas.
141+
/// Analogous to `vm.EXTCODESIZE`.
142+
fn account_code_size(&mut self, address: Bytes20, gas_left: u64) -> (u32, u64);
143+
128144
/// Gets the hash of the given address's code.
129145
/// Returns the hash and the access cost in gas.
130-
/// Analogous to `vm.CODEHASH`.
146+
/// Analogous to `vm.EXTCODEHASH`.
131147
fn account_codehash(&mut self, address: Bytes20) -> (Bytes32, u64);
132148

133149
/// Determines the cost in gas of allocating additional wasm pages.

arbitrator/arbutil/src/evm/js.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,22 @@ impl<T: JsCallIntoGo> EvmApi for JsEvmApi<T> {
296296
(value.assert_bytes32(), cost.assert_u64())
297297
}
298298

299+
fn account_code(
300+
&mut self,
301+
address: Bytes20,
302+
offset: u32,
303+
size: u32,
304+
gas_left: u64,
305+
) -> (Vec<u8>, u64) {
306+
let [value, cost] = call!(self, 2, AccountCode, address, offset, size, gas_left);
307+
(value.assert_bytes(), cost.assert_u64())
308+
}
309+
310+
fn account_code_size(&mut self, address: Bytes20, gas_left: u64) -> (u32, u64) {
311+
let [value, cost] = call!(self, 2, AccountCodeSize, address, gas_left);
312+
(value.assert_u32(), cost.assert_u64())
313+
}
314+
299315
fn account_codehash(&mut self, address: Bytes20) -> (Bytes32, u64) {
300316
let [value, cost] = call!(self, 2, AccountCodeHash, address);
301317
(value.assert_bytes32(), cost.assert_u64())

arbitrator/arbutil/src/evm/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ pub mod user;
1010
// params.SstoreSentryGasEIP2200
1111
pub const SSTORE_SENTRY_GAS: u64 = 2300;
1212

13+
// params.ColdAccountAccessCostEIP2929
14+
pub const COLD_ACCOUNT_GAS: u64 = 2600;
15+
16+
// params.ColdSloadCostEIP2929
17+
pub const COLD_SLOAD_GAS: u64 = 2100;
18+
1319
// params.LogGas and params.LogDataGas
1420
pub const LOG_TOPIC_GAS: u64 = 375;
1521
pub const LOG_DATA_GAS: u64 = 8;

arbitrator/langs/bf

Submodule bf updated 1 file

arbitrator/langs/c

Submodule c updated 1 file

arbitrator/prover/src/binary.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ impl<'a> WasmBinary<'a> {
575575
let asm_estimate = 5 * 1024 * 1024;
576576

577577
// TODO: determine safe value
578-
let init_gas = 2048;
578+
let init_gas = 4096;
579579

580580
let [ink_left, ink_status] = meter.globals();
581581
let depth_left = depth.globals();

arbitrator/stylus/src/evm_api.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,16 @@ pub struct GoEvmApi {
6464
unsafe extern "C" fn(id: usize, data: *mut RustBytes, topics: u32) -> EvmApiStatus,
6565
pub account_balance:
6666
unsafe extern "C" fn(id: usize, address: Bytes20, gas_cost: *mut u64) -> Bytes32, // balance
67+
pub account_code: unsafe extern "C" fn(
68+
id: usize,
69+
code: *mut RustBytes,
70+
address: Bytes20,
71+
offset: u32,
72+
size: u32,
73+
gas_cost: *mut u64,
74+
),
75+
pub account_code_size:
76+
unsafe extern "C" fn(id: usize, address: Bytes20, gas_cost: *mut u64) -> u32, // code size
6777
pub account_codehash:
6878
unsafe extern "C" fn(id: usize, address: Bytes20, gas_cost: *mut u64) -> Bytes32, // codehash
6979
pub add_pages: unsafe extern "C" fn(id: usize, pages: u16) -> u64, // gas cost
@@ -250,6 +260,33 @@ impl EvmApi for GoEvmApi {
250260
(value, cost)
251261
}
252262

263+
fn account_code(
264+
&mut self,
265+
address: Bytes20,
266+
offset: u32,
267+
size: u32,
268+
gas_left: u64,
269+
) -> (Vec<u8>, u64) {
270+
let mut data = RustBytes::new(vec![]);
271+
let mut cost = gas_left; // pass amount left
272+
call!(
273+
self,
274+
account_code,
275+
ptr!(data),
276+
address,
277+
offset,
278+
size,
279+
ptr!(cost)
280+
);
281+
(into_vec!(data), cost)
282+
}
283+
284+
fn account_code_size(&mut self, address: Bytes20, gas_left: u64) -> (u32, u64) {
285+
let mut cost = gas_left; // pass amount left
286+
let size = call!(self, account_code_size, address, ptr!(cost));
287+
(size, cost)
288+
}
289+
253290
fn account_codehash(&mut self, address: Bytes20) -> (Bytes32, u64) {
254291
let mut cost = 0;
255292
let value = call!(self, account_codehash, address, ptr!(cost));

arbitrator/stylus/src/host.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,23 @@ pub(crate) fn account_balance<E: EvmApi>(
219219
hostio!(env, account_balance(address, ptr))
220220
}
221221

222+
pub(crate) fn account_code<E: EvmApi>(
223+
mut env: WasmEnvMut<E>,
224+
address: u32,
225+
offset: u32,
226+
size: u32,
227+
code: u32,
228+
) -> Result<u32, Escape> {
229+
hostio!(env, account_code(address, offset, size, code))
230+
}
231+
232+
pub(crate) fn account_code_size<E: EvmApi>(
233+
mut env: WasmEnvMut<E>,
234+
address: u32,
235+
) -> Result<u32, Escape> {
236+
hostio!(env, account_code_size(address))
237+
}
238+
222239
pub(crate) fn account_codehash<E: EvmApi>(
223240
mut env: WasmEnvMut<E>,
224241
address: u32,

arbitrator/stylus/src/native.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,9 @@ impl<E: EvmApi> NativeInstance<E> {
136136
"return_data_size" => func!(host::return_data_size),
137137
"emit_log" => func!(host::emit_log),
138138
"account_balance" => func!(host::account_balance),
139+
"account_code" => func!(host::account_code),
139140
"account_codehash" => func!(host::account_codehash),
141+
"account_code_size" => func!(host::account_code_size),
140142
"evm_gas_left" => func!(host::evm_gas_left),
141143
"evm_ink_left" => func!(host::evm_ink_left),
142144
"block_basefee" => func!(host::block_basefee),
@@ -342,7 +344,9 @@ pub fn module(wasm: &[u8], compile: CompileConfig) -> Result<Vec<u8>> {
342344
"return_data_size" => stub!(u32 <- ||),
343345
"emit_log" => stub!(|_: u32, _: u32, _: u32|),
344346
"account_balance" => stub!(|_: u32, _: u32|),
347+
"account_code" => stub!(u32 <- |_: u32, _: u32, _: u32, _: u32|),
345348
"account_codehash" => stub!(|_: u32, _: u32|),
349+
"account_code_size" => stub!(u32 <- |_: u32|),
346350
"evm_gas_left" => stub!(u64 <- ||),
347351
"evm_ink_left" => stub!(u64 <- ||),
348352
"block_basefee" => stub!(|_: u32|),

0 commit comments

Comments
 (0)