pub struct FastCacheDB<ExtDB> {
pub accounts: HashMap<Address, FastDbAccount>,
pub contracts: HashMap<B256, Bytecode, SimpleBuildHasher>,
pub logs: Vec<Log>,
pub block_hashes: HashMap<BlockNumber, B256>,
pub db: ExtDB,
}
Expand description
A [Database] implementation that stores all state changes in memory.
This implementation wraps a [DatabaseRef] that is used to load data ([AccountInfo]).
Accounts and code are stored in two separate maps, the accounts
map maps addresses to FastDbAccount,
whereas contracts are identified by their code hash, and are stored in the contracts
map.
The FastDbAccount holds the code hash of the contract, which is used to look up the contract in the contracts
map.
Fields§
§accounts: HashMap<Address, FastDbAccount>
Account info where None means it is not existing. Not existing state is needed for Pre TANGERINE forks.
code
is always None
, and bytecode can be found in contracts
.
contracts: HashMap<B256, Bytecode, SimpleBuildHasher>
Tracks all contracts by their code hash.
logs: Vec<Log>
All logs that were committed via [DatabaseCommit::commit].
block_hashes: HashMap<BlockNumber, B256>
All cached block hashes from the [DatabaseRef].
db: ExtDB
The underlying database ([DatabaseRef]) that is used to load data.
Note: this is read-only, data is never written to this database.
Implementations§
Source§impl<ExtDB> FastCacheDB<ExtDB>
impl<ExtDB> FastCacheDB<ExtDB>
pub fn new(db: ExtDB) -> Selfwhere
ExtDB: DatabaseRef<Error = Infallible>,
Sourcepub fn insert_contract(&mut self, account: &mut AccountInfo)
pub fn insert_contract(&mut self, account: &mut AccountInfo)
Inserts the account’s code into the cache.
Accounts objects and code are stored separately in the cache, this will take the code from the account and instead map it to the code hash.
Note: This will not insert into the underlying external database.
Sourcepub fn insert_account_info(&mut self, address: Address, info: AccountInfo)
pub fn insert_account_info(&mut self, address: Address, info: AccountInfo)
Insert account info but not override storage
Source§impl<ExtDB: DatabaseRef> FastCacheDB<ExtDB>
impl<ExtDB: DatabaseRef> FastCacheDB<ExtDB>
Sourcepub fn load_account(
&mut self,
address: Address,
) -> Result<&mut FastDbAccount, ExtDB::Error>
pub fn load_account( &mut self, address: Address, ) -> Result<&mut FastDbAccount, ExtDB::Error>
Returns the account for the given address.
If the account was not found in the cache, it will be loaded from the underlying database.
Sourcepub fn insert_account_storage(
&mut self,
address: Address,
slot: U256,
value: U256,
) -> Result<(), ExtDB::Error>
pub fn insert_account_storage( &mut self, address: Address, slot: U256, value: U256, ) -> Result<(), ExtDB::Error>
insert account storage without overriding account info
Sourcepub fn replace_account_storage(
&mut self,
address: Address,
storage: HashMap<U256, U256>,
) -> Result<(), ExtDB::Error>
pub fn replace_account_storage( &mut self, address: Address, storage: HashMap<U256, U256>, ) -> Result<(), ExtDB::Error>
replace account storage without overriding account info
Source§impl FastCacheDB<Arc<FastCacheDB<EmptyDB>>>
impl FastCacheDB<Arc<FastCacheDB<EmptyDB>>>
pub fn with_db(self, db: Arc<FastCacheDB<EmptyDB>>) -> Self
pub fn merge(&self) -> FastCacheDB<EmptyDB>
pub fn update_accounts(&self) -> FastCacheDB<EmptyDB>
pub fn update_cells(&self) -> FastCacheDB<EmptyDB>
pub fn apply_geth_update(&mut self, update: BTreeMap<Address, GethAccountState>)
pub fn apply_geth_update_vec( &mut self, update: Vec<BTreeMap<Address, GethAccountState>>, )
Trait Implementations§
Source§impl<ExtDB: Clone> Clone for FastCacheDB<ExtDB>
impl<ExtDB: Clone> Clone for FastCacheDB<ExtDB>
Source§fn clone(&self) -> FastCacheDB<ExtDB>
fn clone(&self) -> FastCacheDB<ExtDB>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<ExtDB: DatabaseRef> Database for FastCacheDB<ExtDB>
impl<ExtDB: DatabaseRef> Database for FastCacheDB<ExtDB>
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>
Get the value in an account’s storage slot.
It is assumed that account is already loaded.
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 block_hash(&mut self, number: BlockNumber) -> Result<B256, Self::Error>
fn block_hash(&mut self, number: BlockNumber) -> Result<B256, Self::Error>
Source§impl<ExtDB> DatabaseCommit for FastCacheDB<ExtDB>
impl<ExtDB> DatabaseCommit for FastCacheDB<ExtDB>
Source§impl<ExtDB: DatabaseRef> DatabaseRef for FastCacheDB<ExtDB>
impl<ExtDB: DatabaseRef> DatabaseRef for FastCacheDB<ExtDB>
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§fn block_hash_ref(&self, number: BlockNumber) -> Result<B256, Self::Error>
fn block_hash_ref(&self, number: BlockNumber) -> Result<B256, Self::Error>
Source§impl<ExtDB: Debug> Debug for FastCacheDB<ExtDB>
impl<ExtDB: Debug> Debug for FastCacheDB<ExtDB>
Source§impl<ExtDB: Default + DatabaseRef<Error = Infallible>> Default for FastCacheDB<ExtDB>
impl<ExtDB: Default + DatabaseRef<Error = Infallible>> Default for FastCacheDB<ExtDB>
Source§impl<'de, ExtDB> Deserialize<'de> for FastCacheDB<ExtDB>where
ExtDB: Deserialize<'de>,
impl<'de, ExtDB> Deserialize<'de> for FastCacheDB<ExtDB>where
ExtDB: Deserialize<'de>,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl<ExtDB> Freeze for FastCacheDB<ExtDB>where
ExtDB: Freeze,
impl<ExtDB> RefUnwindSafe for FastCacheDB<ExtDB>where
ExtDB: RefUnwindSafe,
impl<ExtDB> Send for FastCacheDB<ExtDB>where
ExtDB: Send,
impl<ExtDB> Sync for FastCacheDB<ExtDB>where
ExtDB: Sync,
impl<ExtDB> Unpin for FastCacheDB<ExtDB>where
ExtDB: Unpin,
impl<ExtDB> UnwindSafe for FastCacheDB<ExtDB>where
ExtDB: 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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§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.§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.§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.§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.§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.§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.§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.§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.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§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 more§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 more§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
§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
§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.§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.§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> Tap for T
impl<T> Tap for T
§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 more§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 more§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 more§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 more§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 more§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 more§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.§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.§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.§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.§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.§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.§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.§impl<T> TryConv for T
impl<T> TryConv for T
§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
impl<T> RpcObject for Twhere
T: RpcParam + RpcReturn,
impl<T> RpcParam for T
impl<T> RpcReturn for T
Layout§
Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.