pub trait InterpreterStorage: StorageWrite<ContractsRawCode, Error = Self::DataError, Error = Self::DataError, Error = Self::DataError, Error = Self::DataError, Error = Self::DataError, Error = Self::DataError, Error = Self::DataError, Error = Self::DataError> + StorageSize<ContractsRawCode> + StorageRead<ContractsRawCode> + StorageWrite<ContractsState> + StorageSize<ContractsState> + StorageRead<ContractsState> + StorageMutate<UploadedBytecodes> + ContractsAssetsStorage {
type DataError: Into<InterpreterError<Self::DataError>> + Into<RuntimeError<Self::DataError>> + Debug;
Show 21 methods
// Required methods
fn block_height(&self) -> Result<BlockHeight, Self::DataError>;
fn consensus_parameters_version(&self) -> Result<u32, Self::DataError>;
fn state_transition_version(&self) -> Result<u32, Self::DataError>;
fn timestamp(&self, height: BlockHeight) -> Result<u64, Self::DataError>;
fn block_hash(
&self,
block_height: BlockHeight,
) -> Result<Bytes32, Self::DataError>;
fn coinbase(&self) -> Result<ContractId, Self::DataError>;
fn set_consensus_parameters(
&mut self,
version: u32,
consensus_parameters: &ConsensusParameters,
) -> Result<Option<ConsensusParameters>, Self::DataError>;
fn set_state_transition_bytecode(
&mut self,
version: u32,
hash: &Bytes32,
) -> Result<Option<Bytes32>, Self::DataError>;
fn contract_state_range(
&self,
id: &ContractId,
start_key: &Bytes32,
range: usize,
) -> Result<Vec<Option<Cow<'_, ContractsStateData>>>, Self::DataError>;
fn contract_state_insert_range<'a, I>(
&mut self,
contract: &ContractId,
start_key: &Bytes32,
values: I,
) -> Result<usize, Self::DataError>
where I: Iterator<Item = &'a [u8]>;
fn contract_state_remove_range(
&mut self,
contract: &ContractId,
start_key: &Bytes32,
range: usize,
) -> Result<Option<()>, Self::DataError>;
// Provided methods
fn contains_state_transition_bytecode_root(
&self,
root: &Bytes32,
) -> Result<bool, Self::DataError> { ... }
fn deploy_contract_with_id(
&mut self,
slots: &[StorageSlot],
contract: &Contract,
id: &ContractId,
) -> Result<(), Self::DataError> { ... }
fn storage_contract(
&self,
id: &ContractId,
) -> Result<Option<Cow<'_, Contract>>, Self::DataError> { ... }
fn storage_contract_size(
&self,
id: &ContractId,
) -> Result<Option<usize>, Self::DataError> { ... }
fn read_contract(
&self,
id: &ContractId,
writer: &mut [u8],
) -> Result<Option<u64>, Self::DataError> { ... }
fn storage_contract_insert(
&mut self,
id: &ContractId,
contract: &Contract,
) -> Result<Option<Contract>, Self::DataError> { ... }
fn storage_contract_exists(
&self,
id: &ContractId,
) -> Result<bool, Self::DataError> { ... }
fn contract_state(
&self,
id: &ContractId,
key: &Bytes32,
) -> Result<Option<Cow<'_, ContractsStateData>>, Self::DataError> { ... }
fn contract_state_insert(
&mut self,
contract: &ContractId,
key: &Bytes32,
value: &[u8],
) -> Result<(usize, Option<Vec<u8>>), Self::DataError> { ... }
fn contract_state_remove(
&mut self,
contract: &ContractId,
key: &Bytes32,
) -> Result<Option<ContractsStateData>, Self::DataError> { ... }
}
Expand description
When this trait is implemented, the underlying interpreter is guaranteed to have full functionality
Required Associated Types§
sourcetype DataError: Into<InterpreterError<Self::DataError>> + Into<RuntimeError<Self::DataError>> + Debug
type DataError: Into<InterpreterError<Self::DataError>> + Into<RuntimeError<Self::DataError>> + Debug
Error implementation for reasons unspecified in the protocol.
Required Methods§
sourcefn block_height(&self) -> Result<BlockHeight, Self::DataError>
fn block_height(&self) -> Result<BlockHeight, Self::DataError>
Provide the current block height in which the transactions should be executed.
sourcefn consensus_parameters_version(&self) -> Result<u32, Self::DataError>
fn consensus_parameters_version(&self) -> Result<u32, Self::DataError>
Provide the current version of consensus parameters used to execute transaction.
sourcefn state_transition_version(&self) -> Result<u32, Self::DataError>
fn state_transition_version(&self) -> Result<u32, Self::DataError>
Provide the current version of state transition function used to execute transaction.
sourcefn timestamp(&self, height: BlockHeight) -> Result<u64, Self::DataError>
fn timestamp(&self, height: BlockHeight) -> Result<u64, Self::DataError>
Return the timestamp of a given block
This isn’t optional because the VM is expected to panic if an invalid block height is passed - under the assumption that the block height is consistent, the storage should necessarily have the timestamp for the block, unless some I/O error prevents it from fetching it.
sourcefn block_hash(
&self,
block_height: BlockHeight,
) -> Result<Bytes32, Self::DataError>
fn block_hash( &self, block_height: BlockHeight, ) -> Result<Bytes32, Self::DataError>
Provide the block hash from a given height.
sourcefn coinbase(&self) -> Result<ContractId, Self::DataError>
fn coinbase(&self) -> Result<ContractId, Self::DataError>
Provide the coinbase address for the VM instructions implementation.
sourcefn set_consensus_parameters(
&mut self,
version: u32,
consensus_parameters: &ConsensusParameters,
) -> Result<Option<ConsensusParameters>, Self::DataError>
fn set_consensus_parameters( &mut self, version: u32, consensus_parameters: &ConsensusParameters, ) -> Result<Option<ConsensusParameters>, Self::DataError>
Set the consensus parameters in the storage under the version
.
Returns the previous consensus parameters if they were set.
sourcefn set_state_transition_bytecode(
&mut self,
version: u32,
hash: &Bytes32,
) -> Result<Option<Bytes32>, Self::DataError>
fn set_state_transition_bytecode( &mut self, version: u32, hash: &Bytes32, ) -> Result<Option<Bytes32>, Self::DataError>
Set the state transition bytecode in the storage under the version
.
Returns the previous bytecode if it was set.
sourcefn contract_state_range(
&self,
id: &ContractId,
start_key: &Bytes32,
range: usize,
) -> Result<Vec<Option<Cow<'_, ContractsStateData>>>, Self::DataError>
fn contract_state_range( &self, id: &ContractId, start_key: &Bytes32, range: usize, ) -> Result<Vec<Option<Cow<'_, ContractsStateData>>>, Self::DataError>
Fetch a range of values from a key-value mapping in a contract storage. Returns the full range requested using optional values in case a requested slot is unset.
sourcefn contract_state_insert_range<'a, I>(
&mut self,
contract: &ContractId,
start_key: &Bytes32,
values: I,
) -> Result<usize, Self::DataError>
fn contract_state_insert_range<'a, I>( &mut self, contract: &ContractId, start_key: &Bytes32, values: I, ) -> Result<usize, Self::DataError>
Insert a range of key-value mappings into contract storage. Returns the number of keys that were previously unset but are now set.
sourcefn contract_state_remove_range(
&mut self,
contract: &ContractId,
start_key: &Bytes32,
range: usize,
) -> Result<Option<()>, Self::DataError>
fn contract_state_remove_range( &mut self, contract: &ContractId, start_key: &Bytes32, range: usize, ) -> Result<Option<()>, Self::DataError>
Remove a range of key-values from contract storage. Returns None if any of the keys in the range were already unset.
Provided Methods§
sourcefn contains_state_transition_bytecode_root(
&self,
root: &Bytes32,
) -> Result<bool, Self::DataError>
fn contains_state_transition_bytecode_root( &self, root: &Bytes32, ) -> Result<bool, Self::DataError>
Returns true
if the fully uploaded state transition bytecode is present in the
storage.
sourcefn deploy_contract_with_id(
&mut self,
slots: &[StorageSlot],
contract: &Contract,
id: &ContractId,
) -> Result<(), Self::DataError>
fn deploy_contract_with_id( &mut self, slots: &[StorageSlot], contract: &Contract, id: &ContractId, ) -> Result<(), Self::DataError>
Deploy a contract into the storage with contract id
sourcefn storage_contract(
&self,
id: &ContractId,
) -> Result<Option<Cow<'_, Contract>>, Self::DataError>
fn storage_contract( &self, id: &ContractId, ) -> Result<Option<Cow<'_, Contract>>, Self::DataError>
Fetch a previously inserted contract code from the chain state for a given contract.
sourcefn storage_contract_size(
&self,
id: &ContractId,
) -> Result<Option<usize>, Self::DataError>
fn storage_contract_size( &self, id: &ContractId, ) -> Result<Option<usize>, Self::DataError>
Fetch the size of a previously inserted contract code from the chain state for a given contract.
sourcefn read_contract(
&self,
id: &ContractId,
writer: &mut [u8],
) -> Result<Option<u64>, Self::DataError>
fn read_contract( &self, id: &ContractId, writer: &mut [u8], ) -> Result<Option<u64>, Self::DataError>
Read contract bytes from storage into the buffer.
sourcefn storage_contract_insert(
&mut self,
id: &ContractId,
contract: &Contract,
) -> Result<Option<Contract>, Self::DataError>
fn storage_contract_insert( &mut self, id: &ContractId, contract: &Contract, ) -> Result<Option<Contract>, Self::DataError>
Append a contract to the chain, provided its identifier.
Canonically, the identifier should be Contract::id
.
sourcefn storage_contract_exists(
&self,
id: &ContractId,
) -> Result<bool, Self::DataError>
fn storage_contract_exists( &self, id: &ContractId, ) -> Result<bool, Self::DataError>
Check if a provided contract exists in the chain.
sourcefn contract_state(
&self,
id: &ContractId,
key: &Bytes32,
) -> Result<Option<Cow<'_, ContractsStateData>>, Self::DataError>
fn contract_state( &self, id: &ContractId, key: &Bytes32, ) -> Result<Option<Cow<'_, ContractsStateData>>, Self::DataError>
Fetch the value form a key-value mapping in a contract storage.
sourcefn contract_state_insert(
&mut self,
contract: &ContractId,
key: &Bytes32,
value: &[u8],
) -> Result<(usize, Option<Vec<u8>>), Self::DataError>
fn contract_state_insert( &mut self, contract: &ContractId, key: &Bytes32, value: &[u8], ) -> Result<(usize, Option<Vec<u8>>), Self::DataError>
Insert a key-value mapping in a contract storage.
sourcefn contract_state_remove(
&mut self,
contract: &ContractId,
key: &Bytes32,
) -> Result<Option<ContractsStateData>, Self::DataError>
fn contract_state_remove( &mut self, contract: &ContractId, key: &Bytes32, ) -> Result<Option<ContractsStateData>, Self::DataError>
Remove a key-value mapping from a contract storage.