pub(crate) struct SpeculativeLedger {
    final_state: Arc<RwLock<dyn FinalStateController>>,
    active_history: Arc<RwLock<ActiveHistory>>,
    pub added_changes: LedgerChanges,
    max_datastore_key_length: u8,
    max_datastore_value_size: u64,
    max_bytecode_size: u64,
    storage_costs_constants: StorageCostsConstants,
    transfers_history: Arc<RwLock<Vec<TransferInfo>>>,
}
Expand description

The SpeculativeLedger contains an thread-safe shared reference to the final ledger (read-only), a list of existing changes that happened o the ledger since its finality, as well as an extra list of “added” changes. The SpeculativeLedger makes it possible to transparently manipulate a virtual ledger that takes into account all those ledger changes and allows adding more while keeping track of all the newly added changes, and never writing in the final ledger.

Fields§

§final_state: Arc<RwLock<dyn FinalStateController>>

Thread-safe shared access to the final state. For reading only.

§active_history: Arc<RwLock<ActiveHistory>>

History of the outputs of recently executed slots. Slots should be consecutive, newest at the back.

§added_changes: LedgerChanges

list of ledger changes that were applied to this SpeculativeLedger since its creation

§max_datastore_key_length: u8

max datastore key length

§max_datastore_value_size: u64

Max datastore value size

§max_bytecode_size: u64

Max bytecode size

§storage_costs_constants: StorageCostsConstants

storage cost constants

§transfers_history: Arc<RwLock<Vec<TransferInfo>>>

Implementations§

source§

impl SpeculativeLedger

source

pub fn new( final_state: Arc<RwLock<dyn FinalStateController>>, active_history: Arc<RwLock<ActiveHistory>>, max_datastore_key_length: u8, max_bytecode_size: u64, max_datastore_value_size: u64, storage_costs_constants: StorageCostsConstants, transfers_history: Arc<RwLock<Vec<TransferInfo>>>, ) -> Self

creates a new SpeculativeLedger

§Arguments
  • final_state: thread-safe shared access to the final state (for reading only)
  • active_history: thread-safe shared access the speculative execution history
source

pub fn take(&mut self) -> LedgerChanges

Returns the changes caused to the SpeculativeLedger since its creation, and resets their local value to nothing.

source

pub fn get_snapshot(&self) -> LedgerChanges

Takes a snapshot (clone) of the changes caused to the SpeculativeLedger since its creation

source

pub fn reset_to_snapshot(&mut self, snapshot: LedgerChanges)

Resets the SpeculativeLedger to a snapshot (see get_snapshot method)

source

pub fn get_balance(&self, addr: &Address) -> Option<Amount>

Gets the effective balance of an address

§Arguments:

addr: the address to query

§Returns

Some(Amount) if the address was found, otherwise None

source

pub fn get_bytecode(&self, addr: &Address) -> Option<Bytecode>

Gets the effective bytecode of an address

§Arguments:

addr: the address to query

§Returns

Some(Bytecode) if the address was found, otherwise None

source

pub fn transfer_coins( &mut self, from_addr: Option<Address>, to_addr: Option<Address>, amount: Amount, _context: TransferContext, ) -> Result<(), ExecutionError>

Transfers coins from one address to another. No changes are retained in case of failure. The spending address, if defined, must exist.

§Parameters:
  • from_addr: optional spending address (use None for pure coin creation)
  • to_addr: optional crediting address (use None for pure coin destruction)
  • amount: amount of coins to transfer
source

pub fn entry_exists(&self, addr: &Address) -> bool

Checks if an address exists in the speculative ledger

§Arguments:

addr: the address to query

§Returns

true if the address was found, otherwise false

source

pub fn create_new_sc_address( &mut self, creator_address: Address, addr: Address, bytecode: Bytecode, ) -> Result<(), ExecutionError>

Creates a new smart contract address with initial bytecode.

§Arguments
  • creator_address: address that asked for this creation. Will pay the storage costs.
  • addr: address to create
  • bytecode: bytecode to set in the new ledger entry
source

pub fn set_bytecode( &mut self, caller_addr: &Address, addr: &Address, bytecode: Bytecode, ) -> Result<(), ExecutionError>

Sets the bytecode associated to an address in the ledger. Fails if the address doesn’t exist.

§Arguments
  • caller_addr: address of the caller. Will pay the storage costs.
  • addr: target address
  • bytecode: bytecode to set for that address
source

pub fn get_keys( &self, addr: &Address, prefix: &[u8], start_key: Bound<Vec<u8>>, end_key: Bound<Vec<u8>>, count: Option<u32>, ) -> Option<BTreeSet<Vec<u8>>>

Gets a copy of a datastore keys for a given address

§Arguments
  • addr: address to query
  • prefix: prefix to filter keys
  • start_key: start key of the range
  • end_key: end key of the range
  • count: maximum number of keys to return
§Returns

Some(Vec<Vec<u8>>) for found keys, None if the address does not exist.

source

pub fn get_data_entry(&self, addr: &Address, key: &[u8]) -> Option<Vec<u8>>

Gets a copy of a datastore value for a given address and datastore key

§Arguments
  • addr: address to query
  • key: key to query in the address’ datastore
§Returns

Some(Vec<u8>) if the value was found, None if the address does not exist or if the key is not in its datastore.

source

pub fn has_data_entry(&self, addr: &Address, key: &[u8]) -> bool

Checks if a data entry exists for a given address

§Arguments
  • addr: address to query
  • key: datastore key to look for
§Returns

true if the key exists in the address datastore, false otherwise

source

fn get_storage_cost_datastore_entry( &self, key: &[u8], value: &[u8], ) -> Result<Amount, ExecutionError>

Compute the storage costs of a full datastore entry

source

fn charge_datastore_entry_change_storage( &mut self, caller_addr: &Address, old_key_value: Option<(&[u8], &[u8])>, new_key_value: Option<(&[u8], &[u8])>, ) -> Result<(), ExecutionError>

Charge the storage costs of a datastore entry change, if any.

source

pub fn set_data_entry( &mut self, caller_addr: &Address, addr: &Address, key: Vec<u8>, value: Vec<u8>, ) -> Result<(), ExecutionError>

Sets a data set entry for a given address in the ledger. Fails if the address doesn’t exist. If the datastore entry does not exist, it is created.

§Arguments
  • caller_addr: address of the caller. Will pay the storage costs.
  • addr: target address
  • key: datastore key
  • data: value to associate to the datastore key
source

pub fn delete_data_entry( &mut self, caller_addr: &Address, addr: &Address, key: &[u8], ) -> Result<(), ExecutionError>

Deletes a datastore entry for a given address. Fails if the entry or address does not exist.

§Arguments
  • caller_addr: address of the caller. Will pay the storage costs.
  • addr: address
  • key: key of the entry to delete in the address’ datastore

Auto Trait Implementations§

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
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
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
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where W: DeserializeWith<F, T, D>, D: Fallible + ?Sized, F: ?Sized,

§

fn deserialize( &self, deserializer: &mut D, ) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

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> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows 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) -> R
where R: 'a,

Mutably borrows 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
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

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

§

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>,

§

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

impl<T> Upcastable for T
where T: Any + Send + Sync + 'static,

§

fn upcast_any_ref(&self) -> &(dyn Any + 'static)

upcast ref
§

fn upcast_any_mut(&mut self) -> &mut (dyn Any + 'static)

upcast mut ref
§

fn upcast_any_box(self: Box<T>) -> Box<dyn Any>

upcast boxed dyn
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

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

§

impl<T> MaybeSendSync for T