From 0b4851cf2e59eb66ab3863be2b6751f84641c866 Mon Sep 17 00:00:00 2001 From: Brandon Kite Date: Wed, 20 Apr 2022 11:22:40 +0200 Subject: [PATCH 1/2] update vm to use newer ScriptExecutionResult --- Cargo.toml | 6 +++--- src/backtrace.rs | 11 +++++------ src/interpreter/executors/main.rs | 16 ++++++++++++---- src/interpreter/flow.rs | 2 +- tests/alu.rs | 4 ++-- tests/code_coverage.rs | 3 ++- tests/profile_gas.rs | 17 +++++++++++++---- 7 files changed, 38 insertions(+), 21 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d5397ddf09..22e8574c4f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,10 +13,10 @@ description = "FuelVM interpreter." [dependencies] dyn-clone = { version = "1.0", optional = true } fuel-asm = "0.3" -fuel-crypto = "0.3" +fuel-crypto = "0.4" fuel-merkle = "0.1" fuel-storage = "0.1" -fuel-tx = "0.7" +fuel-tx = "0.8" fuel-types = "0.3" itertools = "0.10" secp256k1 = { version = "0.20", features = ["recovery"] } @@ -27,7 +27,7 @@ tracing = "0.1" rand = { version = "0.8", optional = true } [dev-dependencies] -fuel-tx = { version = "0.7", features = ["random"] } +fuel-tx = { version = "0.8", features = ["random"] } fuel-vm = { path = ".", default-features = false, features = ["test-helpers"]} [features] diff --git a/src/backtrace.rs b/src/backtrace.rs index 9ea9e5786c..a961448416 100644 --- a/src/backtrace.rs +++ b/src/backtrace.rs @@ -6,8 +6,7 @@ use crate::call::CallFrame; use crate::consts::*; use crate::interpreter::Interpreter; -use fuel_asm::InstructionResult; -use fuel_tx::Transaction; +use fuel_tx::{ScriptExecutionResult, Transaction}; use fuel_types::{ContractId, Word}; #[derive(Debug)] @@ -17,7 +16,7 @@ pub struct Backtrace { contract: ContractId, registers: [Word; VM_REGISTER_COUNT], memory: Vec, - result: InstructionResult, + result: ScriptExecutionResult, tx: Transaction, } @@ -25,7 +24,7 @@ impl Backtrace { /// Create a backtrace from a vm instance and instruction result. /// /// This isn't copy-free and shouldn't be provided by default. - pub fn from_vm_error(vm: &Interpreter, result: InstructionResult) -> Self { + pub fn from_vm_error(vm: &Interpreter, result: ScriptExecutionResult) -> Self { let call_stack = vm.call_stack().to_owned(); let contract = vm.internal_contract_or_default(); let memory = vm.memory().to_owned(); @@ -65,7 +64,7 @@ impl Backtrace { } /// [`InstructionResult`] of the error that caused this backtrace. - pub const fn result(&self) -> &InstructionResult { + pub const fn result(&self) -> &ScriptExecutionResult { &self.result } @@ -82,7 +81,7 @@ impl Backtrace { ContractId, [Word; VM_REGISTER_COUNT], Vec, - InstructionResult, + ScriptExecutionResult, Transaction, ) { let Self { diff --git a/src/interpreter/executors/main.rs b/src/interpreter/executors/main.rs index cd23dff5ea..127d765279 100644 --- a/src/interpreter/executors/main.rs +++ b/src/interpreter/executors/main.rs @@ -7,8 +7,8 @@ use crate::prelude::*; use crate::state::{ExecuteState, ProgramState, StateTransitionRef}; use crate::storage::InterpreterStorage; -use fuel_asm::{InstructionResult, PanicReason}; -use fuel_tx::{Input, Output, Receipt, Transaction}; +use fuel_asm::PanicReason; +use fuel_tx::{Input, Output, Receipt, ScriptExecutionResult, Transaction}; use fuel_types::{bytes::SerializableVec, Word}; impl Interpreter @@ -116,14 +116,22 @@ where // Catch VM panic and don't propagate, generating a receipt let (status, program) = match program { - Ok(s) => (InstructionResult::success(), s), + Ok(s) => { + // either a revert or success + let res = if let ProgramState::Revert(_) = &s { + ScriptExecutionResult::Revert + } else { + ScriptExecutionResult::Success + }; + (res, s) + } Err(e) => match e.instruction_result() { Some(result) => { self.append_panic_receipt(*result); self.apply_revert(); - (*result, ProgramState::Revert(0)) + (ScriptExecutionResult::Panic, ProgramState::Revert(0)) } // This isn't a specified case of an erroneous program and should be diff --git a/src/interpreter/flow.rs b/src/interpreter/flow.rs index a1771484ad..a5b1fca703 100644 --- a/src/interpreter/flow.rs +++ b/src/interpreter/flow.rs @@ -208,7 +208,7 @@ where let pc = self.registers[REG_PC]; let is = self.registers[REG_IS]; - let receipt = Receipt::panic(self.internal_contract_or_default(), Word::from(result), pc, is); + let receipt = Receipt::panic(self.internal_contract_or_default(), result, pc, is); self.receipts.push(receipt); } diff --git a/tests/alu.rs b/tests/alu.rs index 69ced801ae..d4105aa340 100644 --- a/tests/alu.rs +++ b/tests/alu.rs @@ -71,9 +71,9 @@ fn alu_err(registers_init: &[(RegisterId, Immediate18)], op: Opcode) { let result = receipts .iter() - .find_map(Receipt::result) + .find_map(Receipt::reason) .map(|r| *r.reason()) - .expect("Expected script result"); + .expect("Expected panic reason"); assert_eq!(PanicReason::ReservedRegisterNotWritable, result); } diff --git a/tests/code_coverage.rs b/tests/code_coverage.rs index bdc842ddf5..2edf350035 100644 --- a/tests/code_coverage.rs +++ b/tests/code_coverage.rs @@ -1,3 +1,4 @@ +use fuel_tx::ScriptExecutionResult; use std::sync::{Arc, Mutex}; use fuel_vm::consts::*; @@ -59,7 +60,7 @@ fn code_coverage() { let receipts = client.transact(tx_script); if let Some(Receipt::ScriptResult { result, .. }) = receipts.last() { - assert!(result.is_success()); + assert!(matches!(result, ScriptExecutionResult::Success)); } else { panic!("Missing result receipt"); } diff --git a/tests/profile_gas.rs b/tests/profile_gas.rs index f0dfbae343..126d552a0a 100644 --- a/tests/profile_gas.rs +++ b/tests/profile_gas.rs @@ -1,3 +1,4 @@ +use fuel_tx::ScriptExecutionResult; use std::sync::{Arc, Mutex}; use fuel_vm::consts::*; @@ -62,14 +63,22 @@ fn profile_gas() { if let Some(Receipt::ScriptResult { result, .. }) = receipts.last() { if count == case_out_of_gas { - assert!(!result.is_success(), "Expected out-of-gas error, got success"); assert!( - matches!(result.reason(), PanicReason::OutOfGas), + !matches!(result, &ScriptExecutionResult::Success), + "Expected out-of-gas error, got success" + ); + let panic_reason = receipts + .iter() + .find_map(Receipt::reason) + .map(|r| *r.reason()) + .expect("Expected a panic reason."); + assert!( + matches!(panic_reason, PanicReason::OutOfGas), "Expected out-of-gas error, got {:?}", - result.reason() + panic_reason ); } else { - assert!(result.is_success()); + matches!(result, &ScriptExecutionResult::Success); } } else { panic!("Missing result receipt"); From b3164803f47d8c8f4a83e4afee8f311d2b6d5832 Mon Sep 17 00:00:00 2001 From: Brandon Kite Date: Wed, 20 Apr 2022 11:38:13 +0200 Subject: [PATCH 2/2] update comment --- src/backtrace.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backtrace.rs b/src/backtrace.rs index a961448416..eae35a794b 100644 --- a/src/backtrace.rs +++ b/src/backtrace.rs @@ -63,7 +63,7 @@ impl Backtrace { self.memory.as_slice() } - /// [`InstructionResult`] of the error that caused this backtrace. + /// [`ScriptExecutionResult`] of the error that caused this backtrace. pub const fn result(&self) -> &ScriptExecutionResult { &self.result }