Skip to content

Commit

Permalink
feat(blockifier): add address and selector for intermediate cairo1 re…
Browse files Browse the repository at this point in the history
…vert errors
  • Loading branch information
dorimedini-starkware committed Oct 20, 2024
1 parent 9932c7b commit 6fd50ef
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 27 deletions.
21 changes: 21 additions & 0 deletions crates/blockifier/src/execution/call_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@ impl CallInfo {
CallInfoIter { call_infos }
}

/// Iterator over the rightmost branch of the callinfo tree rooted at self.
pub fn tail_iter(&self) -> CallInfoTailIter<'_> {
CallInfoTailIter { call_infos: vec![self] }
}

pub fn summarize(&self) -> ExecutionSummary {
let mut executed_class_hashes: HashSet<ClassHash> = HashSet::new();
let mut visited_storage_entries: HashSet<StorageEntry> = HashSet::new();
Expand Down Expand Up @@ -184,3 +189,19 @@ impl<'a> Iterator for CallInfoIter<'a> {
Some(call_info)
}
}

pub struct CallInfoTailIter<'a> {
call_infos: Vec<&'a CallInfo>,
}

impl<'a> Iterator for CallInfoTailIter<'a> {
type Item = &'a CallInfo;

fn next(&mut self) -> Option<Self::Item> {
let call_info = self.call_infos.pop()?;
if let Some(next) = call_info.inner_calls.last() {
self.call_infos.push(next);
}
Some(call_info)
}
}
2 changes: 1 addition & 1 deletion crates/blockifier/src/execution/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ impl From<RunnerError> for PostExecutionError {
pub enum EntryPointExecutionError {
#[error(transparent)]
CairoRunError(#[from] CairoRunError),
#[error("Execution failed. Failure reason: {error_trace}.")]
#[error("Execution failed. Failure reason:\n{error_trace}.")]
ExecutionFailed { error_trace: String },
#[error("Internal error: {0}")]
InternalError(String),
Expand Down
12 changes: 11 additions & 1 deletion crates/blockifier/src/execution/stack_trace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,17 @@ impl ErrorStack {
}

pub fn extract_trailing_cairo1_revert_trace(root_callinfo: &CallInfo) -> String {
format_panic_data(&root_callinfo.execution.retdata.0)
root_callinfo
.tail_iter()
.map(|callinfo| {
format!(
"Error in contract (contract address: {:#064x}, selector: {:#064x}):\n{}",
callinfo.call.storage_address.0.key(),
callinfo.call.entry_point_selector.0,
format_panic_data(&callinfo.execution.retdata.0)
)
})
.join("\n\n")
}

/// Extracts the error trace from a `TransactionExecutionError`. This is a top level function.
Expand Down
91 changes: 68 additions & 23 deletions crates/blockifier/src/execution/stack_trace_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,8 +214,19 @@ An ASSERT_EQ instruction failed: 1 != 0.
"Transaction execution has failed:
0: Error in the called contract (contract address: {account_address_felt:#064x}, class hash: \
{account_contract_hash:#064x}, selector: {execute_selector_felt:#064x}):
Execution failed. Failure reason: (0x6661696c ('fail'), 0x454e545259504f494e545f4641494c4544 \
('ENTRYPOINT_FAILED'), 0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED')).
Execution failed. Failure reason:
Error in contract (contract address: {account_address_felt:#064x}, selector: \
{execute_selector_felt:#064x}):
(0x6661696c ('fail'), 0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED'), \
0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED'))
Error in contract (contract address: {test_contract_address_felt:#064x}, selector: \
{external_entry_point_selector_felt:#064x}):
(0x6661696c ('fail'), 0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED'))
Error in contract (contract address: {test_contract_address_2_felt:#064x}, selector: \
{inner_entry_point_selector_felt:#064x}):
0x6661696c ('fail').
"
);

Expand Down Expand Up @@ -331,9 +342,19 @@ Unknown location (pc=0:{expected_pc1})
"Transaction execution has failed:
0: Error in the called contract (contract address: {account_address_felt:#064x}, class hash: \
{account_contract_hash:#064x}, selector: {execute_selector_felt:#064x}):
Execution failed. Failure reason: ({expected_error}, 0x454e545259504f494e545f4641494c4544 \
('ENTRYPOINT_FAILED'), 0x454e545259504f494e545f4641494c4544 \
('ENTRYPOINT_FAILED')).
Execution failed. Failure reason:
Error in contract (contract address: {account_address_felt:#064x}, selector: \
{execute_selector_felt:#064x}):
({expected_error}, 0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED'), \
0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED'))
Error in contract (contract address: {contract_address_felt:#064x}, selector: \
{invoke_call_chain_selector_felt:#064x}):
({expected_error}, 0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED'))
Error in contract (contract address: {contract_address_felt:#064x}, selector: \
{invoke_call_chain_selector_felt:#064x}):
{expected_error}.
"
)
}
Expand Down Expand Up @@ -479,10 +500,25 @@ Unknown location (pc=0:{expected_pc3})
"Transaction execution has failed:
0: Error in the called contract (contract address: {account_address_felt:#064x}, class hash: \
{account_contract_hash:#064x}, selector: {execute_selector_felt:#064x}):
Execution failed. Failure reason: ({expected_error}, 0x454e545259504f494e545f4641494c4544 \
('ENTRYPOINT_FAILED'), 0x454e545259504f494e545f4641494c4544 \
('ENTRYPOINT_FAILED'), 0x454e545259504f494e545f4641494c4544 \
('ENTRYPOINT_FAILED')).
Execution failed. Failure reason:
Error in contract (contract address: {account_address_felt:#064x}, selector: \
{execute_selector_felt:#064x}):
({expected_error}, 0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED'), \
0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED'), \
0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED'))
Error in contract (contract address: {address_felt:#064x}, selector: \
{invoke_call_chain_selector_felt:#064x}):
({expected_error}, 0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED'), \
0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED'))
Error in contract (contract address: {address_felt:#064x}, selector: \
{invoke_call_chain_selector_felt:#064x}):
({expected_error}, 0x454e545259504f494e545f4641494c4544 ('ENTRYPOINT_FAILED'))
Error in contract (contract address: {address_felt:#064x}, selector: \
{last_func_selector_felt:#064x}):
{expected_error}.
"
)
}
Expand Down Expand Up @@ -579,9 +615,11 @@ An ASSERT_EQ instruction failed: 1 != 0.
",
class_hash.0
),
CairoVersion::Cairo1 => "The `validate` entry point panicked with \
0x496e76616c6964207363656e6172696f ('Invalid scenario')."
.into(),
CairoVersion::Cairo1 => format!(
"The `validate` entry point panicked with:
Error in contract (contract address: {contract_address:#064x}, selector: {selector:#064x}):
0x496e76616c6964207363656e6172696f ('Invalid scenario')."
),
};

// Clean pc locations from the trace.
Expand Down Expand Up @@ -634,22 +672,26 @@ fn test_account_ctor_frame_stack_trace(
hash: {:#064x}, selector: {expected_selector:#064x}):
",
class_hash.0
) + match cairo_version {
CairoVersion::Cairo0 => {
"Error at pc=0:223:
)
.to_string()
+ &match cairo_version {
CairoVersion::Cairo0 => "Error at pc=0:223:
Cairo traceback (most recent call last):
Unknown location (pc=0:195)
Unknown location (pc=0:179)
An ASSERT_EQ instruction failed: 1 != 0.
"
}
CairoVersion::Cairo1 => {
"Execution failed. Failure reason: 0x496e76616c6964207363656e6172696f ('Invalid \
scenario').
.to_string(),
CairoVersion::Cairo1 => format!(
"Execution failed. Failure reason:
Error in contract (contract address: {expected_address:#064x}, selector: \
{expected_selector:#064x}):
0x496e76616c6964207363656e6172696f ('Invalid scenario').
"
}
};
)
.to_string(),
};

// Compare expected and actual error.
let error = deploy_account_tx.execute(state, &block_context, true, true).unwrap_err();
Expand Down Expand Up @@ -775,10 +817,13 @@ Error at pc=0:{}:
{frame_1}
Error at pc=0:{}:
{frame_2}
Execution failed. Failure reason: 0x496e76616c6964207363656e6172696f ('Invalid scenario').
Execution failed. Failure reason:
Error in contract (contract address: {expected_address:#064x}, selector: {:#064x}):
0x496e76616c6964207363656e6172696f ('Invalid scenario').
",
execute_offset + 205,
deploy_offset + 194
deploy_offset + 194,
ctor_selector.0
)
}
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use cairo_lang_utils::byte_array::BYTE_ARRAY_MAGIC;
use starknet_api::core::{ContractAddress, EntryPointSelector};
use starknet_types_core::felt::Felt;

use crate::execution::call_info::{CallExecution, CallInfo, Retdata};
Expand Down Expand Up @@ -29,5 +30,14 @@ fn test_syscall_failure_format() {
let error = EntryPointExecutionError::ExecutionFailed {
error_trace: extract_trailing_cairo1_revert_trace(&callinfo),
};
assert_eq!(error.to_string(), "Execution failed. Failure reason: \"Execution failure\".");
assert_eq!(
error.to_string(),
format!(
"Execution failed. Failure reason:
Error in contract (contract address: {:#064x}, selector: {:#064x}):
\"Execution failure\".",
ContractAddress::default().0.key(),
EntryPointSelector::default().0
)
);
}
2 changes: 1 addition & 1 deletion crates/blockifier/src/transaction/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ pub enum TransactionExecutionError {
FeeCheckError(#[from] FeeCheckError),
#[error(transparent)]
FromStr(#[from] FromStrError),
#[error("The `validate` entry point panicked with {panic_reason}.")]
#[error("The `validate` entry point panicked with:\n{panic_reason}.")]
PanicInValidate { panic_reason: String },
#[error("The `validate` entry point should return `VALID`. Got {actual:?}.")]
InvalidValidateReturnData { actual: Retdata },
Expand Down

0 comments on commit 6fd50ef

Please sign in to comment.