Sitelet https://docs.rs/trevm/latest/trevm/db/sync/struct.ConcurrentState.html
Skip to main content

ConcurrentState

Struct ConcurrentState 

Source
pub struct ConcurrentState<Db> {
    pub info: ConcurrentStateInfo,
    /* private fields */
}
Available on crate feature concurrent-db only.
Expand description

State of the blockchain.

A version of revm::database::State that can be shared between threads.

Fields§

§info: ConcurrentStateInfo

Non-DB state cache and transition information.

Implementations§

Source§

impl<Db> ConcurrentState<Db>

Source

pub fn into_parts(self) -> (Db, ConcurrentStateInfo)

Deconstruct the ConcurrentState into its parts.

Source

pub fn bundle_size_hint(&self) -> usize

Returns the size hint for the inner bundle state. See BundleState::size_hint for more info.

Source

pub const fn set_state_clear_flag(&mut self, has_state_clear: bool)

State clear EIP-161 is enabled in Spurious Dragon hardfork.

Source

pub fn insert_not_existing(&mut self, address: Address)

Insert not existing account into cache state.

Source

pub fn insert_account(&mut self, address: Address, info: AccountInfo)

Insert account into cache state.

Source

pub fn insert_account_with_storage( &mut self, address: Address, info: AccountInfo, storage: PlainStorage, )

Insert account with storage into cache state.

Source

pub fn apply_transition( &mut self, transitions: Vec<(Address, TransitionAccount)>, )

Apply evm transitions to transition state.

Source

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.

Source

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>

Source

pub const fn new(database: Db, info: ConcurrentStateInfo) -> Self

Create a new ConcurrentState with the given database and cache state.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

pub fn is_parent(self: &Arc<Self>, child: &Child<Db>) -> bool

True if the child is a child of this state, false otherwise.

Trait Implementations§

Source§

impl<Db: DatabaseRef + Sync> Database for ConcurrentState<Db>

Source§

type Error = <ConcurrentState<Db> as DatabaseRef>::Error

The database error type.
Source§

fn basic( &mut self, address: Address, ) -> Result<Option<AccountInfo>, Self::Error>

Gets basic account information.
Source§

fn code_by_hash(&mut self, code_hash: B256) -> Result<Bytecode, Self::Error>

Gets account code by its hash.
Source§

fn storage( &mut self, address: Address, index: U256, ) -> Result<U256, Self::Error>

Gets storage value of address at index.
Source§

fn block_hash(&mut self, number: u64) -> Result<B256, Self::Error>

Gets block hash by block number.
Source§

fn storage_by_account_id( &mut self, address: Address, account_id: usize, storage_key: Uint<256, 4>, ) -> Result<Uint<256, 4>, Self::Error>

Gets storage value of account by its id. By default call Database::storage method. Read more
Source§

impl<Db: DatabaseRef + Sync> DatabaseCommit for ConcurrentState<Db>

Source§

fn commit(&mut self, evm_state: HashMap<Address, Account>)

Commit changes to the database.
Source§

fn commit_iter(&mut self, changes: &mut dyn Iterator<Item = (Address, Account)>)

Commit changes to the database with an iterator. Read more
Source§

impl<Db: DatabaseRef + Sync> DatabaseRef for ConcurrentState<Db>

Source§

type Error = <Db as DatabaseRef>::Error

The database error type.
Source§

fn basic_ref( &self, address: Address, ) -> Result<Option<AccountInfo>, Self::Error>

Gets basic account information.
Source§

fn code_by_hash_ref(&self, code_hash: B256) -> Result<Bytecode, Self::Error>

Gets account code by its hash.
Source§

fn storage_ref( &self, address: Address, index: U256, ) -> Result<U256, Self::Error>

Gets storage value of address at index.
Source§

fn block_hash_ref(&self, number: u64) -> Result<B256, Self::Error>

Gets block hash by block number.
Source§

fn storage_by_account_id_ref( &self, address: Address, account_id: usize, storage_key: Uint<256, 4>, ) -> Result<Uint<256, 4>, Self::Error>

Gets storage value of account by its id. Read more
Source§

impl<Db: Debug> Debug for ConcurrentState<Db>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<Db> From<State<Db>> for ConcurrentState<Db>
where Db: DatabaseRef,

Source§

fn from(value: State<Db>) -> Self

Converts to this type from the input type.
Source§

impl<Db: DatabaseRef + Sync> StateAcc for ConcurrentState<Db>

Source§

fn set_state_clear_flag(&mut self, flag: bool)

Set the state clear flag. See State::set_state_clear_flag.
Source§

fn merge_transitions(&mut self, retention: BundleRetention)

Merge transitions into the bundle. See State::merge_transitions.
Source§

fn take_bundle(&mut self) -> BundleState

Take the bundle. See State::take_bundle.
Source§

fn set_block_hashes(&mut self, block_hashes: &BTreeMap<u64, B256>)

Set the block hashes, overriding any existing values, and inserting any absent values.

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> DatabaseCommitExt for T

Source§

fn increment_balances( &mut self, balances: impl IntoIterator<Item = (Address, u128)>, ) -> Result<(), Self::Error>

Iterates over received balances and increment all account balances. Read more
Source§

fn drain_balances( &mut self, addresses: impl IntoIterator<Item = Address>, ) -> Result<Vec<u128>, Self::Error>

Drains balances from given account and return those values. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<Db> TryDatabaseCommit for Db
where Db: DatabaseCommit,

Source§

type Error = !

Error type for when TryDatabaseCommit::try_commit fails.
Source§

fn try_commit( &mut self, changes: HashMap<Address, Account, DefaultHashBuilder>, ) -> Result<(), <Db as TryDatabaseCommit>::Error>

Attempt to commit changes to the database.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<Db> TryStateAcc for Db
where Db: StateAcc + Sync,

Source§

type Error = !

Error type to be thrown when state accumulation fails.
Source§

fn try_set_state_clear_flag(&mut self, flag: bool) -> Result<(), !>

Attempt to set the state clear flag. See State::set_state_clear_flag.
Source§

fn try_merge_transitions(&mut self, retention: BundleRetention) -> Result<(), !>

Attempt to merge transitions into the bundle. See State::merge_transitions.
Source§

fn try_take_bundle(&mut self) -> Result<BundleState, !>

Attempt to take the bundle. See State::take_bundle.
Source§

fn try_set_block_hashes( &mut self, block_hashes: &BTreeMap<u64, FixedBytes<32>>, ) -> Result<(), !>

Attempt to set the block hashes, overriding any existing values, and inserting any absent values.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more