Skip to main content

DbStorage

Struct DbStorage 

Source
pub struct DbStorage<Database, Clock = WallClock> { /* private fields */ }
Expand description

Main implementation of the Storage trait.

Implementations§

Source§

impl<Database, C> DbStorage<Database, C>
where Database: KeyValueDatabase + Clone + 'static, Database::Error: Send + Sync, Database::Store: KeyValueStore + Clone + 'static, C: Clock + Clone + Send + Sync + 'static,

Source

pub fn with_allow_application_logs(self, allow: bool) -> Self

Sets whether contract log messages should be output.

Source§

impl<Database> DbStorage<Database, WallClock>
where Database: KeyValueDatabase + Clone + 'static, Database::Error: Send + Sync, Database::Store: KeyValueStore + Clone + 'static,

Source

pub async fn maybe_create_and_connect( config: &Database::Config, namespace: &str, wasm_runtime: Option<WasmRuntime>, ) -> Result<Self, ViewError>

Source

pub async fn connect( config: &Database::Config, namespace: &str, wasm_runtime: Option<WasmRuntime>, ) -> Result<Self, ViewError>

Source

pub async fn list_blob_ids( config: &Database::Config, namespace: &str, ) -> Result<Vec<BlobId>, ViewError>

Lists the blob IDs of the storage.

Source§

impl<Database> DbStorage<Database, WallClock>
where Database: KeyValueDatabase + Clone + Send + Sync + 'static, Database::Error: Send + Sync,

Source

pub async fn list_chain_ids( config: &Database::Config, namespace: &str, ) -> Result<Vec<ChainId>, ViewError>

Lists the chain IDs of the storage.

Source§

impl<Database, C> DbStorage<Database, C>
where Database: KeyValueDatabase + Clone + Send + Sync + 'static, Database::Store: KeyValueStore + Clone + Send + Sync + 'static, C: Clock + Clone + Send + Sync + 'static, Database::Error: From<Error> + Send + Sync,

Source

pub async fn migrate_if_needed(&self) -> Result<(), ViewError>

Source

pub async fn assert_is_migrated_storage(&self) -> Result<(), ViewError>

Assert that the storage is at the last version (or not yet initialized).

Trait Implementations§

Source§

impl<Database: Clone, Clock: Clone> Clone for DbStorage<Database, Clock>

Source§

fn clone(&self) -> DbStorage<Database, Clock>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<Database, C> Storage for DbStorage<Database, C>
where Database: KeyValueDatabase<Store: KeyValueStore + Clone + AutoTraits + 'static, Error: Send + Sync> + Clone + AutoTraits + 'static, C: Clock + Clone + Send + Sync + 'static,

Source§

type Context = ViewContext<ChainRuntimeContext<DbStorage<Database, C>>, <Database as KeyValueDatabase>::Store>

The low-level storage implementation in use by the core protocol (chain workers etc).
Source§

type Clock = C

The clock type being used.
Source§

type BlockExporterContext = ViewContext<u32, <Database as KeyValueDatabase>::Store>

The low-level storage implementation in use by the block exporter.
Source§

fn clock(&self) -> &C

Returns the current wall clock time.
Source§

fn thread_pool(&self) -> &Arc<ThreadPool>

Source§

