diff --git a/programs/move_loader_api/src/account_state.rs b/programs/move_loader_api/src/account_state.rs index b43f893d29..bff1f4576c 100644 --- a/programs/move_loader_api/src/account_state.rs +++ b/programs/move_loader_api/src/account_state.rs @@ -1,4 +1,4 @@ -#![allow(dead_code)] +//! Helpers to create Libra accounts for testing use crate::data_store::DataStore; use compiler::Compiler; @@ -78,6 +78,7 @@ impl LibraAccountState { let arena = Arena::new(); let state_view = DataStore::default(); 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(); // TODO: Need this? let genesis_auth_key = ByteArray::new(mint_address.to_vec()); diff --git a/programs/move_loader_api/src/data_store.rs b/programs/move_loader_api/src/data_store.rs index 6ad8a0d6a3..4967012932 100644 --- a/programs/move_loader_api/src/data_store.rs +++ b/programs/move_loader_api/src/data_store.rs @@ -44,7 +44,7 @@ impl DataStore { } /// Returns a `WriteSet` for each account in the `DataStore` - pub fn into_write_sets(mut self) -> HashMap { + pub fn into_write_sets(mut self) -> Result> { let mut write_set_muts: HashMap = HashMap::new(); for (access_path, value) in self.data.drain() { match write_set_muts.get_mut(&access_path.address) { @@ -60,9 +60,9 @@ impl DataStore { // Freeze each WriteSet let mut write_sets: HashMap = HashMap::new(); 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 diff --git a/programs/move_loader_api/src/processor.rs b/programs/move_loader_api/src/processor.rs index 9ba0ef1ab0..d4d0291ac0 100644 --- a/programs/move_loader_api/src/processor.rs +++ b/programs/move_loader_api/src/processor.rs @@ -86,7 +86,13 @@ impl MoveProcessor { } fn map_vm_binary_error(err: vm::errors::BinaryError) -> InstructionError { debug!("Error: Script deserialize failed: {:?}", err); - InstructionError::GenericError + InstructionError::InvalidInstructionData + } + fn map_vm_verification_error( + err: std::vec::Vec, + ) -> InstructionError { + debug!("Error: Script verification failed: {:?}", err); + InstructionError::InvalidInstructionData } #[allow(clippy::needless_pass_by_value)] fn map_data_error(err: std::boxed::Box) -> InstructionError { @@ -238,9 +244,8 @@ impl MoveProcessor { let mut data_store = Self::keyed_accounts_to_data_store(&keyed_accounts[GENESIS_INDEX..])?; let (verified_script, modules) = - // TODO: This function calls `.expect()`, switch to verify_program - static_verify_program(&invoke_info.sender_address, compiled_script, modules) - .expect("verification failure"); + static_verify_program(&invoke_info.sender_address, compiled_script, modules) + .map_err(Self::map_vm_verification_error)?; let output = Self::execute(invoke_info, verified_script, modules, &data_store)?; for event in output.events() { trace!("Event: {:?}", event); @@ -248,7 +253,9 @@ impl MoveProcessor { data_store.apply_write_set(&output.write_set()); // 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 let write_set = write_sets