Struct soroban_env_host::storage::Storage
source · pub struct Storage {
pub footprint: Footprint,
pub mode: FootprintMode,
pub map: StorageMap,
}
Expand description
A special-purpose map from LedgerKeys to LedgerEntrys. Represents a transactional batch of contract IO from and to durable storage, while partitioning that IO between concurrently executing groups of contracts through the use of IO Footprints.
Specifically: access to each LedgerKey is mediated by the Footprint, which may be in either FootprintMode::Recording or FootprintMode::Enforcing mode.
FootprintMode::Recording mode is used to calculate Footprints during “preflight” execution of a contract. Once calculated, a recorded Footprint can be provided to “real” execution, which always runs in FootprintMode::Enforcing mode and enforces partitioned access.
Fields§
§footprint: Footprint
§mode: FootprintMode
§map: StorageMap
Implementations§
source§impl Storage
impl Storage
sourcepub fn with_enforcing_footprint_and_map(
footprint: Footprint,
map: StorageMap
) -> Self
pub fn with_enforcing_footprint_and_map( footprint: Footprint, map: StorageMap ) -> Self
Constructs a new Storage in FootprintMode::Enforcing using a given Footprint and a storage map populated with all the keys listed in the Footprint.
sourcepub fn with_recording_footprint(src: Rc<dyn SnapshotSource>) -> Self
pub fn with_recording_footprint(src: Rc<dyn SnapshotSource>) -> Self
Constructs a new Storage in FootprintMode::Recording using a given SnapshotSource.
sourcepub fn get(
&mut self,
key: &Rc<LedgerKey>,
budget: &Budget
) -> Result<Rc<LedgerEntry>, HostError>
pub fn get( &mut self, key: &Rc<LedgerKey>, budget: &Budget ) -> Result<Rc<LedgerEntry>, HostError>
Attempts to retrieve the LedgerEntry associated with a given LedgerKey in the Storage, returning an error if the key is not found.
In FootprintMode::Recording mode, records the read LedgerKey in the Footprint as AccessType::ReadOnly (unless already recorded as AccessType::ReadWrite) and reads through to the underlying SnapshotSource, if the LedgerKey has not yet been loaded.
In FootprintMode::Enforcing mode, succeeds only if the read LedgerKey has been declared in the Footprint.
sourcepub fn put(
&mut self,
key: &Rc<LedgerKey>,
val: &Rc<LedgerEntry>,
expiration_ledger: Option<u32>,
budget: &Budget
) -> Result<(), HostError>
pub fn put( &mut self, key: &Rc<LedgerKey>, val: &Rc<LedgerEntry>, expiration_ledger: Option<u32>, budget: &Budget ) -> Result<(), HostError>
Attempts to write to the LedgerEntry associated with a given LedgerKey in the Storage.
In FootprintMode::Recording mode, records the written LedgerKey in the Footprint as AccessType::ReadWrite.
In FootprintMode::Enforcing mode, succeeds only if the written LedgerKey has been declared in the Footprint as AccessType::ReadWrite.
sourcepub fn del(
&mut self,
key: &Rc<LedgerKey>,
budget: &Budget
) -> Result<(), HostError>
pub fn del( &mut self, key: &Rc<LedgerKey>, budget: &Budget ) -> Result<(), HostError>
Attempts to delete the LedgerEntry associated with a given LedgerKey in the Storage.
In FootprintMode::Recording mode, records the deleted LedgerKey in the Footprint as AccessType::ReadWrite.
In FootprintMode::Enforcing mode, succeeds only if the deleted LedgerKey has been declared in the Footprint as AccessType::ReadWrite.
sourcepub fn has(
&mut self,
key: &Rc<LedgerKey>,
budget: &Budget
) -> Result<bool, HostError>
pub fn has( &mut self, key: &Rc<LedgerKey>, budget: &Budget ) -> Result<bool, HostError>
Attempts to determine the presence of a LedgerEntry associated with a
given LedgerKey in the Storage, returning Ok(true)
if an entry
with the key exists and Ok(false)
if it does not.
In FootprintMode::Recording mode, records the access and reads-through to the underlying SnapshotSource.
In FootprintMode::Enforcing mode, succeeds only if the access has been declared in the Footprint.
sourcepub fn bump(
&mut self,
host: &Host,
key: Rc<LedgerKey>,
low_expiration_watermark: u32,
high_expiration_watermark: u32
) -> Result<(), HostError>
pub fn bump( &mut self, host: &Host, key: Rc<LedgerKey>, low_expiration_watermark: u32, high_expiration_watermark: u32 ) -> Result<(), HostError>
Bumps key
to live for at least bump_by_ledgers
from now (not
counting the current ledger).
This operation is only defined within a host as it relies on ledger state.
This operation does not modify any ledger entries, but does change the internal storage
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for Storage
impl !Send for Storage
impl !Sync for Storage
impl Unpin for Storage
impl !UnwindSafe for Storage
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, U, E, C> Compare<(T, U)> for Cwhere
C: Compare<T, Error = E, Error = E> + Compare<U>,
impl<T, U, E, C> Compare<(T, U)> for Cwhere C: Compare<T, Error = E, Error = E> + Compare<U>,
source§impl<T, U, V, E, C> Compare<(T, U, V)> for Cwhere
C: Compare<T, Error = E, Error = E, Error = E> + Compare<U> + Compare<V>,
impl<T, U, V, E, C> Compare<(T, U, V)> for Cwhere C: Compare<T, Error = E, Error = E, Error = E> + Compare<U> + Compare<V>,
source§impl<T, U, V, W, E, C> Compare<(T, U, V, W)> for Cwhere
C: Compare<T, Error = E, Error = E, Error = E, Error = E> + Compare<U> + Compare<V> + Compare<W>,
impl<T, U, V, W, E, C> Compare<(T, U, V, W)> for Cwhere C: Compare<T, Error = E, Error = E, Error = E, Error = E> + Compare<U> + Compare<V> + Compare<W>,
type Error = E
fn compare( &self, a: &(T, U, V, W), b: &(T, U, V, W) ) -> Result<Ordering, <C as Compare<(T, U, V, W)>>::Error>
source§impl<T, U, V, W, X, E, C> Compare<(T, U, V, W, X)> for Cwhere
C: Compare<T, Error = E, Error = E, Error = E, Error = E, Error = E> + Compare<U> + Compare<V> + Compare<W> + Compare<X>,
impl<T, U, V, W, X, E, C> Compare<(T, U, V, W, X)> for Cwhere C: Compare<T, Error = E, Error = E, Error = E, Error = E, Error = E> + Compare<U> + Compare<V> + Compare<W> + Compare<X>,
type Error = E
fn compare( &self, a: &(T, U, V, W, X), b: &(T, U, V, W, X) ) -> Result<Ordering, <C as Compare<(T, U, V, W, X)>>::Error>
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere T: Any,
§fn into_any(self: Box<T, Global>) -> Box<dyn Any, Global>
fn into_any(self: Box<T, Global>) -> Box<dyn Any, Global>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T, Global>) -> Rc<dyn Any, Global>
fn into_any_rc(self: Rc<T, Global>) -> Rc<dyn Any, Global>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.