Skip to content

Commit

Permalink
add shanghai eips 3651, 3855, 3860 ref: rust-ethereum/evm#152
Browse files Browse the repository at this point in the history
  • Loading branch information
zjb0807 committed Jan 15, 2024
1 parent d8729c0 commit e5e853f
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 9 deletions.
8 changes: 4 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions modules/evm-utility/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ sha3 = { workspace = true }

sp-std = { workspace = true }

evm = { git = "https://github.com/rust-blockchain/evm", rev = "8ac19080a8523136e9212c749891f845d7ab0d0f", default-features = false, features = ["with-codec"] }
evm-gasometer = { git = "https://github.com/rust-blockchain/evm", rev = "8ac19080a8523136e9212c749891f845d7ab0d0f", default-features = false }
evm-runtime = { git = "https://github.com/rust-blockchain/evm", rev = "8ac19080a8523136e9212c749891f845d7ab0d0f", default-features = false }
evm = { git = "https://github.com/rust-blockchain/evm", rev = "2e9c3b71f7b9ff241735f15145517d0627c469e6", default-features = false, features = ["with-codec"] }
evm-gasometer = { git = "https://github.com/rust-blockchain/evm", rev = "2e9c3b71f7b9ff241735f15145517d0627c469e6", default-features = false }
evm-runtime = { git = "https://github.com/rust-blockchain/evm", rev = "2e9c3b71f7b9ff241735f15145517d0627c469e6", default-features = false }
#evm = { version = "0.41.1", default-features = false, features = ["with-codec"] }
#evm-gasometer = { version = "0.41.0", default-features = false }
#evm-runtime = { version = "0.41.0", default-features = false }
Expand Down
65 changes: 63 additions & 2 deletions modules/evm/src/runner/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,23 @@ impl<'config, 'precompiles, S: StackState<'config>, P: PrecompileSet> StackExecu
gasometer.record_transaction(transaction_cost)
}

fn maybe_record_init_code_cost(&mut self, init_code: &[u8]) -> Result<(), ExitError> {
if let Some(limit) = self.config.max_initcode_size {
// EIP-3860
if init_code.len() > limit {
self.state.metadata_mut().gasometer.fail();
let _ = self.exit_substate(StackExitKind::Failed);
return Err(ExitError::OutOfGas);
}
return self
.state
.metadata_mut()
.gasometer
.record_cost(gasometer::init_code_cost(init_code));
}
Ok(())
}

/// Execute a `CREATE` transaction.
pub fn transact_create(
&mut self,
Expand All @@ -521,6 +538,14 @@ impl<'config, 'precompiles, S: StackState<'config>, P: PrecompileSet> StackExecu
address: self.create_address(CreateScheme::Legacy { caller }),
});

if let Some(limit) = self.config.max_initcode_size {
if init_code.len() > limit {
self.state.metadata_mut().gasometer.fail();
let _ = self.exit_substate(StackExitKind::Failed);
return emit_exit!(ExitError::InitCodeLimit.into(), Vec::new());
}
}

if let Err(e) = self.record_create_transaction_cost(&init_code, &access_list) {
return emit_exit!(e.into(), Vec::new());
}
Expand Down Expand Up @@ -554,6 +579,14 @@ impl<'config, 'precompiles, S: StackState<'config>, P: PrecompileSet> StackExecu
gas_limit: u64,
access_list: Vec<(H160, Vec<H256>)>, // See EIP-2930
) -> (ExitReason, Vec<u8>) {
if let Some(limit) = self.config.max_initcode_size {
if init_code.len() > limit {
self.state.metadata_mut().gasometer.fail();
let _ = self.exit_substate(StackExitKind::Failed);
return emit_exit!(ExitError::InitCodeLimit.into(), Vec::new());
}
}

let code_hash = H256::from_slice(Keccak256::digest(&init_code).as_slice());
event!(TransactCreate2 {
caller,
Expand Down Expand Up @@ -605,6 +638,14 @@ impl<'config, 'precompiles, S: StackState<'config>, P: PrecompileSet> StackExecu
gas_limit: u64,
access_list: Vec<(H160, Vec<H256>)>,
) -> (ExitReason, Vec<u8>) {
if let Some(limit) = self.config.max_initcode_size {
if init_code.len() > limit {
self.state.metadata_mut().gasometer.fail();
let _ = self.exit_substate(StackExitKind::Failed);
return emit_exit!(ExitError::InitCodeLimit.into(), Vec::new());
}
}

event!(TransactCreate {
caller,
value,
Expand Down Expand Up @@ -672,8 +713,16 @@ impl<'config, 'precompiles, S: StackState<'config>, P: PrecompileSet> StackExecu

// Initialize initial addresses for EIP-2929
if self.config.increase_state_access_gas {
let addresses = core::iter::once(caller).chain(core::iter::once(address));
self.state.metadata_mut().access_addresses(addresses);
if self.config.warm_coinbase_address {
// Warm coinbase address for EIP-3651
let addresses = core::iter::once(caller)
.chain(core::iter::once(address))
.chain(core::iter::once(self.block_coinbase()));
self.state.metadata_mut().access_addresses(addresses);
} else {
let addresses = core::iter::once(caller).chain(core::iter::once(address));
self.state.metadata_mut().access_addresses(addresses);
}

self.initialize_with_access_list(access_list);
}
Expand Down Expand Up @@ -1254,6 +1303,12 @@ impl<'config, 'precompiles, S: StackState<'config>, P: PrecompileSet> Handler
init_code: Vec<u8>,
target_gas: Option<u64>,
) -> Capture<(ExitReason, Option<H160>, Vec<u8>), Self::CreateInterrupt> {
if let Err(e) = self.maybe_record_init_code_cost(&init_code) {
let reason: ExitReason = e.into();
emit_exit!(reason.clone());
return Capture::Exit((reason, None, Vec::new()));
}

self.create_inner(caller, scheme, value, init_code, target_gas, true)
}

Expand All @@ -1266,6 +1321,12 @@ impl<'config, 'precompiles, S: StackState<'config>, P: PrecompileSet> Handler
init_code: Vec<u8>,
target_gas: Option<u64>,
) -> Capture<(ExitReason, Option<H160>, Vec<u8>), Self::CreateInterrupt> {
if let Err(e) = self.maybe_record_init_code_cost(&init_code) {
let reason: ExitReason = e.into();
emit_exit!(reason.clone());
return Capture::Exit((reason, None, Vec::new()));
}

let capture = self.create_inner(caller, scheme, value, init_code, target_gas, true);

if let Capture::Exit((ref reason, _, ref return_value)) = capture {
Expand Down

0 comments on commit e5e853f

Please sign in to comment.