Skip to content

Commit

Permalink
Rewrite with hostfunction
Browse files Browse the repository at this point in the history
  • Loading branch information
boundless-forest committed Aug 2, 2024
1 parent 3bba36f commit a01b802
Show file tree
Hide file tree
Showing 11 changed files with 349 additions and 353 deletions.
3 changes: 3 additions & 0 deletions Cargo.lock

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

4 changes: 4 additions & 0 deletions frame/ethereum/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ fp-evm = { workspace = true }
fp-rpc = { workspace = true }
fp-storage = { workspace = true }
pallet-evm = { workspace = true }
cumulus-primitives-storage-weight-reclaim = { workspace = true }
log = { workspace = true }

[dev-dependencies]
hex = { workspace = true }
Expand All @@ -47,8 +49,10 @@ std = [
"evm/std",
"ethereum-types/std",
"rlp/std",
"log/std",
"scale-codec/std",
"scale-info/std",
"cumulus-primitives-storage-weight-reclaim/std",
# Substrate
"frame-support/std",
"frame-system/std",
Expand Down
35 changes: 21 additions & 14 deletions frame/ethereum/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ use fp_consensus::{PostLog, PreLog, FRONTIER_ENGINE_ID};
pub use fp_ethereum::TransactionData;
use fp_ethereum::ValidatedTransaction as ValidatedTransactionT;
use fp_evm::{
CallOrCreateInfo, CheckEvmTransaction, CheckEvmTransactionConfig, TransactionValidationError,
CallOrCreateInfo, CheckEvmTransaction, CheckEvmTransactionConfig, TransactionPov,
TransactionValidationError,
};
pub use fp_rpc::TransactionStatus;
use fp_storage::{EthereumStorageSchema, PALLET_ETHEREUM_SCHEMA};
Expand Down Expand Up @@ -295,7 +296,16 @@ pub mod pallet {
"pre log already exists; block is invalid",
);

Self::apply_validated_transaction(source, transaction).map(|(post_info, _)| post_info)
let proof_size_before_execution =
cumulus_primitives_storage_weight_reclaim::get_proof_size();

let res = Self::apply_validated_transaction(source, transaction)
.map(|(post_info, _)| post_info);
let proof_size_after_execution =
cumulus_primitives_storage_weight_reclaim::get_proof_size();
log::debug!(target: "evm", "bear: --- ethereum: proof_size: before: {:?}, after: {:?}", proof_size_before_execution, proof_size_after_execution);

res
}
}

Expand Down Expand Up @@ -361,17 +371,14 @@ pub mod pallet {
}

