pub struct PrecompileCache { /* private fields */ }Expand description
Per-block cache for precompile results shared between warmer and executor.
Holds at most its budget, PRECOMPILE_CACHE_MAX_BYTES unless built with
PrecompileCache::with_max_bytes, as counted by PrecompileCache::entry_size;
once full, further results are simply not cached.
Nothing is evicted: the cache is dropped with its block, so there is no recency worth
tracking, and lookups stay on the shared read lock.
Implementations§
Source§impl PrecompileCache
impl PrecompileCache
pub fn new() -> Self
Sourcepub fn with_max_bytes(max_bytes: usize) -> Self
pub fn with_max_bytes(max_bytes: usize) -> Self
A cache that holds at most max_bytes, as counted by PrecompileCache::entry_size.
Sourcepub fn entry_size(calldata_len: usize, output_len: usize) -> usize
pub fn entry_size(calldata_len: usize, output_len: usize) -> usize
Bytes one entry is charged against the budget: its calldata and output, plus the fixed size of the key and value it is stored as. Hash-table slack and the per-precompile tables are not counted, so the budget is approximate, not an exact resident size.
pub fn get(&self, address: &Address, calldata: &[u8]) -> Option<(Bytes, u64)>
Sourcepub fn insert(
&self,
address: Address,
calldata: &[u8],
output: &[u8],
gas_cost: u64,
)
pub fn insert( &self, address: Address, calldata: &[u8], output: &[u8], gas_cost: u64, )
Stores copies of calldata and output, never the caller’s buffers: calldata can be
a view of a larger allocation (the calling frame’s memory, or a slice of a
transaction’s data), and keeping a reference would hold that whole allocation while
the budget counts only the length.
The copies are made only for a call that is not cached yet and fits the budget, and outside the write lock. The warmer and the executor often compute the same call, and the second insert then costs a lookup under the shared read lock and nothing more.
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for PrecompileCache
impl RefUnwindSafe for PrecompileCache
impl Send for PrecompileCache
impl Sync for PrecompileCache
impl Unpin for PrecompileCache
impl UnsafeUnpin for PrecompileCache
impl UnwindSafe for PrecompileCache
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
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> 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> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.