@ -1,4 +1,4 @@
|
|||||||
#![allow(dead_code)]
|
//! Helpers to create Libra accounts for testing
|
||||||
|
|
||||||
use crate::data_store::DataStore;
|
use crate::data_store::DataStore;
|
||||||
use compiler::Compiler;
|
use compiler::Compiler;
|
||||||
@ -78,6 +78,7 @@ impl LibraAccountState {
|
|||||||
let arena = Arena::new();
|
let arena = Arena::new();
|
||||||
let state_view = DataStore::default();
|
let state_view = DataStore::default();
|
||||||
let vm_cache = VMModuleCache::new(&arena);
|
let vm_cache = VMModuleCache::new(&arena);
|
||||||
|
// Libra enforces the mint address to be 0x0 (see Libra's `mint_to_address` function)
|
||||||
let mint_address = AccountAddress::default();
|
let mint_address = AccountAddress::default();
|
||||||
// TODO: Need this?
|
// TODO: Need this?
|
||||||
let genesis_auth_key = ByteArray::new(mint_address.to_vec());
|
let genesis_auth_key = ByteArray::new(mint_address.to_vec());
|
||||||
|
@ -44,7 +44,7 @@ impl DataStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a `WriteSet` for each account in the `DataStore`
|
/// Returns a `WriteSet` for each account in the `DataStore`
|
||||||
pub fn into_write_sets(mut self) -> HashMap<AccountAddress, WriteSet> {
|
pub fn into_write_sets(mut self) -> Result<HashMap<AccountAddress, WriteSet>> {
|
||||||
let mut write_set_muts: HashMap<AccountAddress, WriteSetMut> = HashMap::new();
|
let mut write_set_muts: HashMap<AccountAddress, WriteSetMut> = HashMap::new();
|
||||||
for (access_path, value) in self.data.drain() {
|
for (access_path, value) in self.data.drain() {
|
||||||
match write_set_muts.get_mut(&access_path.address) {
|
match write_set_muts.get_mut(&access_path.address) {
|
||||||
@ -60,9 +60,9 @@ impl DataStore {
|
|||||||
// Freeze each WriteSet
|
// Freeze each WriteSet
|
||||||
let mut write_sets: HashMap<AccountAddress, WriteSet> = HashMap::new();
|
let mut write_sets: HashMap<AccountAddress, WriteSet> = HashMap::new();
|
||||||
for (address, write_set_mut) in write_set_muts.drain() {
|
for (address, write_set_mut) in write_set_muts.drain() {
|
||||||
write_sets.insert(address, write_set_mut.freeze().unwrap());
|
write_sets.insert(address, write_set_mut.freeze()?);
|
||||||
}
|
}
|
||||||
write_sets
|
Ok(write_sets)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Read an account's resource
|
/// Read an account's resource
|
||||||
|
@ -86,7 +86,13 @@ impl MoveProcessor {
|
|||||||
}
|
}
|
||||||
fn map_vm_binary_error(err: vm::errors::BinaryError) -> InstructionError {
|
fn map_vm_binary_error(err: vm::errors::BinaryError) -> InstructionError {
|
||||||
debug!("Error: Script deserialize failed: {:?}", err);
|
debug!("Error: Script deserialize failed: {:?}", err);
|
||||||
InstructionError::GenericError
|
InstructionError::InvalidInstructionData
|
||||||
|
}
|
||||||
|
fn map_vm_verification_error(
|
||||||
|
err: std::vec::Vec<vm::errors::VerificationStatus>,
|
||||||
|
) -> InstructionError {
|
||||||
|
debug!("Error: Script verification failed: {:?}", err);
|
||||||
|
InstructionError::InvalidInstructionData
|
||||||
}
|
}
|
||||||
#[allow(clippy::needless_pass_by_value)]
|
#[allow(clippy::needless_pass_by_value)]
|
||||||
fn map_data_error(err: std::boxed::Box<bincode::ErrorKind>) -> InstructionError {
|
fn map_data_error(err: std::boxed::Box<bincode::ErrorKind>) -> InstructionError {
|
||||||
@ -238,9 +244,8 @@ impl MoveProcessor {
|
|||||||
let mut data_store = Self::keyed_accounts_to_data_store(&keyed_accounts[GENESIS_INDEX..])?;
|
let mut data_store = Self::keyed_accounts_to_data_store(&keyed_accounts[GENESIS_INDEX..])?;
|
||||||
|
|
||||||
let (verified_script, modules) =
|
let (verified_script, modules) =
|
||||||
// TODO: This function calls `.expect()`, switch to verify_program
|
|
||||||
static_verify_program(&invoke_info.sender_address, compiled_script, modules)
|
static_verify_program(&invoke_info.sender_address, compiled_script, modules)
|
||||||
.expect("verification failure");
|
.map_err(Self::map_vm_verification_error)?;
|
||||||
let output = Self::execute(invoke_info, verified_script, modules, &data_store)?;
|
let output = Self::execute(invoke_info, verified_script, modules, &data_store)?;
|
||||||
for event in output.events() {
|
for event in output.events() {
|
||||||
trace!("Event: {:?}", event);
|
trace!("Event: {:?}", event);
|
||||||
@ -248,7 +253,9 @@ impl MoveProcessor {
|
|||||||
data_store.apply_write_set(&output.write_set());
|
data_store.apply_write_set(&output.write_set());
|
||||||
|
|
||||||
// Break data store into a list of address keyed WriteSets
|
// Break data store into a list of address keyed WriteSets
|
||||||
let mut write_sets = data_store.into_write_sets();
|
let mut write_sets = data_store
|
||||||
|
.into_write_sets()
|
||||||
|
.map_err(|_| InstructionError::GenericError)?;
|
||||||
|
|
||||||
// Genesis account holds both mint and stdlib under address 0x0
|
// Genesis account holds both mint and stdlib under address 0x0
|
||||||
let write_set = write_sets
|
let write_set = write_sets
|
||||||
|
Reference in New Issue
Block a user