impl<T: Config> Pallet<T> {
pub fn transaction_weight(transaction_data: &TransactionData) -> (Option<Weight>, Option<u64>) {
match <T as pallet_evm::Config>::GasWeightMapping::gas_to_weight(
pub fn transaction_pov(transaction_data: &TransactionData) -> Option<TransactionPov> {
let extrinsics_len = transaction_data.proof_size_base_cost();
let weight_limit = <T as pallet_evm::Config>::GasWeightMapping::gas_to_weight(
transaction_data.gas_limit.unique_saturated_into(),
true,
) {
weight_limit if weight_limit.proof_size() > 0 => (
Some(weight_limit),
Some(transaction_data.proof_size_base_cost()),
),
_ => (None, None),
}
);
let storage_proof_size = cumulus_primitives_storage_weight_reclaim::get_proof_size();
TransactionPov::new(weight_limit, extrinsics_len, storage_proof_size)
}

fn recover_signer(transaction: &Transaction) -> Option<H160> {
Expand Down Expand Up @@ -493,7 +500,7 @@ impl<T: Config> Pallet<T> {
) -> TransactionValidity {
let transaction_data: TransactionData = transaction.into();
let transaction_nonce = transaction_data.nonce;
let (weight_limit, proof_size_base_cost) = Self::transaction_weight(&transaction_data);
let transaction_pov = Self::transaction_pov(&transaction_data);
let (base_fee, _) = T::FeeCalculator::min_gas_price();
let (who, _) = pallet_evm::Pallet::<T>::account_basic(&origin);

Expand Down Expand Up @@ -723,7 +730,7 @@ impl<T: Config> Pallet<T> {
config: Option<evm::Config>,
) -> Result<(Option<H160>, Option<H160>, CallOrCreateInfo), DispatchErrorWithPostInfo> {
let transaction_data: TransactionData = transaction.into();
let (weight_limit, proof_size_base_cost) = Self::transaction_weight(&transaction_data);
let transaction_pov = Self::transaction_pov(&transaction_data);
let is_transactional = true;
let validate = false;

Expand Down Expand Up @@ -861,7 +868,7 @@ impl<T: Config> Pallet<T> {
transaction: &Transaction,
) -> Result<(), TransactionValidityError> {
let transaction_data: TransactionData = transaction.into();
let (weight_limit, proof_size_base_cost) = Self::transaction_weight(&transaction_data);
let transaction_pov = Self::transaction_pov(&transaction_data);
let (base_fee, _) = T::FeeCalculator::min_gas_price();
let (who, _) = pallet_evm::Pallet::<T>::account_basic(&origin);

Expand Down
6 changes: 3 additions & 3 deletions frame/evm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,6 @@ pub mod pallet {
is_transactional,
validate,
None,
None,
T::config(),
) {
Ok(info) => info,
Expand Down Expand Up @@ -321,7 +320,6 @@ pub mod pallet {
is_transactional,
validate,
None,
None,
T::config(),
) {
Ok(info) => info,
Expand Down Expand Up @@ -409,7 +407,6 @@ pub mod pallet {
is_transactional,
validate,
None,
None,
T::config(),
) {
Ok(info) => info,
Expand Down Expand Up @@ -480,6 +477,8 @@ pub mod pallet {

#[pallet::error]
pub enum Error<T> {
/// Proof size limit is too low
ProofLimitTooLow,
/// Not enough balance to perform action
BalanceLow,
/// Calculating total fee overflowed
Expand Down Expand Up @@ -511,6 +510,7 @@ pub mod pallet {
impl<T> From<TransactionValidationError> for Error<T> {
fn from(validation_error: TransactionValidationError) -> Self {
match validation_error {
TransactionValidationError::ProofLimitTooLow => Error::<T>::ProofLimitTooLow,
TransactionValidationError::GasLimitTooLow => Error::<T>::GasLimitTooLow,
TransactionValidationError::GasLimitTooHigh => Error::<T>::GasLimitTooHigh,
TransactionValidationError::BalanceTooLow => Error::<T>::BalanceLow,
Expand Down
14 changes: 5 additions & 9 deletions frame/evm/src/runner/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ pub mod stack;

use crate::{Config, Weight};
use alloc::vec::Vec;
use fp_evm::{CallInfo, CreateInfo};
use fp_evm::{CallInfo, CreateInfo, TransactionPov};
use sp_core::{H160, H256, U256};

#[derive(Debug)]
Expand All @@ -42,8 +42,7 @@ pub trait Runner<T: Config> {
nonce: Option<U256>,
access_list: Vec<(H160, Vec<H256>)>,
is_transactional: bool,
weight_limit: Option<Weight>,
proof_size_base_cost: Option<u64>,
transaction_pov: Option<TransactionPov>,
evm_config: &evm::Config,
) -> Result<(), RunnerError<Self::Error>>;

Expand All @@ -59,8 +58,7 @@ pub trait Runner<T: Config> {
access_list: Vec<(H160, Vec<H256>)>,
is_transactional: bool,
validate: bool,
weight_limit: Option<Weight>,
proof_size_base_cost: Option<u64>,
transaction_pov: Option<TransactionPov>,
config: &evm::Config,
) -> Result<CallInfo, RunnerError<Self::Error>>;

Expand All @@ -75,8 +73,7 @@ pub trait Runner<T: Config> {
access_list: Vec<(H160, Vec<H256>)>,
is_transactional: bool,
validate: bool,
weight_limit: Option<Weight>,
proof_size_base_cost: Option<u64>,
transaction_pov: Option<TransactionPov>,
config: &evm::Config,
) -> Result<CreateInfo, RunnerError<Self::Error>>;

Expand All @@ -92,8 +89,7 @@ pub trait Runner<T: Config> {
access_list: Vec<(H160, Vec<H256>)>,
is_transactional: bool,
validate: bool,
weight_limit: Option<Weight>,
proof_size_base_cost: Option<u64>,
transaction_pov: Option<TransactionPov>,
config: &evm::Config,
) -> Result<CreateInfo, RunnerError<Self::Error>>;
}
Loading

0 comments on commit a01b802

Please sign in to comment.