pub trait External {
Show 19 methods
// Required methods
fn storage_set(
&mut self,
key: &[u8],
value: &[u8],
) -> Result<(), VMLogicError>;
fn storage_get<'a>(
&'a self,
key: &[u8],
) -> Result<Option<Box<dyn ValuePtr + 'a>>, VMLogicError>;
fn storage_remove(&mut self, key: &[u8]) -> Result<(), VMLogicError>;
fn storage_remove_subtree(
&mut self,
prefix: &[u8],
) -> Result<(), VMLogicError>;
fn storage_has_key(&mut self, key: &[u8]) -> Result<bool, VMLogicError>;
fn create_receipt(
&mut self,
receipt_indices: Vec<ReceiptIndex>,
receiver_id: AccountId,
) -> Result<ReceiptIndex, VMLogicError>;
fn append_action_create_account(
&mut self,
receipt_index: ReceiptIndex,
) -> Result<(), VMLogicError>;
fn append_action_deploy_contract(
&mut self,
receipt_index: ReceiptIndex,
code: Vec<u8>,
) -> Result<(), VMLogicError>;
fn append_action_function_call(
&mut self,
receipt_index: ReceiptIndex,
method_name: Vec<u8>,
arguments: Vec<u8>,
attached_deposit: Balance,
prepaid_gas: Gas,
) -> Result<(), VMLogicError>;
fn append_action_transfer(
&mut self,
receipt_index: ReceiptIndex,
amount: Balance,
) -> Result<(), VMLogicError>;
fn append_action_stake(
&mut self,
receipt_index: ReceiptIndex,
stake: Balance,
public_key: PublicKey,
) -> Result<(), VMLogicError>;
fn append_action_add_key_with_full_access(
&mut self,
receipt_index: ReceiptIndex,
public_key: PublicKey,
nonce: u64,
) -> Result<(), VMLogicError>;
fn append_action_add_key_with_function_call(
&mut self,
receipt_index: ReceiptIndex,
public_key: PublicKey,
nonce: u64,
allowance: Option<Balance>,
receiver_id: AccountId,
method_names: Vec<Vec<u8>>,
) -> Result<(), VMLogicError>;
fn append_action_delete_key(
&mut self,
receipt_index: ReceiptIndex,
public_key: PublicKey,
) -> Result<(), VMLogicError>;
fn append_action_delete_account(
&mut self,
receipt_index: ReceiptIndex,
beneficiary_id: AccountId,
) -> Result<(), VMLogicError>;
fn get_touched_nodes_count(&self) -> u64;
fn reset_touched_nodes_counter(&mut self);
fn validator_stake(
&self,
account_id: &AccountId,
) -> Result<Option<Balance>, VMLogicError>;
fn validator_total_stake(&self) -> Result<Balance, VMLogicError>;
}Expand description
An external blockchain interface for the Runtime logic
Required Methods§
Sourcefn storage_set(&mut self, key: &[u8], value: &[u8]) -> Result<(), VMLogicError>
fn storage_set(&mut self, key: &[u8], value: &[u8]) -> Result<(), VMLogicError>
Write to the storage trie of the current account
§Arguments
key- a key for a new valuevalue- a new value to be set
§Errors
This function could return HostErrorOrStorageError::StorageError on underlying DB failure
§Example
assert_eq!(external.storage_set(b"key42", b"value1337"), Ok(()));
// Should return an old value if the key exists
assert_eq!(external.storage_set(b"key42", b"new_value"), Ok(()));Sourcefn storage_get<'a>(
&'a self,
key: &[u8],
) -> Result<Option<Box<dyn ValuePtr + 'a>>, VMLogicError>
fn storage_get<'a>( &'a self, key: &[u8], ) -> Result<Option<Box<dyn ValuePtr + 'a>>, VMLogicError>
Reads from the storage trie of the current account
§Arguments
key- a key to read
§Errors
This function could return HostErrorOrStorageError::StorageError on underlying DB failure
§Example
external.storage_set(b"key42", b"value1337").unwrap();
assert_eq!(external.storage_get(b"key42").unwrap().map(|ptr| ptr.deref().unwrap()), Some(b"value1337".to_vec()));
// Returns Ok(None) if there is no value for a key
assert_eq!(external.storage_get(b"no_key").unwrap().map(|ptr| ptr.deref().unwrap()), None);Sourcefn storage_remove(&mut self, key: &[u8]) -> Result<(), VMLogicError>
fn storage_remove(&mut self, key: &[u8]) -> Result<(), VMLogicError>
Removes the key from the storage
§Arguments
key- a key to remove
§Errors
This function could return HostErrorOrStorageError::StorageError on underlying DB failure
§Example
external.storage_set(b"key42", b"value1337").unwrap();
// Returns Ok if exists
assert_eq!(external.storage_remove(b"key42"), Ok(()));
// Returns Ok if there was no value
assert_eq!(external.storage_remove(b"no_value_key"), Ok(()));Sourcefn storage_remove_subtree(&mut self, prefix: &[u8]) -> Result<(), VMLogicError>
fn storage_remove_subtree(&mut self, prefix: &[u8]) -> Result<(), VMLogicError>
Removes all keys under given suffix in the storage.
§Arguments
prefix- a prefix for all keys to remove
§Errors
This function could return HostErrorOrStorageError::StorageError on underlying DB failure
§Example
external.storage_set(b"key1", b"value1337").unwrap();
external.storage_set(b"key2", b"value1337").unwrap();
assert_eq!(external.storage_remove_subtree(b"key"), Ok(()));
assert!(!external.storage_has_key(b"key1").unwrap());
assert!(!external.storage_has_key(b"key2").unwrap());Sourcefn storage_has_key(&mut self, key: &[u8]) -> Result<bool, VMLogicError>
fn storage_has_key(&mut self, key: &[u8]) -> Result<bool, VMLogicError>
Check whether key exists. Returns Ok(true) if key exists or Ok(false) otherwise
§Arguments
key- a key to check
§Errors
This function could return HostErrorOrStorageError::StorageError on underlying DB failure
§Example
external.storage_set(b"key42", b"value1337").unwrap();
// Returns value if exists
assert_eq!(external.storage_has_key(b"key42"), Ok(true));
// Returns None if there was no value
assert_eq!(external.storage_has_key(b"no_value_key"), Ok(false));Sourcefn create_receipt(
&mut self,
receipt_indices: Vec<ReceiptIndex>,
receiver_id: AccountId,
) -> Result<ReceiptIndex, VMLogicError>
fn create_receipt( &mut self, receipt_indices: Vec<ReceiptIndex>, receiver_id: AccountId, ) -> Result<ReceiptIndex, VMLogicError>
Creates a receipt which will be executed after receipt_indices
§Arguments
receipt_indices- a list of receipt indices the new receipt is depend on
§Example
let receipt_index_one = external.create_receipt(vec![], "charli.near".to_owned()).unwrap();
let receipt_index_two = external.create_receipt(vec![receipt_index_one], "bob.near".to_owned());
§Panics
Panics if one of receipt_indices is missing
Sourcefn append_action_create_account(
&mut self,
receipt_index: ReceiptIndex,
) -> Result<(), VMLogicError>
fn append_action_create_account( &mut self, receipt_index: ReceiptIndex, ) -> Result<(), VMLogicError>
Attaches an Action::CreateAccount action to an existing receipt
§Arguments
receipt_index- an index of Receipt to append an action
§Example
let receipt_index = external.create_receipt(vec![], "charli.near".to_owned()).unwrap();
external.append_action_create_account(receipt_index).unwrap();
§Panics
Panics if receipt_index is missing
Sourcefn append_action_deploy_contract(
&mut self,
receipt_index: ReceiptIndex,
code: Vec<u8>,
) -> Result<(), VMLogicError>
fn append_action_deploy_contract( &mut self, receipt_index: ReceiptIndex, code: Vec<u8>, ) -> Result<(), VMLogicError>
Attaches an Action::DeployContract action to an existing receipt
§Arguments
receipt_index- an index of Receipt to append an actioncode- a Wasm code to attach
§Example
let receipt_index = external.create_receipt(vec![], "charli.near".to_owned()).unwrap();
external.append_action_deploy_contract(receipt_index, b"some valid Wasm code".to_vec()).unwrap();
§Panics
Panics if receipt_index is missing
Sourcefn append_action_function_call(
&mut self,
receipt_index: ReceiptIndex,
method_name: Vec<u8>,
arguments: Vec<u8>,
attached_deposit: Balance,
prepaid_gas: Gas,
) -> Result<(), VMLogicError>
fn append_action_function_call( &mut self, receipt_index: ReceiptIndex, method_name: Vec<u8>, arguments: Vec<u8>, attached_deposit: Balance, prepaid_gas: Gas, ) -> Result<(), VMLogicError>
Attaches an Action::FunctionCall action to an existing receipt
§Arguments
receipt_index- an index of Receipt to append an actionmethod_name- a name of the contract method to callarguments- a Wasm code to attachattached_deposit- amount of tokens to transfer with the callprepaid_gas- amount of prepaid gas to attach to the call
§Example
let receipt_index = external.create_receipt(vec![], "charli.near".to_owned()).unwrap();
external.append_action_function_call(
receipt_index,
b"method_name".to_vec(),
b"{serialised: arguments}".to_vec(),
100000u128,
100u64
).unwrap();
§Panics
Panics if receipt_index is missing
Sourcefn append_action_transfer(
&mut self,
receipt_index: ReceiptIndex,
amount: Balance,
) -> Result<(), VMLogicError>
fn append_action_transfer( &mut self, receipt_index: ReceiptIndex, amount: Balance, ) -> Result<(), VMLogicError>
Attaches an TransferAction action to an existing receipt
§Arguments
receipt_index- an index of Receipt to append an actionamount- amount of tokens to transfer
§Example
let receipt_index = external.create_receipt(vec![], "charli.near".to_owned()).unwrap();
external.append_action_transfer(
receipt_index,
100000u128,
).unwrap();
§Panics
Panics if receipt_index is missing
Sourcefn append_action_stake(
&mut self,
receipt_index: ReceiptIndex,
stake: Balance,
public_key: PublicKey,
) -> Result<(), VMLogicError>
fn append_action_stake( &mut self, receipt_index: ReceiptIndex, stake: Balance, public_key: PublicKey, ) -> Result<(), VMLogicError>
Attaches an StakeAction action to an existing receipt
§Arguments
receipt_index- an index of Receipt to append an actionstake- amount of tokens to stakepublic_key- a validator public key
§Example
let receipt_index = external.create_receipt(vec![], "charli.near".to_owned()).unwrap();
external.append_action_stake(
receipt_index,
100000u128,
b"some public key".to_vec()
).unwrap();
§Panics
Panics if receipt_index is missing
Sourcefn append_action_add_key_with_full_access(
&mut self,
receipt_index: ReceiptIndex,
public_key: PublicKey,
nonce: u64,
) -> Result<(), VMLogicError>
fn append_action_add_key_with_full_access( &mut self, receipt_index: ReceiptIndex, public_key: PublicKey, nonce: u64, ) -> Result<(), VMLogicError>
Attaches an AddKeyAction action to an existing receipt
§Arguments
receipt_index- an index of Receipt to append an actionpublic_key- a public key for an access keynonce- a nonce
§Example
let receipt_index = external.create_receipt(vec![], "charli.near".to_owned()).unwrap();
external.append_action_add_key_with_full_access(
receipt_index,
b"some public key".to_vec(),
0u64
).unwrap();
§Panics
Panics if receipt_index is missing
Sourcefn append_action_add_key_with_function_call(
&mut self,
receipt_index: ReceiptIndex,
public_key: PublicKey,
nonce: u64,
allowance: Option<Balance>,
receiver_id: AccountId,
method_names: Vec<Vec<u8>>,
) -> Result<(), VMLogicError>
fn append_action_add_key_with_function_call( &mut self, receipt_index: ReceiptIndex, public_key: PublicKey, nonce: u64, allowance: Option<Balance>, receiver_id: AccountId, method_names: Vec<Vec<u8>>, ) -> Result<(), VMLogicError>
Attaches an AddKeyAction action to an existing receipt with AccessKeyPermission::FunctionCall
§Arguments
receipt_index- an index of Receipt to append an actionpublic_key- a public key for an access keynonce- a nonceallowance- amount of tokens allowed to spend by this access keyreceiver_id- a contract witch will be allowed to call with this access keymethod_names- a list of method names is allowed to call with this access key (empty = any method)
§Example
let receipt_index = external.create_receipt(vec![], "charli.near".to_owned()).unwrap();
external.append_action_add_key_with_function_call(
receipt_index,
b"some public key".to_vec(),
0u64,
None,
"bob.near".to_owned(),
vec![b"foo".to_vec(), b"bar".to_vec()]
).unwrap();
§Panics
Panics if receipt_index is missing
Sourcefn append_action_delete_key(
&mut self,
receipt_index: ReceiptIndex,
public_key: PublicKey,
) -> Result<(), VMLogicError>
fn append_action_delete_key( &mut self, receipt_index: ReceiptIndex, public_key: PublicKey, ) -> Result<(), VMLogicError>
Attaches an DeleteKeyAction action to an existing receipt
§Arguments
receipt_index- an index of Receipt to append an actionpublic_key- a public key for an access key to delete
§Example
let receipt_index = external.create_receipt(vec![], "charli.near".to_owned()).unwrap();
external.append_action_delete_key(
receipt_index,
b"some public key".to_vec()
).unwrap();
§Panics
Panics if receipt_index is missing
Sourcefn append_action_delete_account(
&mut self,
receipt_index: ReceiptIndex,
beneficiary_id: AccountId,
) -> Result<(), VMLogicError>
fn append_action_delete_account( &mut self, receipt_index: ReceiptIndex, beneficiary_id: AccountId, ) -> Result<(), VMLogicError>
Attaches an DeleteAccountAction action to an existing receipt
§Arguments
receipt_index- an index of Receipt to append an actionbeneficiary_id- an account id to which the rest of the funds of the removed account will be transferred
§Example
let receipt_index = external.create_receipt(vec![], "charli.near".to_owned()).unwrap();
external.append_action_delete_account(
receipt_index,
"sam".to_owned()
).unwrap();
§Panics
Panics if receipt_index is missing
Sourcefn get_touched_nodes_count(&self) -> u64
fn get_touched_nodes_count(&self) -> u64
Returns amount of touched trie nodes by storage operations
Sourcefn reset_touched_nodes_counter(&mut self)
fn reset_touched_nodes_counter(&mut self)
Resets amount of touched trie nodes by storage operations
Sourcefn validator_stake(
&self,
account_id: &AccountId,
) -> Result<Option<Balance>, VMLogicError>
fn validator_stake( &self, account_id: &AccountId, ) -> Result<Option<Balance>, VMLogicError>
Returns the validator stake for given account in the current epoch.
If the account is not a validator, returns None.
Sourcefn validator_total_stake(&self) -> Result<Balance, VMLogicError>
fn validator_total_stake(&self) -> Result<Balance, VMLogicError>
Returns total stake of validators in the current epoch.