fn load_chain<'life0, 'async_trait>( &'life0 self, chain_id: ChainId, ) -> Pin<Box<dyn Future<Output = Result<ChainStateView<Self::Context>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Loads the view of a chain state. Read more
Source§

fn contains_blob<'life0, 'async_trait>( &'life0 self, blob_id: BlobId, ) -> Pin<Box<dyn Future<Output = Result<bool, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Tests the existence of a blob with the given blob ID.
Source§

fn missing_blobs<'life0, 'life1, 'async_trait>( &'life0 self, blob_ids: &'life1 [BlobId], ) -> Pin<Box<dyn Future<Output = Result<Vec<BlobId>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Returns what blobs from the input are missing from storage.
Source§

fn contains_blob_state<'life0, 'async_trait>( &'life0 self, blob_id: BlobId, ) -> Pin<Box<dyn Future<Output = Result<bool, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Tests existence of a blob state with the given blob ID.
Source§

fn read_confirmed_block<'life0, 'async_trait>( &'life0 self, hash: CryptoHash, ) -> Pin<Box<dyn Future<Output = Result<Option<ConfirmedBlock>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Reads the hashed certificate value with the given hash.
Source§

fn read_confirmed_blocks<'life0, 'async_trait, I>( &'life0 self, hashes: I, ) -> Pin<Box<dyn Future<Output = Result<Vec<Option<ConfirmedBlock>>, ViewError>> + Send + 'async_trait>>
where I: 'async_trait + IntoIterator<Item = CryptoHash> + Send, Self: 'async_trait, 'life0: 'async_trait,

Reads a number of confirmed blocks by their hashes.
Source§

fn read_blob<'life0, 'async_trait>( &'life0 self, blob_id: BlobId, ) -> Pin<Box<dyn Future<Output = Result<Option<Blob>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Reads the blob with the given blob ID.
Source§

fn read_blobs<'life0, 'life1, 'async_trait>( &'life0 self, blob_ids: &'life1 [BlobId], ) -> Pin<Box<dyn Future<Output = Result<Vec<Option<Blob>>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Reads the blobs with the given blob IDs.
Source§

fn read_blob_state<'life0, 'async_trait>( &'life0 self, blob_id: BlobId, ) -> Pin<Box<dyn Future<Output = Result<Option<BlobState>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Reads the blob state with the given blob ID.
Source§

fn read_blob_states<'life0, 'life1, 'async_trait>( &'life0 self, blob_ids: &'life1 [BlobId], ) -> Pin<Box<dyn Future<Output = Result<Vec<Option<BlobState>>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Reads the blob states with the given blob IDs.
Source§

fn write_blob<'life0, 'life1, 'async_trait>( &'life0 self, blob: &'life1 Blob, ) -> Pin<Box<dyn Future<Output = Result<(), ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Writes the given blob.
Source§

fn maybe_write_blob_states<'life0, 'life1, 'async_trait>( &'life0 self, blob_ids: &'life1 [BlobId], blob_state: BlobState, ) -> Pin<Box<dyn Future<Output = Result<(), ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Attempts to write the given blob state. Returns the latest Epoch to have used this blob.
Source§

fn maybe_write_blobs<'life0, 'life1, 'async_trait>( &'life0 self, blobs: &'life1 [Blob], ) -> Pin<Box<dyn Future<Output = Result<Vec<bool>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Writes the given blobs, but only if they already have a blob state. Returns true for the blobs that were written.
Source§

fn write_blobs<'life0, 'life1, 'async_trait>( &'life0 self, blobs: &'life1 [Blob], ) -> Pin<Box<dyn Future<Output = Result<(), ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Writes several blobs.
Source§

fn write_blobs_and_certificate<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, blobs: &'life1 [Blob], certificate: &'life2 ConfirmedBlockCertificate, ) -> Pin<Box<dyn Future<Output = Result<(), ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Writes blobs and certificate
Source§

fn contains_certificate<'life0, 'async_trait>( &'life0 self, hash: CryptoHash, ) -> Pin<Box<dyn Future<Output = Result<bool, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Tests existence of the certificate with the given hash.
Source§

fn read_certificate<'life0, 'async_trait>( &'life0 self, hash: CryptoHash, ) -> Pin<Box<dyn Future<Output = Result<Option<ConfirmedBlockCertificate>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Reads the certificate with the given hash.
Source§

fn read_certificates<'life0, 'life1, 'async_trait>( &'life0 self, hashes: &'life1 [CryptoHash], ) -> Pin<Box<dyn Future<Output = Result<Vec<Option<ConfirmedBlockCertificate>>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Reads a number of certificates
Source§

fn read_certificates_raw<'life0, 'life1, 'async_trait>( &'life0 self, hashes: &'life1 [CryptoHash], ) -> Pin<Box<dyn Future<Output = Result<Vec<Option<(Vec<u8>, Vec<u8>)>>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Reads raw certificate bytes by hashes. Read more
Source§

fn read_certificate_hashes_by_heights<'life0, 'life1, 'async_trait>( &'life0 self, chain_id: ChainId, heights: &'life1 [BlockHeight], ) -> Pin<Box<dyn Future<Output = Result<Vec<Option<CryptoHash>>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Returns a vector of certificate hashes for the requested chain and heights. The resulting vector maintains the order of the input heights argument. Elements are None if no certificate exists at that height.
Source§

fn read_certificates_by_heights_raw<'life0, 'life1, 'async_trait>( &'life0 self, chain_id: ChainId, heights: &'life1 [BlockHeight], ) -> Pin<Box<dyn Future<Output = Result<Vec<Option<(Vec<u8>, Vec<u8>)>>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Reads raw certificates by heights for a given chain. Returns a vector where each element corresponds to the input height. Elements are None if no certificate exists at that height. Each found certificate is returned as a tuple of (lite_certificate_bytes, confirmed_block_bytes).
Source§

fn read_certificates_by_heights<'life0, 'life1, 'async_trait>( &'life0 self, chain_id: ChainId, heights: &'life1 [BlockHeight], ) -> Pin<Box<dyn Future<Output = Result<Vec<Option<ConfirmedBlockCertificate>>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Reads certificates by heights for a given chain. Returns a vector where each element corresponds to the input height. Elements are None if no certificate exists at that height.
Source§

fn write_certificate_height_indices<'life0, 'life1, 'async_trait>( &'life0 self, chain_id: ChainId, indices: &'life1 [(BlockHeight, CryptoHash)], ) -> Pin<Box<dyn Future<Output = Result<(), ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Writes certificate height index entries for a given chain. This is used to populate the height->hash index when certificates are found via alternative methods (e.g., from chain state).
Source§

fn read_event<'life0, 'async_trait>( &'life0 self, event_id: EventId, ) -> Pin<Box<dyn Future<Output = Result<Option<Vec<u8>>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Reads the event with the given ID.
Source§

fn contains_event<'life0, 'async_trait>( &'life0 self, event_id: EventId, ) -> Pin<Box<dyn Future<Output = Result<bool, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Tests existence of the event with the given ID.
Source§

fn read_events_from_index<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, chain_id: &'life1 ChainId, stream_id: &'life2 StreamId, start_index: u32, ) -> Pin<Box<dyn Future<Output = Result<Vec<IndexAndEvent>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Lists all the events from a starting index
Source§

fn write_events<'life0, 'async_trait>( &'life0 self, events: impl 'async_trait + IntoIterator<Item = (EventId, Vec<u8>)> + Send, ) -> Pin<Box<dyn Future<Output = Result<(), ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Writes a vector of events.
Source§

fn read_network_description<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Option<NetworkDescription>, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Reads the network description.
Source§

fn write_network_description<'life0, 'life1, 'async_trait>( &'life0 self, information: &'life1 NetworkDescription, ) -> Pin<Box<dyn Future<Output = Result<(), ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Writes the network description.
Source§

fn wasm_runtime(&self) -> Option<WasmRuntime>

Selects the WebAssembly runtime to use for applications (if any).
Source§

fn block_exporter_context<'life0, 'async_trait>( &'life0 self, block_exporter_id: u32, ) -> Pin<Box<dyn Future<Output = Result<Self::BlockExporterContext, ViewError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Source§

fn create_chain<'life0, 'async_trait>( &'life0 self, description: ChainDescription, ) -> Pin<Box<dyn Future<Output = Result<(), ChainError>> + Send + 'async_trait>>
where ChainRuntimeContext<Self>: ExecutionRuntimeContext, Self: Sync + 'async_trait, 'life0: 'async_trait,

Initializes a chain in a simple way (used for testing and to create a genesis state). Read more
Source§

fn load_contract<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, application_description: &'life1 ApplicationDescription, txn_tracker: &'life2 TransactionTracker, ) -> Pin<Box<dyn Future<Output = Result<UserContractCode, ExecutionError>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Creates a UserContractCode instance using the bytecode in storage referenced by the application_description.
Source§

fn load_service<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, application_description: &'life1 ApplicationDescription, txn_tracker: &'life2 TransactionTracker, ) -> Pin<Box<dyn Future<Output = Result<UserServiceCode, ExecutionError>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Creates a [linera-sdk::UserContract] instance using the bytecode in storage referenced by the application_description.

Auto Trait Implementations§

§

impl<Database, Clock> Freeze for DbStorage<Database, Clock>
where Clock: Freeze,

§

impl<Database, Clock> RefUnwindSafe for DbStorage<Database, Clock>
where Clock: RefUnwindSafe, Database: RefUnwindSafe,

§

impl<Database, Clock> Send for DbStorage<Database, Clock>
where Clock: Send, Database: Sync + Send,

§

impl<Database, Clock> Sync for DbStorage<Database, Clock>
where Clock: Sync, Database: Sync + Send,

§

impl<Database, Clock> Unpin for DbStorage<Database, Clock>
where Clock: Unpin,

§

impl<Database, Clock> UnsafeUnpin for DbStorage<Database, Clock>
where Clock: UnsafeUnpin,

§

impl<Database, Clock> UnwindSafe for DbStorage<Database, Clock>
where Clock: UnwindSafe, Database: RefUnwindSafe,

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<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Choices> CoproductSubsetter<CNil, HNil> for Choices

Source§

type Remainder = Choices

Source§

fn subset( self, ) -> Result<CNil, <Choices as CoproductSubsetter<CNil, HNil>>::Remainder>

Extract a subset of the possible types in a coproduct (or get the remaining possibilities) Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<To, From> DynInto<To> for From
where From: Into<To>,

Source§

fn into_box(self: Box<From>) -> To

Converts a boxed object into the target type.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
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, U, I> LiftInto<U, I> for T
where U: LiftFrom<T, I>,

Source§

fn lift_into(self) -> U

Performs the indexed conversion.
Source§

impl<M, I> RuntimeMemory<&mut I> for M
where M: RuntimeMemory<I>,

Source§

fn read<'instance>( &self, instance: &'instance &mut I, location: GuestPointer, length: u32, ) -> Result<Cow<'instance, [u8]>, RuntimeError>

Reads length bytes from memory from the provided location.

Source§

fn write( &mut self, instance: &mut &mut I, location: GuestPointer, bytes: &[u8], ) -> Result<(), RuntimeError>

Writes the bytes to memory at the provided location.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<Source> Sculptor<HNil, HNil> for Source

Source§

type Remainder = Source

Source§

fn sculpt(self) -> (HNil, <Source as Sculptor<HNil, HNil>>::Remainder)

Consumes the current HList and returns an HList with the requested shape. Read more
Source§

impl<AnyTail> Split<HNil> for AnyTail

Source§

type Remainder = AnyTail

The tail of remaining elements after splitting up the list.
Source§

fn split(self) -> (HNil, <AnyTail as Split<HNil>>::Remainder)

Splits the current heterogeneous list in two.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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

impl<_INNER> AutoTraits for _INNER
where _INNER: Send + Sync + 'static,

Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> Post for T
where T: Send + 'static,