From 2da31fc468a08a75c05c692ca57d0893e5f10b0d Mon Sep 17 00:00:00 2001 From: Lior Goldberg Date: Mon, 3 Mar 2025 16:25:09 +0200 Subject: [PATCH] feat(blockifier): version bound accounts: add max tip --- ...blockifier_versioned_constants_0_13_0.json | 3 +- ...blockifier_versioned_constants_0_13_1.json | 3 +- ...ockifier_versioned_constants_0_13_1_1.json | 3 +- ...blockifier_versioned_constants_0_13_2.json | 3 +- ...ockifier_versioned_constants_0_13_2_1.json | 3 +- ...blockifier_versioned_constants_0_13_3.json | 3 +- ...blockifier_versioned_constants_0_13_4.json | 3 +- ...blockifier_versioned_constants_0_14_0.json | 3 +- .../src/blockifier_versioned_constants.rs | 6 ++- .../deprecated_syscalls_test.rs | 22 ++++---- .../deprecated_syscalls/hint_processor.rs | 19 +++++-- .../src/execution/syscalls/syscall_base.rs | 21 +++++--- .../syscall_tests/get_execution_info.rs | 53 +++++++++++++++---- .../src/versioned_constants_test.rs | 11 ++-- 14 files changed, 112 insertions(+), 44 deletions(-) diff --git a/crates/blockifier/resources/blockifier_versioned_constants_0_13_0.json b/crates/blockifier/resources/blockifier_versioned_constants_0_13_0.json index 5da07c2df40..9b7fba41b5f 100644 --- a/crates/blockifier/resources/blockifier_versioned_constants_0_13_0.json +++ b/crates/blockifier/resources/blockifier_versioned_constants_0_13_0.json @@ -218,7 +218,8 @@ } }, "v1_bound_accounts_cairo0": [], - "v1_bound_accounts_cairo1": [] + "v1_bound_accounts_cairo1": [], + "v1_bound_accounts_max_tip": "0x0" }, "os_resources": { "execute_syscalls": { diff --git a/crates/blockifier/resources/blockifier_versioned_constants_0_13_1.json b/crates/blockifier/resources/blockifier_versioned_constants_0_13_1.json index ecbcf1c2f64..97ae138a26b 100644 --- a/crates/blockifier/resources/blockifier_versioned_constants_0_13_1.json +++ b/crates/blockifier/resources/blockifier_versioned_constants_0_13_1.json @@ -224,7 +224,8 @@ } }, "v1_bound_accounts_cairo0": [], - "v1_bound_accounts_cairo1": [] + "v1_bound_accounts_cairo1": [], + "v1_bound_accounts_max_tip": "0x0" }, "os_resources": { "execute_syscalls": { diff --git a/crates/blockifier/resources/blockifier_versioned_constants_0_13_1_1.json b/crates/blockifier/resources/blockifier_versioned_constants_0_13_1_1.json index a8b0b0a514d..363de30a9fa 100644 --- a/crates/blockifier/resources/blockifier_versioned_constants_0_13_1_1.json +++ b/crates/blockifier/resources/blockifier_versioned_constants_0_13_1_1.json @@ -224,7 +224,8 @@ } }, "v1_bound_accounts_cairo0": [], - "v1_bound_accounts_cairo1": [] + "v1_bound_accounts_cairo1": [], + "v1_bound_accounts_max_tip": "0x0" }, "os_resources": { "execute_syscalls": { diff --git a/crates/blockifier/resources/blockifier_versioned_constants_0_13_2.json b/crates/blockifier/resources/blockifier_versioned_constants_0_13_2.json index 0c0b29d4d54..65620489cab 100644 --- a/crates/blockifier/resources/blockifier_versioned_constants_0_13_2.json +++ b/crates/blockifier/resources/blockifier_versioned_constants_0_13_2.json @@ -225,7 +225,8 @@ } }, "v1_bound_accounts_cairo0": [], - "v1_bound_accounts_cairo1": [] + "v1_bound_accounts_cairo1": [], + "v1_bound_accounts_max_tip": "0x0" }, "os_resources": { "execute_syscalls": { diff --git a/crates/blockifier/resources/blockifier_versioned_constants_0_13_2_1.json b/crates/blockifier/resources/blockifier_versioned_constants_0_13_2_1.json index 9ea1122861d..2cb690fa96f 100644 --- a/crates/blockifier/resources/blockifier_versioned_constants_0_13_2_1.json +++ b/crates/blockifier/resources/blockifier_versioned_constants_0_13_2_1.json @@ -225,7 +225,8 @@ } }, "v1_bound_accounts_cairo0": [], - "v1_bound_accounts_cairo1": [] + "v1_bound_accounts_cairo1": [], + "v1_bound_accounts_max_tip": "0x0" }, "os_resources": { "execute_syscalls": { diff --git a/crates/blockifier/resources/blockifier_versioned_constants_0_13_3.json b/crates/blockifier/resources/blockifier_versioned_constants_0_13_3.json index 9ea1122861d..2cb690fa96f 100644 --- a/crates/blockifier/resources/blockifier_versioned_constants_0_13_3.json +++ b/crates/blockifier/resources/blockifier_versioned_constants_0_13_3.json @@ -225,7 +225,8 @@ } }, "v1_bound_accounts_cairo0": [], - "v1_bound_accounts_cairo1": [] + "v1_bound_accounts_cairo1": [], + "v1_bound_accounts_max_tip": "0x0" }, "os_resources": { "execute_syscalls": { diff --git a/crates/blockifier/resources/blockifier_versioned_constants_0_13_4.json b/crates/blockifier/resources/blockifier_versioned_constants_0_13_4.json index dda32a1159a..5e14db6400e 100644 --- a/crates/blockifier/resources/blockifier_versioned_constants_0_13_4.json +++ b/crates/blockifier/resources/blockifier_versioned_constants_0_13_4.json @@ -119,7 +119,8 @@ }, "validated": "VALID", "v1_bound_accounts_cairo0": [], - "v1_bound_accounts_cairo1": [] + "v1_bound_accounts_cairo1": [], + "v1_bound_accounts_max_tip": "0x0" }, "os_resources": { "execute_syscalls": { diff --git a/crates/blockifier/resources/blockifier_versioned_constants_0_14_0.json b/crates/blockifier/resources/blockifier_versioned_constants_0_14_0.json index 6eaa986c969..5a2c6cc792a 100644 --- a/crates/blockifier/resources/blockifier_versioned_constants_0_14_0.json +++ b/crates/blockifier/resources/blockifier_versioned_constants_0_14_0.json @@ -123,7 +123,8 @@ ], "v1_bound_accounts_cairo1": [ "0x04c6d6cf894f8bc96bb9c525e6853e5483177841f7388f74a46cfda6f028c755" - ] + ], + "v1_bound_accounts_max_tip": "0x1000" }, "os_resources": { "execute_syscalls": { diff --git a/crates/blockifier/src/blockifier_versioned_constants.rs b/crates/blockifier/src/blockifier_versioned_constants.rs index ada90e7be7c..35efe0315f0 100644 --- a/crates/blockifier/src/blockifier_versioned_constants.rs +++ b/crates/blockifier/src/blockifier_versioned_constants.rs @@ -19,7 +19,7 @@ use starknet_api::contract_class::SierraVersion; use starknet_api::core::{ClassHash, ContractAddress}; use starknet_api::define_versioned_constants; use starknet_api::execution_resources::{GasAmount, GasVector}; -use starknet_api::transaction::fields::GasVectorComputationMode; +use starknet_api::transaction::fields::{GasVectorComputationMode, Tip}; use strum::IntoEnumIterator; use thiserror::Error; @@ -790,6 +790,7 @@ pub struct OsConstants { pub execute_max_sierra_gas: GasAmount, pub v1_bound_accounts_cairo0: Vec, pub v1_bound_accounts_cairo1: Vec, + pub v1_bound_accounts_max_tip: Tip, } impl OsConstants { @@ -876,6 +877,7 @@ impl TryFrom for OsConstants { )?); let v1_bound_accounts_cairo0 = raw_json_data.v1_bound_accounts_cairo0; let v1_bound_accounts_cairo1 = raw_json_data.v1_bound_accounts_cairo1; + let v1_bound_accounts_max_tip = raw_json_data.v1_bound_accounts_max_tip; let os_constants = OsConstants { gas_costs, validate_rounding_consts, @@ -884,6 +886,7 @@ impl TryFrom for OsConstants { execute_max_sierra_gas, v1_bound_accounts_cairo0, v1_bound_accounts_cairo1, + v1_bound_accounts_max_tip, }; Ok(os_constants) } @@ -926,6 +929,7 @@ struct OsConstantsRawJson { os_contract_addresses: OsContractAddresses, v1_bound_accounts_cairo0: Vec, v1_bound_accounts_cairo1: Vec, + v1_bound_accounts_max_tip: Tip, } impl OsConstantsRawJson { diff --git a/crates/blockifier/src/execution/deprecated_syscalls/deprecated_syscalls_test.rs b/crates/blockifier/src/execution/deprecated_syscalls/deprecated_syscalls_test.rs index d02e2ab791a..af14021f75e 100644 --- a/crates/blockifier/src/execution/deprecated_syscalls/deprecated_syscalls_test.rs +++ b/crates/blockifier/src/execution/deprecated_syscalls/deprecated_syscalls_test.rs @@ -17,7 +17,7 @@ use starknet_api::test_utils::{ CURRENT_BLOCK_TIMESTAMP_FOR_VALIDATE, TEST_SEQUENCER_ADDRESS, }; -use starknet_api::transaction::fields::{Calldata, ContractAddressSalt, Fee}; +use starknet_api::transaction::fields::{Calldata, ContractAddressSalt, Fee, Tip}; use starknet_api::transaction::{ EventContent, EventData, @@ -45,11 +45,7 @@ use crate::test_utils::{ get_syscall_resources, trivial_external_entry_point_new, }; -use crate::transaction::objects::{ - CommonAccountFields, - DeprecatedTransactionInfo, - TransactionInfo, -}; +use crate::transaction::objects::{CommonAccountFields, CurrentTransactionInfo, TransactionInfo}; use crate::{check_entry_point_execution_error_for_custom_hint, retdata}; #[test] @@ -466,6 +462,8 @@ fn test_block_info_syscalls( fn test_tx_info( #[values(false, true)] only_query: bool, #[values(false, true)] v1_bound_account: bool, + // Whether the tip is larger than `v1_bound_accounts_max_tip`. + #[values(false, true)] high_tip: bool, ) { let test_contract = FeatureContract::TestContract(CairoVersion::Cairo0); let mut test_contract_data: FeatureContractData = test_contract.into(); @@ -479,7 +477,7 @@ fn test_tx_info( let mut state = test_state_ex(&ChainInfo::create_for_testing(), Fee(0), &[(test_contract_data, 1)]); let mut version = felt!(3_u8); - let mut expected_version = if v1_bound_account { felt!(1_u8) } else { version }; + let mut expected_version = if v1_bound_account && !high_tip { felt!(1_u8) } else { version }; if only_query { let simulate_version_base = *QUERY_VERSION_BASE; version += simulate_version_base; @@ -503,7 +501,12 @@ fn test_tx_info( calldata: expected_tx_info, ..trivial_external_entry_point_new(test_contract) }; - let tx_info = TransactionInfo::Deprecated(DeprecatedTransactionInfo { + + // Transaction tip. + let tip = Tip(VersionedConstants::latest_constants().os_constants.v1_bound_accounts_max_tip.0 + + if high_tip { 1 } else { 0 }); + + let tx_info = TransactionInfo::Current(CurrentTransactionInfo { common_fields: CommonAccountFields { transaction_hash: tx_hash, version: TransactionVersion::THREE, @@ -512,7 +515,8 @@ fn test_tx_info( only_query, ..Default::default() }, - max_fee, + tip, + ..CurrentTransactionInfo::create_for_testing() }); let limit_steps_by_resources = false; // Do not limit steps by resources as we use default reasources. let result = entry_point_call diff --git a/crates/blockifier/src/execution/deprecated_syscalls/hint_processor.rs b/crates/blockifier/src/execution/deprecated_syscalls/hint_processor.rs index a193665b6b6..99d77cc15d7 100644 --- a/crates/blockifier/src/execution/deprecated_syscalls/hint_processor.rs +++ b/crates/blockifier/src/execution/deprecated_syscalls/hint_processor.rs @@ -72,6 +72,7 @@ use crate::execution::hint_code; use crate::execution::syscalls::hint_processor::{EmitEventError, SyscallUsageMap}; use crate::state::errors::StateError; use crate::state::state_api::State; +use crate::transaction::objects::TransactionInfo; #[derive(Debug, Error)] pub enum DeprecatedSyscallExecutionError { @@ -332,11 +333,19 @@ impl<'a> DeprecatedSyscallHintProcessor<'a> { // the syscall should return transaction version 1 instead. // In such a case, `self.tx_info_start_ptr` is not used. if version == TransactionVersion::THREE && v1_bound_accounts.contains(&self.class_hash) { - let modified_version = signed_tx_version( - &TransactionVersion::ONE, - &TransactionOptions { only_query: tx_context.tx_info.only_query() }, - ); - return self.allocate_tx_info_segment(vm, Some(modified_version)); + let tip = match &tx_context.tx_info { + TransactionInfo::Current(transaction_info) => transaction_info.tip, + TransactionInfo::Deprecated(_) => { + panic!("Transaction info variant doesn't match transaction version") + } + }; + if tip <= versioned_constants.os_constants.v1_bound_accounts_max_tip { + let modified_version = signed_tx_version( + &TransactionVersion::ONE, + &TransactionOptions { only_query: tx_context.tx_info.only_query() }, + ); + return self.allocate_tx_info_segment(vm, Some(modified_version)); + } } match self.tx_info_start_ptr { diff --git a/crates/blockifier/src/execution/syscalls/syscall_base.rs b/crates/blockifier/src/execution/syscalls/syscall_base.rs index 459469b06c1..32c2169810a 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_base.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_base.rs @@ -40,6 +40,7 @@ use crate::execution::syscalls::hint_processor::{ }; use crate::state::state_api::State; use crate::transaction::account_transaction::is_cairo1; +use crate::transaction::objects::TransactionInfo; pub type SyscallResult = Result; pub const KECCAK_FULL_RATE_IN_WORDS: usize = 17; @@ -195,13 +196,21 @@ impl<'state> SyscallHandlerBase<'state> { // If the transaction version is 3 and the account is in the v1-bound-accounts set, // the syscall should return transaction version 1 instead. if version == TransactionVersion::THREE && v1_bound_accounts.contains(class_hash) { - signed_tx_version( - &TransactionVersion::ONE, - &TransactionOptions { only_query: tx_context.tx_info.only_query() }, - ) - } else { - tx_context.tx_info.signed_version() + let tip = match &tx_context.tx_info { + TransactionInfo::Current(transaction_info) => transaction_info.tip, + TransactionInfo::Deprecated(_) => { + panic!("Transaction info variant doesn't match transaction version") + } + }; + if tip <= versioned_constants.os_constants.v1_bound_accounts_max_tip { + return signed_tx_version( + &TransactionVersion::ONE, + &TransactionOptions { only_query: tx_context.tx_info.only_query() }, + ); + } } + + tx_context.tx_info.signed_version() } pub fn emit_event(&mut self, event: EventContent) -> SyscallResult<()> { diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/get_execution_info.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/get_execution_info.rs index d1a9879eb71..7cb8aebf941 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/get_execution_info.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/get_execution_info.rs @@ -48,6 +48,7 @@ use crate::transaction::objects::{ ExecutionMode::Validate, TransactionVersion::ONE, false, + false, false; "Native: Validate execution mode: block info fields should be zeroed. Transaction V1." ) @@ -59,6 +60,7 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::ONE, false, + false, false; "Native: Execute execution mode: block info should be as usual. Transaction V1." ) @@ -70,6 +72,7 @@ use crate::transaction::objects::{ ExecutionMode::Validate, TransactionVersion::THREE, false, + false, false; "Native: Validate execution mode: block info fields should be zeroed. Transaction V3." ) @@ -81,6 +84,7 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::THREE, false, + false, false; "Native: Execute execution mode: block info should be as usual. Transaction V3." ) @@ -92,6 +96,7 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::ONE, false, + false, false; "Native: Legacy contract. Execute execution mode: block info should be as usual. Transaction V1." @@ -104,6 +109,7 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::THREE, false, + false, false; "Native: Legacy contract. Execute execution mode: block info should be as usual. Transaction V3." @@ -116,6 +122,7 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::THREE, true, + false, false; "Native: Execute execution mode: block info should be as usual. Transaction V3. Query" ) @@ -127,7 +134,8 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::THREE, false, - true; + true, + false; "Native: V1 bound account: execute" ) )] @@ -138,7 +146,8 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::THREE, true, - true; + true, + false; "Native: V1 bound account: query" ) )] @@ -147,6 +156,7 @@ use crate::transaction::objects::{ ExecutionMode::Validate, TransactionVersion::ONE, false, + false, false; "Validate execution mode: block info fields should be zeroed. Transaction V1.")] #[test_case( @@ -154,6 +164,7 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::ONE, false, + false, false; "Execute execution mode: block info should be as usual. Transaction V1.")] #[test_case( @@ -161,6 +172,7 @@ use crate::transaction::objects::{ ExecutionMode::Validate, TransactionVersion::THREE, false, + false, false; "Validate execution mode: block info fields should be zeroed. Transaction V3.")] #[test_case( @@ -168,6 +180,7 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::THREE, false, + false, false; "Execute execution mode: block info should be as usual. Transaction V3.")] #[test_case( @@ -175,6 +188,7 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::ONE, false, + false, false; "Legacy contract. Execute execution mode: block info should be as usual. Transaction V1.")] #[test_case( @@ -182,6 +196,7 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::THREE, false, + false, false; "Legacy contract. Execute execution mode: block info should be as usual. Transaction V3.")] #[test_case( @@ -189,6 +204,7 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::THREE, true, + false, false; "Execute execution mode: block info should be as usual. Transaction V3. Query.")] #[test_case( @@ -196,14 +212,24 @@ use crate::transaction::objects::{ ExecutionMode::Execute, TransactionVersion::THREE, false, - true; + true, + false; "V1 bound account: execute")] #[test_case( FeatureContract::TestContract(CairoVersion::Cairo1(RunnableCairo1::Casm)), ExecutionMode::Execute, TransactionVersion::THREE, + false, true, true; + "V1 bound account: execute, high tip")] +#[test_case( + FeatureContract::TestContract(CairoVersion::Cairo1(RunnableCairo1::Casm)), + ExecutionMode::Execute, + TransactionVersion::THREE, + true, + true, + false; "V1 bound account: query")] fn test_get_execution_info( test_contract: FeatureContract, @@ -211,6 +237,8 @@ fn test_get_execution_info( mut version: TransactionVersion, only_query: bool, v1_bound_account: bool, + // Whether the tip is larger than `v1_bound_accounts_max_tip`. + high_tip: bool, ) { let mut test_contract_data: FeatureContractData = test_contract.into(); if v1_bound_account { @@ -238,6 +266,11 @@ fn test_get_execution_info( let test_contract_address = test_contract.get_instance_address(0); + // Transaction tip. + let tip = Tip(VersionedConstants::latest_constants().os_constants.v1_bound_accounts_max_tip.0 + + if high_tip { 1 } else { 0 }); + let expected_tip = if version == TransactionVersion::THREE { tip } else { Tip(0) }; + let expected_unsupported_fields = match test_contract { FeatureContract::LegacyTestContract => { // Read and parse file content. @@ -257,16 +290,16 @@ fn test_get_execution_info( } _ => { vec![ - Felt::ZERO, // Tip. - Felt::ZERO, // Paymaster data. - Felt::ZERO, // Nonce DA. - Felt::ZERO, // Fee DA. - Felt::ZERO, // Account data. + expected_tip.into(), // Tip. + Felt::ZERO, // Paymaster data. + Felt::ZERO, // Nonce DA. + Felt::ZERO, // Fee DA. + Felt::ZERO, // Account data. ] } }; - let mut expected_version = if v1_bound_account { 1.into() } else { version.0 }; + let mut expected_version = if v1_bound_account && !high_tip { 1.into() } else { version.0 }; if only_query { let simulate_version_base = *QUERY_VERSION_BASE; let query_version = simulate_version_base + version.0; @@ -348,7 +381,7 @@ fn test_get_execution_info( max_amount, max_price_per_unit, }), - tip: Tip::default(), + tip, nonce_data_availability_mode: DataAvailabilityMode::L1, fee_data_availability_mode: DataAvailabilityMode::L1, paymaster_data: PaymasterData::default(), diff --git a/crates/blockifier/src/versioned_constants_test.rs b/crates/blockifier/src/versioned_constants_test.rs index 88caa1f4722..0c17495cb7b 100644 --- a/crates/blockifier/src/versioned_constants_test.rs +++ b/crates/blockifier/src/versioned_constants_test.rs @@ -86,14 +86,15 @@ fn test_string_inside_composed_field() { fn check_constants_serde_error(json_data: &str, expected_error_message: &str) { let mut json_data_raw: IndexMap = serde_json::from_str(json_data).unwrap(); - json_data_raw.insert("validate_block_number_rounding".to_string(), 0.into()); - json_data_raw.insert("validate_timestamp_rounding".to_string(), 0.into()); + json_data_raw.insert("validate_block_number_rounding".into(), 0.into()); + json_data_raw.insert("validate_timestamp_rounding".into(), 0.into()); json_data_raw.insert( - "os_contract_addresses".to_string(), + "os_contract_addresses".into(), serde_json::to_value(OsContractAddresses::default()).unwrap(), ); - json_data_raw.insert("v1_bound_accounts_cairo0".to_string(), serde_json::Value::Array(vec![])); - json_data_raw.insert("v1_bound_accounts_cairo1".to_string(), serde_json::Value::Array(vec![])); + json_data_raw.insert("v1_bound_accounts_cairo0".into(), serde_json::Value::Array(vec![])); + json_data_raw.insert("v1_bound_accounts_cairo1".into(), serde_json::Value::Array(vec![])); + json_data_raw.insert("v1_bound_accounts_max_tip".into(), "0x0".into()); let json_data = &serde_json::to_string(&json_data_raw).unwrap();