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 check_supported_ledger_entry_type(
le: &LedgerEntry,
) -> Result<(), HostError>
pub fn check_supported_ledger_entry_type( le: &LedgerEntry, ) -> Result<(), HostError>
Only a subset of Stellar’s XDR ledger key or entry types are supported by Soroban: accounts, trustlines, contract code and data. The rest are never used by stellar-core when interacting with the Soroban host, nor does the Soroban host ever generate any. Therefore the storage system will reject them with ScErrorCode::InternalError if they ever occur.
Sourcepub fn check_supported_ledger_key_type(lk: &LedgerKey) -> Result<(), HostError>
pub fn check_supported_ledger_key_type(lk: &LedgerKey) -> Result<(), HostError>
Only a subset of Stellar’s XDR ledger key or entry types are supported by Soroban: accounts, trustlines, contract code and data. The rest are never used by stellar-core when interacting with the Soroban host, nor does the Soroban host ever generate any. Therefore the storage system will reject them with ScErrorCode::InternalError if they ever occur.
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>,
live_until_ledger: Option<u32>,
budget: &Budget,
) -> Result<(), HostError>
pub fn put( &mut self, key: &Rc<LedgerKey>, val: &Rc<LedgerEntry>, live_until_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.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Storage
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, U, V, W, E, C> Compare<(T, U, V, W)> for C
impl<T, U, V, W, E, C> Compare<(T, U, V, W)> for C
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 C
impl<T, U, V, W, X, E, C> Compare<(T, U, V, W, X)> for C
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>
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§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.Source§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.