Skip to content

Commit

Permalink
update evm call stack ref: rust-ethereum/evm#155
Browse files Browse the repository at this point in the history
  • Loading branch information
zjb0807 committed Jan 14, 2024
1 parent 37e4925 commit d8729c0
Show file tree
Hide file tree
Showing 29 changed files with 54 additions and 194 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 = "842e03d068ddb6a3195a2dedc4a9b63caadb3355", default-features = false, features = ["with-codec"] }
evm-gasometer = { git = "https://github.com/rust-blockchain/evm", rev = "842e03d068ddb6a3195a2dedc4a9b63caadb3355", default-features = false }
evm-runtime = { git = "https://github.com/rust-blockchain/evm", rev = "842e03d068ddb6a3195a2dedc4a9b63caadb3355", default-features = false }
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 = { 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
8 changes: 6 additions & 2 deletions modules/evm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

pub use crate::runner::{
stack::SubstrateStackState,
state::{PrecompileSet, StackExecutor, StackSubstateMetadata},
state::{PrecompileResult, StackExecutor, StackSubstateMetadata},
storage_meter::StorageMeter,
Runner,
};
Expand All @@ -46,7 +46,11 @@ use frame_system::{ensure_root, ensure_signed, pallet_prelude::*, EnsureRoot, En
use hex_literal::hex;
pub use module_evm_utility::{
ethereum::{AccessListItem, Log, TransactionAction},
evm::{self, Config as EvmConfig, Context, ExitError, ExitFatal, ExitReason, ExitRevert, ExitSucceed},
evm::{
self,
executor::stack::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileSet},
Config as EvmConfig, Context, ExitError, ExitFatal, ExitReason, ExitRevert, ExitSucceed,
},
Account,
};
pub use module_support::{
Expand Down
2 changes: 1 addition & 1 deletion modules/evm/src/precompiles/blake2/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use super::Precompile;
use crate::runner::state::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult};
use crate::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult};
use module_evm_utility::evm::{ExitError, ExitSucceed};

mod eip_152;
Expand Down
2 changes: 1 addition & 1 deletion modules/evm/src/precompiles/bn128.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use super::Precompile;
use crate::runner::state::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult};
use crate::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult};
use module_evm_utility::evm::{ExitError, ExitSucceed};
use sp_core::U256;
use sp_std::vec::Vec;
Expand Down
2 changes: 1 addition & 1 deletion modules/evm/src/precompiles/ecrecover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use super::LinearCostPrecompile;
use crate::runner::state::PrecompileFailure;
use crate::PrecompileFailure;
use module_evm_utility::evm::ExitSucceed;
use sp_std::{cmp::min, vec::Vec};

Expand Down
2 changes: 1 addition & 1 deletion modules/evm/src/precompiles/ecrecover_publickey.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use super::LinearCostPrecompile;
use crate::runner::state::PrecompileFailure;
use crate::PrecompileFailure;
use module_evm_utility::evm::{ExitError, ExitSucceed};
use sp_std::{cmp::min, vec::Vec};

Expand Down
2 changes: 1 addition & 1 deletion modules/evm/src/precompiles/identity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use super::LinearCostPrecompile;
use crate::runner::state::PrecompileFailure;
use crate::PrecompileFailure;
use module_evm_utility::evm::ExitSucceed;
use sp_std::vec::Vec;

Expand Down
4 changes: 2 additions & 2 deletions modules/evm/src/precompiles/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

//! Builtin precompiles.

use crate::runner::state::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult};
use crate::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult};
use module_evm_utility::evm::{ExitError, ExitSucceed};
use sp_std::vec::Vec;

Expand Down Expand Up @@ -93,7 +93,7 @@ fn ensure_linear_cost(target_gas: Option<u64>, len: u64, base: u64, word: u64) -
}

pub mod tests {
use crate::{runner::state::PrecompileHandle, ExitError, ExitReason};
use crate::{ExitError, ExitReason, PrecompileHandle};
use module_evm_utility::evm::{Context, Transfer};
use sp_core::{H160, H256};
use sp_std::vec::Vec;
Expand Down
2 changes: 1 addition & 1 deletion modules/evm/src/precompiles/modexp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use super::Precompile;
use crate::runner::state::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult};
use crate::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult};
use module_evm_utility::evm::{ExitError, ExitSucceed};
use num::{BigUint, One, Zero};
use sp_core::U256;
Expand Down
2 changes: 1 addition & 1 deletion modules/evm/src/precompiles/ripemd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use super::LinearCostPrecompile;
use crate::runner::state::PrecompileFailure;
use crate::PrecompileFailure;
use module_evm_utility::evm::ExitSucceed;
use sha3::Digest;
use sp_std::vec::Vec;
Expand Down
2 changes: 1 addition & 1 deletion modules/evm/src/precompiles/sha256.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use super::LinearCostPrecompile;
use crate::runner::state::PrecompileFailure;
use crate::PrecompileFailure;
use module_evm_utility::evm::ExitSucceed;
use sp_std::vec::Vec;

