diff --git a/frame/ethereum/src/lib.rs b/frame/ethereum/src/lib.rs index a211f2478e..2a4b4d36f9 100644 --- a/frame/ethereum/src/lib.rs +++ b/frame/ethereum/src/lib.rs @@ -255,7 +255,6 @@ pub mod pallet { UniqueSaturatedInto::::unique_saturated_into(to_remove), )); } - Pending::::kill(); } fn on_initialize(_: BlockNumberFor) -> Weight { @@ -348,10 +347,10 @@ pub mod pallet { PreLogExists, } - /// Current building block's transactions and receipts. + /// Mapping from transaction index to transaction in the current building block. #[pallet::storage] pub type Pending = - StorageValue<_, Vec<(Transaction, TransactionStatus, Receipt)>, ValueQuery>; + CountedStorageMap<_, Identity, u32, (Transaction, TransactionStatus, Receipt), OptionQuery>; /// The current Ethereum block. #[pallet::storage] @@ -436,22 +435,25 @@ impl Pallet { } fn store_block(post_log: Option, block_number: U256) { - let mut transactions = Vec::new(); - let mut statuses = Vec::new(); - let mut receipts = Vec::new(); + let transactions_count = Pending::::count(); + let mut transactions = Vec::with_capacity(transactions_count as usize); + let mut statuses = Vec::with_capacity(transactions_count as usize); + let mut receipts = Vec::with_capacity(transactions_count as usize); let mut logs_bloom = Bloom::default(); let mut cumulative_gas_used = U256::zero(); - for (transaction, status, receipt) in Pending::::get() { - transactions.push(transaction); - statuses.push(status); - receipts.push(receipt.clone()); - let (logs, used_gas) = match receipt { - Receipt::Legacy(d) | Receipt::EIP2930(d) | Receipt::EIP1559(d) => { - (d.logs.clone(), d.used_gas) - } - }; - cumulative_gas_used = used_gas; - Self::logs_bloom(logs, &mut logs_bloom); + for transaction_index in 0..transactions_count { + if let Some((transaction, status, receipt)) = Pending::::take(transaction_index) { + transactions.push(transaction); + statuses.push(status); + receipts.push(receipt.clone()); + let (logs, used_gas) = match receipt { + Receipt::Legacy(d) | Receipt::EIP2930(d) | Receipt::EIP1559(d) => { + (d.logs.clone(), d.used_gas) + } + }; + cumulative_gas_used = used_gas; + Self::logs_bloom(logs, &mut logs_bloom); + } } let ommers = Vec::::new(); @@ -597,9 +599,8 @@ impl Pallet { ) -> Result<(PostDispatchInfo, CallOrCreateInfo), DispatchErrorWithPostInfo> { let (to, _, info) = Self::execute(source, &transaction, None)?; - let pending = Pending::::get(); let transaction_hash = transaction.hash(); - let transaction_index = pending.len() as u32; + let transaction_index = Pending::::count(); let (reason, status, weight_info, used_gas, dest, extra_data) = match info.clone() { CallOrCreateInfo::Call(info) => ( @@ -675,7 +676,9 @@ impl Pallet { }; let logs_bloom = status.logs_bloom; let logs = status.clone().logs; - let cumulative_gas_used = if let Some((_, _, receipt)) = pending.last() { + let cumulative_gas_used = if let Some((_, _, receipt)) = + Pending::::get(transaction_index.saturating_sub(1)) + { match receipt { Receipt::Legacy(d) | Receipt::EIP2930(d) | Receipt::EIP1559(d) => { d.used_gas.saturating_add(used_gas.effective) @@ -706,7 +709,7 @@ impl Pallet { } }; - Pending::::append((transaction, status, receipt)); + Pending::::insert(transaction_index, (transaction, status, receipt)); Self::deposit_event(Event::Executed { from: source,