mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat(primitives): add Receipts to encapsulate Vec<Vec<Option<Receipt>> (#4626)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
@ -6,7 +6,9 @@ use reth_db::{
|
|||||||
transaction::{DbTx, DbTxMut},
|
transaction::{DbTx, DbTxMut},
|
||||||
};
|
};
|
||||||
use reth_interfaces::{db::DatabaseError, RethError};
|
use reth_interfaces::{db::DatabaseError, RethError};
|
||||||
use reth_primitives::{stage::StageId, Account, Bytecode, ChainSpec, StorageEntry, H256, U256};
|
use reth_primitives::{
|
||||||
|
stage::StageId, Account, Bytecode, ChainSpec, Receipts, StorageEntry, H256, U256,
|
||||||
|
};
|
||||||
use reth_provider::{
|
use reth_provider::{
|
||||||
bundle_state::{BundleStateInit, RevertsInit},
|
bundle_state::{BundleStateInit, RevertsInit},
|
||||||
BundleStateWithReceipts, DatabaseProviderRW, HashingWriter, HistoryWriter, OriginalValuesKnown,
|
BundleStateWithReceipts, DatabaseProviderRW, HashingWriter, HistoryWriter, OriginalValuesKnown,
|
||||||
@ -145,7 +147,7 @@ pub fn insert_genesis_state<DB: Database>(
|
|||||||
state_init,
|
state_init,
|
||||||
all_reverts_init,
|
all_reverts_init,
|
||||||
contracts.into_iter().collect(),
|
contracts.into_iter().collect(),
|
||||||
vec![],
|
Receipts::new(),
|
||||||
0,
|
0,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -25,7 +25,7 @@ use reth_primitives::{
|
|||||||
EMPTY_WITHDRAWALS, ETHEREUM_BLOCK_GAS_LIMIT, RETH_CLIENT_VERSION, SLOT_DURATION,
|
EMPTY_WITHDRAWALS, ETHEREUM_BLOCK_GAS_LIMIT, RETH_CLIENT_VERSION, SLOT_DURATION,
|
||||||
},
|
},
|
||||||
proofs, Block, BlockNumberOrTag, ChainSpec, Header, IntoRecoveredTransaction, Receipt,
|
proofs, Block, BlockNumberOrTag, ChainSpec, Header, IntoRecoveredTransaction, Receipt,
|
||||||
SealedBlock, Withdrawal, EMPTY_OMMER_ROOT, H256, U256,
|
Receipts, SealedBlock, Withdrawal, EMPTY_OMMER_ROOT, H256, U256,
|
||||||
};
|
};
|
||||||
use reth_provider::{BlockReaderIdExt, BlockSource, BundleStateWithReceipts, StateProviderFactory};
|
use reth_provider::{BlockReaderIdExt, BlockSource, BundleStateWithReceipts, StateProviderFactory};
|
||||||
use reth_revm::{
|
use reth_revm::{
|
||||||
@ -787,7 +787,11 @@ where
|
|||||||
// 4788 contract call
|
// 4788 contract call
|
||||||
db.merge_transitions(BundleRetention::PlainState);
|
db.merge_transitions(BundleRetention::PlainState);
|
||||||
|
|
||||||
let bundle = BundleStateWithReceipts::new(db.take_bundle(), vec![receipts], block_number);
|
let bundle = BundleStateWithReceipts::new(
|
||||||
|
db.take_bundle(),
|
||||||
|
Receipts::from_vec(vec![receipts]),
|
||||||
|
block_number,
|
||||||
|
);
|
||||||
let receipts_root = bundle.receipts_root_slow(block_number).expect("Number is in range");
|
let receipts_root = bundle.receipts_root_slow(block_number).expect("Number is in range");
|
||||||
let logs_bloom = bundle.block_logs_bloom(block_number).expect("Number is in range");
|
let logs_bloom = bundle.block_logs_bloom(block_number).expect("Number is in range");
|
||||||
|
|
||||||
@ -907,7 +911,8 @@ where
|
|||||||
db.merge_transitions(BundleRetention::PlainState);
|
db.merge_transitions(BundleRetention::PlainState);
|
||||||
|
|
||||||
// calculate the state root
|
// calculate the state root
|
||||||
let bundle_state = BundleStateWithReceipts::new(db.take_bundle(), vec![], block_number);
|
let bundle_state =
|
||||||
|
BundleStateWithReceipts::new(db.take_bundle(), Receipts::new(), block_number);
|
||||||
let state_root = state.state_root(&bundle_state)?;
|
let state_root = state.state_root(&bundle_state)?;
|
||||||
|
|
||||||
let header = Header {
|
let header = Header {
|
||||||
|
|||||||
@ -83,7 +83,7 @@ pub use prune::{
|
|||||||
PruneBatchSizes, PruneCheckpoint, PruneMode, PruneModes, PrunePart, PrunePartError,
|
PruneBatchSizes, PruneCheckpoint, PruneMode, PruneModes, PrunePart, PrunePartError,
|
||||||
ReceiptsLogPruneConfig, MINIMUM_PRUNING_DISTANCE,
|
ReceiptsLogPruneConfig, MINIMUM_PRUNING_DISTANCE,
|
||||||
};
|
};
|
||||||
pub use receipt::{Receipt, ReceiptWithBloom, ReceiptWithBloomRef};
|
pub use receipt::{Receipt, ReceiptWithBloom, ReceiptWithBloomRef, Receipts};
|
||||||
pub use revm_primitives::JumpMap;
|
pub use revm_primitives::JumpMap;
|
||||||
pub use serde_helper::JsonU256;
|
pub use serde_helper::JsonU256;
|
||||||
pub use storage::StorageEntry;
|
pub use storage::StorageEntry;
|
||||||
|
|||||||
@ -26,6 +26,9 @@ pub enum PrunePartError {
|
|||||||
/// Invalid configuration of a prune part.
|
/// Invalid configuration of a prune part.
|
||||||
#[error("The configuration provided for {0} is invalid.")]
|
#[error("The configuration provided for {0} is invalid.")]
|
||||||
Configuration(PrunePart),
|
Configuration(PrunePart),
|
||||||
|
/// Receipts have been pruned
|
||||||
|
#[error("Receipts have been pruned")]
|
||||||
|
ReceiptsPruned,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|||||||
@ -1,12 +1,16 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
bloom::logs_bloom,
|
bloom::logs_bloom,
|
||||||
compression::{RECEIPT_COMPRESSOR, RECEIPT_DECOMPRESSOR},
|
compression::{RECEIPT_COMPRESSOR, RECEIPT_DECOMPRESSOR},
|
||||||
Bloom, Log, TxType,
|
proofs::calculate_receipt_root_ref,
|
||||||
|
Bloom, Log, PrunePartError, TxType, H256,
|
||||||
};
|
};
|
||||||
use bytes::{Buf, BufMut, BytesMut};
|
use bytes::{Buf, BufMut, BytesMut};
|
||||||
use reth_codecs::{main_codec, Compact, CompactZstd};
|
use reth_codecs::{main_codec, Compact, CompactZstd};
|
||||||
use reth_rlp::{length_of_length, Decodable, Encodable};
|
use reth_rlp::{length_of_length, Decodable, Encodable};
|
||||||
use std::cmp::Ordering;
|
use std::{
|
||||||
|
cmp::Ordering,
|
||||||
|
ops::{Deref, DerefMut},
|
||||||
|
};
|
||||||
|
|
||||||
/// Receipt containing result of transaction execution.
|
/// Receipt containing result of transaction execution.
|
||||||
#[main_codec(zstd)]
|
#[main_codec(zstd)]
|
||||||
@ -44,6 +48,95 @@ impl Receipt {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A collection of receipts organized as a two-dimensional vector.
|
||||||
|
#[derive(Clone, Debug, PartialEq, Eq, Default)]
|
||||||
|
pub struct Receipts {
|
||||||
|
/// A two-dimensional vector of optional `Receipt` instances.
|
||||||
|
pub receipt_vec: Vec<Vec<Option<Receipt>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Receipts {
|
||||||
|
/// Create a new `Receipts` instance with an empty vector.
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self { receipt_vec: vec![] }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create a new `Receipts` instance from an existing vector.
|
||||||
|
pub fn from_vec(vec: Vec<Vec<Option<Receipt>>>) -> Self {
|
||||||
|
Self { receipt_vec: vec }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the length of the `Receipts` vector.
|
||||||
|
pub fn len(&self) -> usize {
|
||||||
|
self.receipt_vec.len()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns `true` if the `Receipts` vector is empty.
|
||||||
|
pub fn is_empty(&self) -> bool {
|
||||||
|
self.receipt_vec.is_empty()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Push a new vector of receipts into the `Receipts` collection.
|
||||||
|
pub fn push(&mut self, receipts: Vec<Option<Receipt>>) {
|
||||||
|
self.receipt_vec.push(receipts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Retrieves the receipt root for all recorded receipts from index.
|
||||||
|
pub fn root_slow(&self, index: usize) -> Option<H256> {
|
||||||
|
Some(calculate_receipt_root_ref(
|
||||||
|
&self.receipt_vec[index].iter().map(Option::as_ref).collect::<Option<Vec<_>>>()?,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Retrieves gas spent by transactions as a vector of tuples (transaction index, gas used).
|
||||||
|
pub fn gas_spent_by_tx(&self) -> Result<Vec<(u64, u64)>, PrunePartError> {
|
||||||
|
self.last()
|
||||||
|
.map(|block_r| {
|
||||||
|
block_r
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(id, tx_r)| {
|
||||||
|
if let Some(receipt) = tx_r.as_ref() {
|
||||||
|
Ok((id as u64, receipt.cumulative_gas_used))
|
||||||
|
} else {
|
||||||
|
Err(PrunePartError::ReceiptsPruned)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<Result<Vec<_>, PrunePartError>>()
|
||||||
|
})
|
||||||
|
.unwrap_or(Ok(vec![]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deref for Receipts {
|
||||||
|
type Target = Vec<Vec<Option<Receipt>>>;
|
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.receipt_vec
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DerefMut for Receipts {
|
||||||
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||||
|
&mut self.receipt_vec
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IntoIterator for Receipts {
|
||||||
|
type Item = Vec<Option<Receipt>>;
|
||||||
|
type IntoIter = std::vec::IntoIter<Self::Item>;
|
||||||
|
|
||||||
|
fn into_iter(self) -> Self::IntoIter {
|
||||||
|
self.receipt_vec.into_iter()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromIterator<Vec<Option<Receipt>>> for Receipts {
|
||||||
|
fn from_iter<I: IntoIterator<Item = Vec<Option<Receipt>>>>(iter: I) -> Self {
|
||||||
|
Self::from_vec(iter.into_iter().collect())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<Receipt> for ReceiptWithBloom {
|
impl From<Receipt> for ReceiptWithBloom {
|
||||||
fn from(receipt: Receipt) -> Self {
|
fn from(receipt: Receipt) -> Self {
|
||||||
let bloom = receipt.bloom_slow();
|
let bloom = receipt.bloom_slow();
|
||||||
|
|||||||
@ -12,8 +12,8 @@ use reth_interfaces::{
|
|||||||
};
|
};
|
||||||
use reth_primitives::{
|
use reth_primitives::{
|
||||||
Address, Block, BlockNumber, Bloom, ChainSpec, Hardfork, Header, PruneMode, PruneModes,
|
Address, Block, BlockNumber, Bloom, ChainSpec, Hardfork, Header, PruneMode, PruneModes,
|
||||||
PrunePartError, Receipt, ReceiptWithBloom, TransactionSigned, H256, MINIMUM_PRUNING_DISTANCE,
|
PrunePartError, Receipt, ReceiptWithBloom, Receipts, TransactionSigned, H256,
|
||||||
U256,
|
MINIMUM_PRUNING_DISTANCE, U256,
|
||||||
};
|
};
|
||||||
use reth_provider::{
|
use reth_provider::{
|
||||||
BlockExecutor, BlockExecutorStats, BundleStateWithReceipts, PrunableBlockExecutor,
|
BlockExecutor, BlockExecutorStats, BundleStateWithReceipts, PrunableBlockExecutor,
|
||||||
@ -57,7 +57,7 @@ pub struct EVMProcessor<'a> {
|
|||||||
/// The inner vector stores receipts ordered by transaction number.
|
/// The inner vector stores receipts ordered by transaction number.
|
||||||
///
|
///
|
||||||
/// If receipt is None it means it is pruned.
|
/// If receipt is None it means it is pruned.
|
||||||
receipts: Vec<Vec<Option<Receipt>>>,
|
receipts: Receipts,
|
||||||
/// First block will be initialized to `None`
|
/// First block will be initialized to `None`
|
||||||
/// and be set to the block number of first block executed.
|
/// and be set to the block number of first block executed.
|
||||||
first_block: Option<BlockNumber>,
|
first_block: Option<BlockNumber>,
|
||||||
@ -86,7 +86,7 @@ impl<'a> EVMProcessor<'a> {
|
|||||||
chain_spec,
|
chain_spec,
|
||||||
evm,
|
evm,
|
||||||
stack: InspectorStack::new(InspectorStackConfig::default()),
|
stack: InspectorStack::new(InspectorStackConfig::default()),
|
||||||
receipts: Vec::new(),
|
receipts: Receipts::new(),
|
||||||
first_block: None,
|
first_block: None,
|
||||||
tip: None,
|
tip: None,
|
||||||
prune_modes: PruneModes::none(),
|
prune_modes: PruneModes::none(),
|
||||||
@ -119,7 +119,7 @@ impl<'a> EVMProcessor<'a> {
|
|||||||
chain_spec,
|
chain_spec,
|
||||||
evm,
|
evm,
|
||||||
stack: InspectorStack::new(InspectorStackConfig::default()),
|
stack: InspectorStack::new(InspectorStackConfig::default()),
|
||||||
receipts: Vec::new(),
|
receipts: Receipts::new(),
|
||||||
first_block: None,
|
first_block: None,
|
||||||
tip: None,
|
tip: None,
|
||||||
prune_modes: PruneModes::none(),
|
prune_modes: PruneModes::none(),
|
||||||
@ -352,24 +352,7 @@ impl<'a> EVMProcessor<'a> {
|
|||||||
return Err(BlockValidationError::BlockGasUsed {
|
return Err(BlockValidationError::BlockGasUsed {
|
||||||
got: cumulative_gas_used,
|
got: cumulative_gas_used,
|
||||||
expected: block.gas_used,
|
expected: block.gas_used,
|
||||||
gas_spent_by_tx: self
|
gas_spent_by_tx: self.receipts.gas_spent_by_tx()?,
|
||||||
.receipts
|
|
||||||
.last()
|
|
||||||
.map(|block_r| {
|
|
||||||
block_r
|
|
||||||
.iter()
|
|
||||||
.enumerate()
|
|
||||||
.map(|(id, tx_r)| {
|
|
||||||
(
|
|
||||||
id as u64,
|
|
||||||
tx_r.as_ref()
|
|
||||||
.expect("receipts have not been pruned")
|
|
||||||
.cumulative_gas_used,
|
|
||||||
)
|
|
||||||
})
|
|
||||||
.collect()
|
|
||||||
})
|
|
||||||
.unwrap_or_default(),
|
|
||||||
}
|
}
|
||||||
.into())
|
.into())
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,8 +4,8 @@ use crate::eth::error::{EthApiError, EthResult};
|
|||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
use reth_primitives::{
|
use reth_primitives::{
|
||||||
constants::{eip4844::MAX_DATA_GAS_PER_BLOCK, BEACON_NONCE},
|
constants::{eip4844::MAX_DATA_GAS_PER_BLOCK, BEACON_NONCE},
|
||||||
proofs, Block, ChainSpec, Header, IntoRecoveredTransaction, Receipt, SealedBlock, SealedHeader,
|
proofs, Block, ChainSpec, Header, IntoRecoveredTransaction, Receipt, Receipts, SealedBlock,
|
||||||
EMPTY_OMMER_ROOT, H256, U256,
|
SealedHeader, EMPTY_OMMER_ROOT, H256, U256,
|
||||||
};
|
};
|
||||||
use reth_provider::{BundleStateWithReceipts, ChainSpecProvider, StateProviderFactory};
|
use reth_provider::{BundleStateWithReceipts, ChainSpecProvider, StateProviderFactory};
|
||||||
use reth_revm::{
|
use reth_revm::{
|
||||||
@ -187,7 +187,11 @@ impl PendingBlockEnv {
|
|||||||
// merge all transitions into bundle state.
|
// merge all transitions into bundle state.
|
||||||
db.merge_transitions(BundleRetention::PlainState);
|
db.merge_transitions(BundleRetention::PlainState);
|
||||||
|
|
||||||
let bundle = BundleStateWithReceipts::new(db.take_bundle(), vec![receipts], block_number);
|
let bundle = BundleStateWithReceipts::new(
|
||||||
|
db.take_bundle(),
|
||||||
|
Receipts::from_vec(vec![receipts]),
|
||||||
|
block_number,
|
||||||
|
);
|
||||||
|
|
||||||
let receipts_root = bundle.receipts_root_slow(block_number).expect("Block is present");
|
let receipts_root = bundle.receipts_root_slow(block_number).expect("Block is present");
|
||||||
let logs_bloom = bundle.block_logs_bloom(block_number).expect("Block is present");
|
let logs_bloom = bundle.block_logs_bloom(block_number).expect("Block is present");
|
||||||
|
|||||||
@ -5,8 +5,8 @@ use reth_db::{
|
|||||||
};
|
};
|
||||||
use reth_interfaces::db::DatabaseError;
|
use reth_interfaces::db::DatabaseError;
|
||||||
use reth_primitives::{
|
use reth_primitives::{
|
||||||
bloom::logs_bloom, keccak256, proofs::calculate_receipt_root_ref, Account, Address,
|
bloom::logs_bloom, keccak256, Account, Address, BlockNumber, Bloom, Bytecode, Log, Receipt,
|
||||||
BlockNumber, Bloom, Bytecode, Log, Receipt, StorageEntry, H256, U256,
|
Receipts, StorageEntry, H256, U256,
|
||||||
};
|
};
|
||||||
use reth_revm_primitives::{
|
use reth_revm_primitives::{
|
||||||
db::states::BundleState, into_reth_acc, into_revm_acc, primitives::AccountInfo,
|
db::states::BundleState, into_reth_acc, into_revm_acc, primitives::AccountInfo,
|
||||||
@ -30,8 +30,8 @@ pub struct BundleStateWithReceipts {
|
|||||||
/// Outer vector stores receipts for each block sequentially.
|
/// Outer vector stores receipts for each block sequentially.
|
||||||
/// The inner vector stores receipts ordered by transaction number.
|
/// The inner vector stores receipts ordered by transaction number.
|
||||||
///
|
///
|
||||||
/// If receipt is None it means it is pruned.
|
/// If receipt is None it means it is pruned.
|
||||||
receipts: Vec<Vec<Option<Receipt>>>,
|
receipts: Receipts,
|
||||||
/// First block of bundle state.
|
/// First block of bundle state.
|
||||||
first_block: BlockNumber,
|
first_block: BlockNumber,
|
||||||
}
|
}
|
||||||
@ -48,11 +48,7 @@ pub type RevertsInit = HashMap<BlockNumber, HashMap<Address, AccountRevertInit>>
|
|||||||
|
|
||||||
impl BundleStateWithReceipts {
|
impl BundleStateWithReceipts {
|
||||||
/// Create Bundle State.
|
/// Create Bundle State.
|
||||||
pub fn new(
|
pub fn new(bundle: BundleState, receipts: Receipts, first_block: BlockNumber) -> Self {
|
||||||
bundle: BundleState,
|
|
||||||
receipts: Vec<Vec<Option<Receipt>>>,
|
|
||||||
first_block: BlockNumber,
|
|
||||||
) -> Self {
|
|
||||||
Self { bundle, receipts, first_block }
|
Self { bundle, receipts, first_block }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,7 +57,7 @@ impl BundleStateWithReceipts {
|
|||||||
state_init: BundleStateInit,
|
state_init: BundleStateInit,
|
||||||
revert_init: RevertsInit,
|
revert_init: RevertsInit,
|
||||||
contracts_init: Vec<(H256, Bytecode)>,
|
contracts_init: Vec<(H256, Bytecode)>,
|
||||||
receipts: Vec<Vec<Option<Receipt>>>,
|
receipts: Receipts,
|
||||||
first_block: BlockNumber,
|
first_block: BlockNumber,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
// sort reverts by block number
|
// sort reverts by block number
|
||||||
@ -167,7 +163,7 @@ impl BundleStateWithReceipts {
|
|||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// use reth_primitives::{Account, U256};
|
/// use reth_primitives::{Account, U256, Receipts};
|
||||||
/// use reth_provider::BundleStateWithReceipts;
|
/// use reth_provider::BundleStateWithReceipts;
|
||||||
/// use reth_db::{test_utils::create_test_rw_db, database::Database};
|
/// use reth_db::{test_utils::create_test_rw_db, database::Database};
|
||||||
/// use std::collections::HashMap;
|
/// use std::collections::HashMap;
|
||||||
@ -187,7 +183,7 @@ impl BundleStateWithReceipts {
|
|||||||
/// )]),
|
/// )]),
|
||||||
/// HashMap::from([]),
|
/// HashMap::from([]),
|
||||||
/// vec![],
|
/// vec![],
|
||||||
/// vec![],
|
/// Receipts::new(),
|
||||||
/// 0,
|
/// 0,
|
||||||
/// );
|
/// );
|
||||||
///
|
///
|
||||||
@ -240,14 +236,11 @@ impl BundleStateWithReceipts {
|
|||||||
/// Note: this function calculated Bloom filters for every receipt and created merkle trees
|
/// Note: this function calculated Bloom filters for every receipt and created merkle trees
|
||||||
/// of receipt. This is a expensive operation.
|
/// of receipt. This is a expensive operation.
|
||||||
pub fn receipts_root_slow(&self, block_number: BlockNumber) -> Option<H256> {
|
pub fn receipts_root_slow(&self, block_number: BlockNumber) -> Option<H256> {
|
||||||
let index = self.block_number_to_index(block_number)?;
|
self.receipts.root_slow(self.block_number_to_index(block_number)?)
|
||||||
let block_receipts =
|
|
||||||
self.receipts[index].iter().map(Option::as_ref).collect::<Option<Vec<_>>>()?;
|
|
||||||
Some(calculate_receipt_root_ref(&block_receipts))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return reference to receipts.
|
/// Return reference to receipts.
|
||||||
pub fn receipts(&self) -> &Vec<Vec<Option<Receipt>>> {
|
pub fn receipts(&self) -> &Receipts {
|
||||||
&self.receipts
|
&self.receipts
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,7 +318,7 @@ impl BundleStateWithReceipts {
|
|||||||
// split is done as [0, num) and [num, len]
|
// split is done as [0, num) and [num, len]
|
||||||
let (_, this) = self.receipts.split_at(num_of_detached_block as usize);
|
let (_, this) = self.receipts.split_at(num_of_detached_block as usize);
|
||||||
|
|
||||||
self.receipts = this.to_vec().clone();
|
self.receipts = Receipts::from_vec(this.to_vec().clone());
|
||||||
self.bundle.take_n_reverts(num_of_detached_block as usize);
|
self.bundle.take_n_reverts(num_of_detached_block as usize);
|
||||||
|
|
||||||
self.first_block = block_number + 1;
|
self.first_block = block_number + 1;
|
||||||
@ -340,7 +333,7 @@ impl BundleStateWithReceipts {
|
|||||||
/// In most cases this would be true.
|
/// In most cases this would be true.
|
||||||
pub fn extend(&mut self, other: Self) {
|
pub fn extend(&mut self, other: Self) {
|
||||||
self.bundle.extend(other.bundle);
|
self.bundle.extend(other.bundle);
|
||||||
self.receipts.extend(other.receipts);
|
self.receipts.extend(other.receipts.receipt_vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Write bundle state to database.
|
/// Write bundle state to database.
|
||||||
@ -393,7 +386,7 @@ mod tests {
|
|||||||
transaction::DbTx,
|
transaction::DbTx,
|
||||||
DatabaseEnv,
|
DatabaseEnv,
|
||||||
};
|
};
|
||||||
use reth_primitives::{Address, Receipt, StorageEntry, H256, MAINNET, U256};
|
use reth_primitives::{Address, Receipt, Receipts, StorageEntry, H256, MAINNET, U256};
|
||||||
use reth_revm_primitives::{into_reth_acc, primitives::HashMap};
|
use reth_revm_primitives::{into_reth_acc, primitives::HashMap};
|
||||||
use revm::{
|
use revm::{
|
||||||
db::{
|
db::{
|
||||||
@ -612,7 +605,7 @@ mod tests {
|
|||||||
|
|
||||||
state.merge_transitions(BundleRetention::Reverts);
|
state.merge_transitions(BundleRetention::Reverts);
|
||||||
|
|
||||||
BundleStateWithReceipts::new(state.take_bundle(), Vec::new(), 1)
|
BundleStateWithReceipts::new(state.take_bundle(), Receipts::new(), 1)
|
||||||
.write_to_db(provider.tx_ref(), OriginalValuesKnown::Yes)
|
.write_to_db(provider.tx_ref(), OriginalValuesKnown::Yes)
|
||||||
.expect("Could not write bundle state to DB");
|
.expect("Could not write bundle state to DB");
|
||||||
|
|
||||||
@ -712,7 +705,7 @@ mod tests {
|
|||||||
)]));
|
)]));
|
||||||
|
|
||||||
state.merge_transitions(BundleRetention::Reverts);
|
state.merge_transitions(BundleRetention::Reverts);
|
||||||
BundleStateWithReceipts::new(state.take_bundle(), Vec::new(), 2)
|
BundleStateWithReceipts::new(state.take_bundle(), Receipts::new(), 2)
|
||||||
.write_to_db(provider.tx_ref(), OriginalValuesKnown::Yes)
|
.write_to_db(provider.tx_ref(), OriginalValuesKnown::Yes)
|
||||||
.expect("Could not write bundle state to DB");
|
.expect("Could not write bundle state to DB");
|
||||||
|
|
||||||
@ -779,7 +772,7 @@ mod tests {
|
|||||||
},
|
},
|
||||||
)]));
|
)]));
|
||||||
init_state.merge_transitions(BundleRetention::Reverts);
|
init_state.merge_transitions(BundleRetention::Reverts);
|
||||||
BundleStateWithReceipts::new(init_state.take_bundle(), Vec::new(), 0)
|
BundleStateWithReceipts::new(init_state.take_bundle(), Receipts::new(), 0)
|
||||||
.write_to_db(provider.tx_ref(), OriginalValuesKnown::Yes)
|
.write_to_db(provider.tx_ref(), OriginalValuesKnown::Yes)
|
||||||
.expect("Could not write init bundle state to DB");
|
.expect("Could not write init bundle state to DB");
|
||||||
|
|
||||||
@ -926,7 +919,7 @@ mod tests {
|
|||||||
|
|
||||||
let bundle = state.take_bundle();
|
let bundle = state.take_bundle();
|
||||||
|
|
||||||
BundleStateWithReceipts::new(bundle, Vec::new(), 1)
|
BundleStateWithReceipts::new(bundle, Receipts::new(), 1)
|
||||||
.write_to_db(provider.tx_ref(), OriginalValuesKnown::Yes)
|
.write_to_db(provider.tx_ref(), OriginalValuesKnown::Yes)
|
||||||
.expect("Could not write bundle state to DB");
|
.expect("Could not write bundle state to DB");
|
||||||
|
|
||||||
@ -1092,7 +1085,7 @@ mod tests {
|
|||||||
},
|
},
|
||||||
)]));
|
)]));
|
||||||
init_state.merge_transitions(BundleRetention::Reverts);
|
init_state.merge_transitions(BundleRetention::Reverts);
|
||||||
BundleStateWithReceipts::new(init_state.take_bundle(), Vec::new(), 0)
|
BundleStateWithReceipts::new(init_state.take_bundle(), Receipts::new(), 0)
|
||||||
.write_to_db(provider.tx_ref(), OriginalValuesKnown::Yes)
|
.write_to_db(provider.tx_ref(), OriginalValuesKnown::Yes)
|
||||||
.expect("Could not write init bundle state to DB");
|
.expect("Could not write init bundle state to DB");
|
||||||
|
|
||||||
@ -1139,7 +1132,7 @@ mod tests {
|
|||||||
|
|
||||||
// Commit block #1 changes to the database.
|
// Commit block #1 changes to the database.
|
||||||
state.merge_transitions(BundleRetention::Reverts);
|
state.merge_transitions(BundleRetention::Reverts);
|
||||||
BundleStateWithReceipts::new(state.take_bundle(), Vec::new(), 1)
|
BundleStateWithReceipts::new(state.take_bundle(), Receipts::new(), 1)
|
||||||
.write_to_db(provider.tx_ref(), OriginalValuesKnown::Yes)
|
.write_to_db(provider.tx_ref(), OriginalValuesKnown::Yes)
|
||||||
.expect("Could not write bundle state to DB");
|
.expect("Could not write bundle state to DB");
|
||||||
|
|
||||||
@ -1171,7 +1164,7 @@ mod tests {
|
|||||||
fn revert_to_indices() {
|
fn revert_to_indices() {
|
||||||
let base = BundleStateWithReceipts {
|
let base = BundleStateWithReceipts {
|
||||||
bundle: BundleState::default(),
|
bundle: BundleState::default(),
|
||||||
receipts: vec![vec![Some(Receipt::default()); 2]; 7],
|
receipts: Receipts::from_vec(vec![vec![Some(Receipt::default()); 2]; 7]),
|
||||||
first_block: 10,
|
first_block: 10,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -360,7 +360,7 @@ pub enum ChainSplit {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use reth_primitives::{H160, H256};
|
use reth_primitives::{Receipts, H160, H256};
|
||||||
use reth_revm_primitives::{
|
use reth_revm_primitives::{
|
||||||
db::BundleState,
|
db::BundleState,
|
||||||
primitives::{AccountInfo, HashMap},
|
primitives::{AccountInfo, HashMap},
|
||||||
@ -406,7 +406,7 @@ mod tests {
|
|||||||
vec![vec![(H160([2; 20]), None, vec![])]],
|
vec![vec![(H160([2; 20]), None, vec![])]],
|
||||||
vec![],
|
vec![],
|
||||||
),
|
),
|
||||||
vec![vec![]],
|
Receipts::from_vec(vec![vec![]]),
|
||||||
1,
|
1,
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -416,7 +416,7 @@ mod tests {
|
|||||||
vec![vec![(H160([3; 20]), None, vec![])]],
|
vec![vec![(H160([3; 20]), None, vec![])]],
|
||||||
vec![],
|
vec![],
|
||||||
),
|
),
|
||||||
vec![vec![]],
|
Receipts::from_vec(vec![vec![]]),
|
||||||
2,
|
2,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -368,7 +368,7 @@ impl<'this, TX: DbTxMut<'this> + DbTx<'this>> DatabaseProvider<'this, TX> {
|
|||||||
state,
|
state,
|
||||||
reverts,
|
reverts,
|
||||||
Vec::new(),
|
Vec::new(),
|
||||||
receipts,
|
reth_primitives::Receipts::from_vec(receipts),
|
||||||
start_block_number,
|
start_block_number,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
use crate::{BundleStateWithReceipts, DatabaseProviderRW};
|
use crate::{BundleStateWithReceipts, DatabaseProviderRW};
|
||||||
use reth_db::{database::Database, models::StoredBlockBodyIndices, tables};
|
use reth_db::{database::Database, models::StoredBlockBodyIndices, tables};
|
||||||
use reth_primitives::{
|
use reth_primitives::{
|
||||||
hex_literal::hex, Account, BlockNumber, Bytes, Header, Log, Receipt, SealedBlock,
|
hex_literal::hex, Account, BlockNumber, Bytes, Header, Log, Receipt, Receipts, SealedBlock,
|
||||||
SealedBlockWithSenders, StorageEntry, TxType, Withdrawal, H160, H256, U256,
|
SealedBlockWithSenders, StorageEntry, TxType, Withdrawal, H160, H256, U256,
|
||||||
};
|
};
|
||||||
use reth_rlp::Decodable;
|
use reth_rlp::Decodable;
|
||||||
@ -129,7 +129,7 @@ fn block1(number: BlockNumber) -> (SealedBlockWithSenders, BundleStateWithReceip
|
|||||||
]),
|
]),
|
||||||
)]),
|
)]),
|
||||||
vec![],
|
vec![],
|
||||||
vec![vec![Some(Receipt {
|
Receipts::from_vec(vec![vec![Some(Receipt {
|
||||||
tx_type: TxType::EIP2930,
|
tx_type: TxType::EIP2930,
|
||||||
success: true,
|
success: true,
|
||||||
cumulative_gas_used: 300,
|
cumulative_gas_used: 300,
|
||||||
@ -138,7 +138,7 @@ fn block1(number: BlockNumber) -> (SealedBlockWithSenders, BundleStateWithReceip
|
|||||||
topics: vec![H256::from_low_u64_be(1), H256::from_low_u64_be(2)],
|
topics: vec![H256::from_low_u64_be(1), H256::from_low_u64_be(2)],
|
||||||
data: Bytes::default(),
|
data: Bytes::default(),
|
||||||
}],
|
}],
|
||||||
})]],
|
})]]),
|
||||||
number,
|
number,
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -185,7 +185,7 @@ fn block2(
|
|||||||
)]),
|
)]),
|
||||||
)]),
|
)]),
|
||||||
vec![],
|
vec![],
|
||||||
vec![vec![Some(Receipt {
|
Receipts::from_vec(vec![vec![Some(Receipt {
|
||||||
tx_type: TxType::EIP1559,
|
tx_type: TxType::EIP1559,
|
||||||
success: false,
|
success: false,
|
||||||
cumulative_gas_used: 400,
|
cumulative_gas_used: 400,
|
||||||
@ -194,7 +194,7 @@ fn block2(
|
|||||||
topics: vec![H256::from_low_u64_be(3), H256::from_low_u64_be(4)],
|
topics: vec![H256::from_low_u64_be(3), H256::from_low_u64_be(4)],
|
||||||
data: Bytes::default(),
|
data: Bytes::default(),
|
||||||
}],
|
}],
|
||||||
})]],
|
})]]),
|
||||||
number,
|
number,
|
||||||
);
|
);
|
||||||
(SealedBlockWithSenders { block, senders: vec![H160([0x31; 20])] }, bundle)
|
(SealedBlockWithSenders { block, senders: vec![H160([0x31; 20])] }, bundle)
|
||||||
|
|||||||
Reference in New Issue
Block a user