pub struct ConcurrentState<Db> {
pub info: ConcurrentStateInfo,
/* private fields */
}concurrent-db only.Expand description
State of the blockchain.
A version of revm::database::State that can be shared between threads.
Fields§
§info: ConcurrentStateInfoNon-DB state cache and transition information.
Implementations§
Source§impl<Db> ConcurrentState<Db>
impl<Db> ConcurrentState<Db>
Sourcepub fn into_parts(self) -> (Db, ConcurrentStateInfo)
pub fn into_parts(self) -> (Db, ConcurrentStateInfo)
Deconstruct the ConcurrentState into its parts.
Sourcepub fn bundle_size_hint(&self) -> usize
pub fn bundle_size_hint(&self) -> usize
Returns the size hint for the inner bundle state. See BundleState::size_hint for more info.
Sourcepub const fn set_state_clear_flag(&mut self, has_state_clear: bool)
pub const fn set_state_clear_flag(&mut self, has_state_clear: bool)
State clear EIP-161 is enabled in Spurious Dragon hardfork.
Sourcepub fn insert_not_existing(&mut self, address: Address)
pub fn insert_not_existing(&mut self, address: Address)
Insert not existing account into cache state.
Sourcepub fn insert_account(&mut self, address: Address, info: AccountInfo)
pub fn insert_account(&mut self, address: Address, info: AccountInfo)
Insert account into cache state.
Sourcepub fn insert_account_with_storage(
&mut self,
address: Address,
info: AccountInfo,
storage: PlainStorage,
)
pub fn insert_account_with_storage( &mut self, address: Address, info: AccountInfo, storage: PlainStorage, )
Insert account with storage into cache state.
Sourcepub fn apply_transition(
&mut self,
transitions: Vec<(Address, TransitionAccount)>,
)
pub fn apply_transition( &mut self, transitions: Vec<(Address, TransitionAccount)>, )
Apply evm transitions to transition state.
Sourcepub fn merge_transitions(&mut self, retention: BundleRetention)
pub fn merge_transitions(&mut self, retention: BundleRetention)
Take all transitions and merge them inside bundle state. This action will create final post state and all reverts so that we at any time revert state of bundle to the state before transition is applied.
Sourcepub fn take_bundle(&mut self) -> BundleState
pub fn take_bundle(&mut self) -> BundleState
Takes the BundleState changeset from the ConcurrentState,
replacing it
with an empty one.
This will not apply any pending TransitionState. It is recommended
to call ConcurrentState::merge_transitions before taking the bundle.
If the State has been built with the
revm::database::StateBuilder::with_bundle_prestate option, the
pre-state will be taken along with any changes made by
ConcurrentState::merge_transitions.
Source§impl<Db: DatabaseRef + Sync> ConcurrentState<Db>
impl<Db: DatabaseRef + Sync> ConcurrentState<Db>
Sourcepub const fn new(database: Db, info: ConcurrentStateInfo) -> Self
pub const fn new(database: Db, info: ConcurrentStateInfo) -> Self
Create a new ConcurrentState with the given database and cache
state.
Sourcepub fn increment_balances(
&mut self,
balances: impl IntoIterator<Item = (Address, u128)>,
) -> Result<(), Db::Error>
pub fn increment_balances( &mut self, balances: impl IntoIterator<Item = (Address, u128)>, ) -> Result<(), Db::Error>
Iterate over received balances and increment all account balances. If account is not found inside cache state it will be loaded from database.
Update will create transitions for all accounts that are updated.
Like CacheAccount::increment_balance, this assumes that incremented balances are not
zero, and will not overflow once incremented. If using this to implement withdrawals, zero
balances must be filtered out before calling this function.
Sourcepub fn drain_balances(
&mut self,
addresses: impl IntoIterator<Item = Address>,
) -> Result<Vec<u128>, Db::Error>
pub fn drain_balances( &mut self, addresses: impl IntoIterator<Item = Address>, ) -> Result<Vec<u128>, Db::Error>
Drain balances from given account and return those values.
It is used for DAO hardfork state change to move values from given accounts.
Sourcepub fn load_cache_account_mut(
&self,
address: Address,
) -> Result<RefMut<'_, Address, CacheAccount>, Db::Error>
pub fn load_cache_account_mut( &self, address: Address, ) -> Result<RefMut<'_, Address, CacheAccount>, Db::Error>
Get a mutable reference to the CacheAccount for the given address.
If the account is not found in the cache, it will be loaded from the
database and inserted into the cache.
This function locks that account in the cache while the reference is held. For that timeframe, it will block other tasks attempting to access that account. As a result, this function should be used sparingly.
Sourcepub fn child(self: &Arc<Self>) -> Child<Db>where
Db: Send,
pub fn child(self: &Arc<Self>) -> Child<Db>where
Db: Send,
Create a Child DB that wraps this state in another cache layer.
This allows the ConcurrentState to be shared between threads, with
each thread having a separate cache for its local changes. The child
can later be merged back into the parent with Self::merge_child IF
no other children or copies of the Arc<Self> exist.
Sourcepub fn merge_child(
self: &mut Arc<Self>,
child: Child<Db>,
) -> Result<(), ConcurrentStateError>
pub fn merge_child( self: &mut Arc<Self>, child: Child<Db>, ) -> Result<(), ConcurrentStateError>
Merge a child DB into this DB, incorporating its changes and overwriting any present values.
This function needs to take ownership of the Child, as the child
copntains an Arc of the parent. This Arc must be dropped to ensure
that the parent’s pointer is unique, allowing the parent to be modified
via Arc::get_mut.
If other children or other copies of the Arc<Self> exist, this will
fail with a ConcurrentStateError. error. If the child belongs to
another parent, this will also fail.
These conditions can be checked via Self::can_merge, please see
that function’s documentation for a possible race condition.
Sourcepub fn can_merge(
self: &Arc<Self>,
child: &Child<Db>,
) -> Result<(), ConcurrentStateError>
pub fn can_merge( self: &Arc<Self>, child: &Child<Db>, ) -> Result<(), ConcurrentStateError>
True if the child can be merged into this state, false otherwise.
§Note
Race conditions can occur if the child is shared between threads, as
the child may be cloned AFTER this check is made, but BEFORE the child
is merged. In this case the function will spuriously return Ok(())
even though the merge will fail. To avoid this, ensure that the child
is not shared between threads when Self::can_merge is called.
Trait Implementations§
Source§impl<Db: DatabaseRef + Sync> Database for ConcurrentState<Db>
impl<Db: DatabaseRef + Sync> Database for ConcurrentState<Db>
Source§type Error = <ConcurrentState<Db> as DatabaseRef>::Error
type Error = <ConcurrentState<Db> as DatabaseRef>::Error
Source§fn basic(
&mut self,
address: Address,
) -> Result<Option<AccountInfo>, Self::Error>
fn basic( &mut self, address: Address, ) -> Result<Option<AccountInfo>, Self::Error>
Source§fn code_by_hash(&mut self, code_hash: B256) -> Result<Bytecode, Self::Error>
fn code_by_hash(&mut self, code_hash: B256) -> Result<Bytecode, Self::Error>
Source§fn storage(
&mut self,
address: Address,
index: U256,
) -> Result<U256, Self::Error>
fn storage( &mut self, address: Address, index: U256, ) -> Result<U256, Self::Error>
Source§impl<Db: DatabaseRef + Sync> DatabaseCommit for ConcurrentState<Db>
impl<Db: DatabaseRef + Sync> DatabaseCommit for ConcurrentState<Db>
Source§impl<Db: DatabaseRef + Sync> DatabaseRef for ConcurrentState<Db>
impl<Db: DatabaseRef + Sync> DatabaseRef for ConcurrentState<Db>
Source§type Error = <Db as DatabaseRef>::Error
type Error = <Db as DatabaseRef>::Error
Source§fn basic_ref(
&self,
address: Address,
) -> Result<Option<AccountInfo>, Self::Error>
fn basic_ref( &self, address: Address, ) -> Result<Option<AccountInfo>, Self::Error>
Source§fn code_by_hash_ref(&self, code_hash: B256) -> Result<Bytecode, Self::Error>
fn code_by_hash_ref(&self, code_hash: B256) -> Result<Bytecode, Self::Error>
Source§fn storage_ref(
&self,
address: Address,
index: U256,
) -> Result<U256, Self::Error>
fn storage_ref( &self, address: Address, index: U256, ) -> Result<U256, Self::Error>
Source§impl<Db: Debug> Debug for ConcurrentState<Db>
impl<Db: Debug> Debug for ConcurrentState<Db>
Source§impl<Db> From<State<Db>> for ConcurrentState<Db>where
Db: DatabaseRef,
impl<Db> From<State<Db>> for ConcurrentState<Db>where
Db: DatabaseRef,
Source§impl<Db: DatabaseRef + Sync> StateAcc for ConcurrentState<Db>
impl<Db: DatabaseRef + Sync> StateAcc for ConcurrentState<Db>
Source§fn set_state_clear_flag(&mut self, flag: bool)
fn set_state_clear_flag(&mut self, flag: bool)
State::set_state_clear_flag.Source§fn merge_transitions(&mut self, retention: BundleRetention)
fn merge_transitions(&mut self, retention: BundleRetention)
State::merge_transitions.Source§fn take_bundle(&mut self) -> BundleState
fn take_bundle(&mut self) -> BundleState
State::take_bundle.Auto Trait Implementations§
impl<Db> !Freeze for ConcurrentState<Db>
impl<Db> !RefUnwindSafe for ConcurrentState<Db>
impl<Db> Send for ConcurrentState<Db>where
Db: Send,
impl<Db> Sync for ConcurrentState<Db>where
Db: Sync,
impl<Db> Unpin for ConcurrentState<Db>where
Db: Unpin,
impl<Db> UnsafeUnpin for ConcurrentState<Db>where
Db: UnsafeUnpin,
impl<Db> UnwindSafe for ConcurrentState<Db>where
Db: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> DatabaseCommitExt for Twhere
T: Database + DatabaseCommit,
impl<T> DatabaseCommitExt for Twhere
T: Database + DatabaseCommit,
Source§fn increment_balances(
&mut self,
balances: impl IntoIterator<Item = (Address, u128)>,
) -> Result<(), Self::Error>
fn increment_balances( &mut self, balances: impl IntoIterator<Item = (Address, u128)>, ) -> Result<(), Self::Error>
Source§fn drain_balances(
&mut self,
addresses: impl IntoIterator<Item = Address>,
) -> Result<Vec<u128>, Self::Error>
fn drain_balances( &mut self, addresses: impl IntoIterator<Item = Address>, ) -> Result<Vec<u128>, Self::Error>
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.Source§impl<Db> TryDatabaseCommit for Dbwhere
Db: DatabaseCommit,
impl<Db> TryDatabaseCommit for Dbwhere
Db: DatabaseCommit,
Source§type Error = !
type Error = !
TryDatabaseCommit::try_commit fails.Source§fn try_commit(
&mut self,
changes: HashMap<Address, Account, DefaultHashBuilder>,
) -> Result<(), <Db as TryDatabaseCommit>::Error>
fn try_commit( &mut self, changes: HashMap<Address, Account, DefaultHashBuilder>, ) -> Result<(), <Db as TryDatabaseCommit>::Error>
Source§impl<Db> TryStateAcc for Db
impl<Db> TryStateAcc for Db
Source§fn try_set_state_clear_flag(&mut self, flag: bool) -> Result<(), !>
fn try_set_state_clear_flag(&mut self, flag: bool) -> Result<(), !>
State::set_state_clear_flag.Source§fn try_merge_transitions(&mut self, retention: BundleRetention) -> Result<(), !>
fn try_merge_transitions(&mut self, retention: BundleRetention) -> Result<(), !>
State::merge_transitions.Source§fn try_take_bundle(&mut self) -> Result<BundleState, !>
fn try_take_bundle(&mut self) -> Result<BundleState, !>
State::take_bundle.