Expand Down
2 changes: 1 addition & 1 deletion modules/evm/src/precompiles/sha3fips.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use super::LinearCostPrecompile;
use crate::runner::state::PrecompileFailure;
use crate::PrecompileFailure;
use module_evm_utility::evm::ExitSucceed;
use sp_std::vec::Vec;
use tiny_keccak::Hasher;
Expand Down
135 changes: 3 additions & 132 deletions modules/evm/src/runner/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@
use crate::{
encode_revert_message,
runner::tagged_runtime::{RuntimeKind, TaggedRuntime},
StorageMeter,
PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileSet, StorageMeter,
};
use core::{cmp::min, convert::Infallible};
use module_evm_utility::{
evm::{
backend::Backend, maybe_borrowed::MaybeBorrowed, Capture, Config, Context, CreateScheme, ExitError, ExitFatal,
ExitReason, ExitRevert, ExitSucceed, Opcode, Resolve, Runtime, Stack, Transfer,
ExitReason, Opcode, Resolve, Runtime, Stack, Transfer,
},
evm_gasometer::{self as gasometer, Gasometer, StorageTarget},
evm_runtime::Handler,
Expand All @@ -43,11 +43,7 @@ pub use primitives::{
use sha3::{Digest, Keccak256};
use sp_core::{H160, H256, U256};
use sp_runtime::traits::Zero;
use sp_std::{
collections::{btree_map::BTreeMap, btree_set::BTreeSet},
rc::Rc,
vec::Vec,
};
use sp_std::{collections::btree_set::BTreeSet, rc::Rc, vec::Vec};

macro_rules! event {
($x:expr) => {};
Expand Down Expand Up @@ -355,134 +351,9 @@ pub trait StackState<'config>: Backend {
}
}

/// Data returned by a precompile on success.
#[derive(Debug, Eq, PartialEq, Clone)]
pub struct PrecompileOutput {
pub exit_status: ExitSucceed,
pub output: Vec<u8>,
}

/// Data returned by a precompile in case of failure.
#[derive(Debug, Eq, PartialEq, Clone)]
pub enum PrecompileFailure {
/// Reverts the state changes and consume all the gas.
Error { exit_status: ExitError },
/// Reverts the state changes.
/// Returns the provided error message.
Revert { exit_status: ExitRevert, output: Vec<u8> },
/// Mark this failure as fatal, and all EVM execution stacks must be exited.
Fatal { exit_status: ExitFatal },
}

impl From<ExitError> for PrecompileFailure {
fn from(error: ExitError) -> PrecompileFailure {
PrecompileFailure::Error { exit_status: error }
}
}

/// Handle provided to a precompile to interact with the EVM.
pub trait PrecompileHandle {
/// Perform subcall in provided context.
/// Precompile specifies in which context the subcall is executed.
fn call(
&mut self,
to: H160,
transfer: Option<Transfer>,
input: Vec<u8>,
gas_limit: Option<u64>,
is_static: bool,
context: &Context,
) -> (ExitReason, Vec<u8>);

/// Record cost to the Runtime gasometer.
fn record_cost(&mut self, cost: u64) -> Result<(), ExitError>;

/// Retreive the remaining gas.
fn remaining_gas(&self) -> u64;

/// Record a log.
fn log(&mut self, address: H160, topics: Vec<H256>, data: Vec<u8>) -> Result<(), ExitError>;

/// Retreive the code address (what is the address of the precompile being called).
fn code_address(&self) -> H160;

/// Retreive the input data the precompile is called with.
fn input(&self) -> &[u8];

/// Retreive the context in which the precompile is executed.
fn context(&self) -> &Context;

/// Is the precompile call is done statically.
fn is_static(&self) -> bool;

/// Retreive the gas limit of this call.
fn gas_limit(&self) -> Option<u64>;
}

/// A precompile result.
pub type PrecompileResult = Result<PrecompileOutput, PrecompileFailure>;

/// A set of precompiles.
/// Checks of the provided address being in the precompile set should be
/// as cheap as possible since it may be called often.
pub trait PrecompileSet {
/// Tries to execute a precompile in the precompile set.
/// If the provided address is not a precompile, returns None.
fn execute(&self, handle: &mut impl PrecompileHandle) -> Option<PrecompileResult>;

/// Check if the given address is a precompile. Should only be called to
/// perform the check while not executing the precompile afterward, since
/// `execute` already performs a check internally.
fn is_precompile(&self, address: H160) -> bool;
}

impl PrecompileSet for () {
fn execute(&self, _: &mut impl PrecompileHandle) -> Option<PrecompileResult> {
None
}

fn is_precompile(&self, _: H160) -> bool {
false
}
}

/// Precompiles function signature. Expected input arguments are:
/// * Input
/// * Gas limit
/// * Context
/// * Is static
///
/// In case of success returns the output and the cost.
pub type PrecompileFn = fn(&[u8], Option<u64>, &Context, bool) -> Result<(PrecompileOutput, u64), PrecompileFailure>;

impl PrecompileSet for BTreeMap<H160, PrecompileFn> {
fn execute(&self, handle: &mut impl PrecompileHandle) -> Option<PrecompileResult> {
let address = handle.code_address();

self.get(&address).map(|precompile| {
let input = handle.input();
let gas_limit = handle.gas_limit();
let context = handle.context();
let is_static = handle.is_static();

match (*precompile)(input, gas_limit, context, is_static) {
Ok((output, cost)) => {
handle.record_cost(cost)?;
Ok(output)
}
Err(err) => Err(err),
}
})
}

/// Check if the given address is a precompile. Should only be called to
/// perform the check while not executing the precompile afterward, since
/// `execute` already performs a check internally.
fn is_precompile(&self, address: H160) -> bool {
self.contains_key(&address)
}
}

/// Stack-based executor.
pub struct StackExecutor<'config, 'precompiles, S, P> {
config: &'config Config,
Expand Down
5 changes: 2 additions & 3 deletions runtime/common/src/precompile/dex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,8 @@ use crate::WeightToGas;
use frame_support::traits::Get;
use module_dex::WeightInfo;
use module_evm::{
precompiles::Precompile,
runner::state::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult},
ExitRevert, ExitSucceed,
precompiles::Precompile, ExitRevert, ExitSucceed, PrecompileFailure, PrecompileHandle, PrecompileOutput,
PrecompileResult,
};
use module_support::{DEXManager, SwapLimit};
use num_enum::{IntoPrimitive, TryFromPrimitive};
Expand Down
5 changes: 2 additions & 3 deletions runtime/common/src/precompile/evm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,8 @@ use super::{
};
use crate::WeightToGas;
use module_evm::{
precompiles::Precompile,
runner::state::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult},
ExitRevert, ExitSucceed, WeightInfo,
precompiles::Precompile, ExitRevert, ExitSucceed, PrecompileFailure, PrecompileHandle, PrecompileOutput,
PrecompileResult, WeightInfo,
};
use module_support::EVMManager;
use num_enum::{IntoPrimitive, TryFromPrimitive};
Expand Down
5 changes: 2 additions & 3 deletions runtime/common/src/precompile/evm_accounts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@ use super::input::{Input, InputT, Output};
use crate::WeightToGas;
use frame_support::{pallet_prelude::IsType, traits::Get};
use module_evm::{
precompiles::Precompile,
runner::state::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult},
ExitRevert, ExitSucceed,
precompiles::Precompile, ExitRevert, ExitSucceed, PrecompileFailure, PrecompileHandle, PrecompileOutput,
PrecompileResult,
};
use module_evm_accounts::WeightInfo;
use module_support::EVMAccountsManager;
Expand Down
5 changes: 2 additions & 3 deletions runtime/common/src/precompile/homa.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@ use super::input::{Input, InputPricer, InputT, Output};
use crate::WeightToGas;
use frame_support::traits::Get;
use module_evm::{
precompiles::Precompile,
runner::state::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult},
ExitRevert, ExitSucceed,
precompiles::Precompile, ExitRevert, ExitSucceed, PrecompileFailure, PrecompileHandle, PrecompileOutput,
PrecompileResult,
};
use module_support::HomaManager;

Expand Down
5 changes: 2 additions & 3 deletions runtime/common/src/precompile/honzon.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@ use super::input::{Input, InputPricer, InputT, Output};
use crate::WeightToGas;
use frame_support::traits::Get;
use module_evm::{
precompiles::Precompile,
runner::state::{PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileResult},
ExitRevert, ExitSucceed,
precompiles::Precompile, ExitRevert, ExitSucceed, PrecompileFailure, PrecompileHandle, PrecompileOutput,
PrecompileResult,
};
use module_honzon::WeightInfo;
use module_support::HonzonManager;
Expand Down
Loading

0 comments on commit d8729c0

Please sign in to comment.