From c22eb569a94e747f3ed80b428b0954e7c40d7a35 Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 18 Oct 2023 14:10:08 -0300 Subject: [PATCH 01/54] Add test case --- rpc_state_reader/tests/sir_tests.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 9cb71fe22..c2ed6b9d6 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -277,6 +277,11 @@ fn test_get_gas_price() { 317092, // real block 317093 RpcChain::MainNet )] +#[test_case( + "0x1cbc74e101a1533082a021ce53235cfd744899b0ff948d1949a64646e0f15c2", + 885298, // real block 885299 + RpcChain::MainNet +)] fn starknet_in_rust_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); From 855d51642eb197c226af46558ef86eb914d3c4d5 Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 18 Oct 2023 18:15:30 -0300 Subject: [PATCH 02/54] Fix get_onchain_data_segment_length --- src/definitions/constants.rs | 2 +- src/execution/gas_usage.rs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/definitions/constants.rs b/src/definitions/constants.rs index 85d4f9d69..22be16e6c 100644 --- a/src/definitions/constants.rs +++ b/src/definitions/constants.rs @@ -7,7 +7,7 @@ use std::collections::HashMap; pub(crate) const L2_TO_L1_MSG_HEADER_SIZE: usize = 3; pub(crate) const L1_TO_L2_MSG_HEADER_SIZE: usize = 5; -pub(crate) const DEPLOYMENT_INFO_SIZE: usize = 2; +pub(crate) const DEPLOYMENT_INFO_SIZE: usize = 1; pub(crate) const CONSUMED_MSG_TO_L2_N_TOPICS: usize = 3; pub(crate) const LOG_MSG_TO_L1_N_TOPICS: usize = 2; pub(crate) const N_DEFAULT_TOPICS: usize = 1; // Events have one default topic. diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index f0d254dc7..8a67ce9e9 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -110,7 +110,9 @@ pub const fn get_onchain_data_segment_length( n_storage_changes: usize, n_deployments: usize, ) -> usize { - n_modified_contracts * 2 + n_storage_changes * 2 + n_deployments * DEPLOYMENT_INFO_SIZE + n_modified_contracts * 2 + + n_deployments * DEPLOYMENT_INFO_SIZE + + n_storage_changes * 2 } /// Calculates the cost of ConsumedMessageToL2 event emissions caused by an L1 handler with the given From d163fdb45bff9989f8ac25f24cf6f176decfabc2 Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 18 Oct 2023 18:23:53 -0300 Subject: [PATCH 03/54] Debug setup --- Cargo.lock | 2 - a.txt | 95 ++++++++++++++ rpc_state_reader/Cargo.toml | 2 +- rpc_state_reader/a.txt | 11 ++ rpc_state_reader/src/rpc_state.rs | 6 +- rpc_state_reader/src/utils.rs | 5 + rpc_state_reader/t.txt | 25 ++++ rpc_state_reader/tests/blockifier_tests.rs | 56 +------- rpc_state_reader/tests/sir_tests.rs | 142 +++++++++++---------- src/execution/gas_usage.rs | 5 +- src/state/cached_state.rs | 5 + src/transaction/deploy_account.rs | 41 +++++- src/transaction/fee.rs | 1 + src/transaction/mod.rs | 1 + src/utils.rs | 4 + 15 files changed, 273 insertions(+), 128 deletions(-) create mode 100644 a.txt create mode 100644 rpc_state_reader/a.txt create mode 100644 rpc_state_reader/t.txt diff --git a/Cargo.lock b/Cargo.lock index 0a838e946..3333df779 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -726,8 +726,6 @@ dependencies = [ [[package]] name = "blockifier" version = "0.2.0-rc0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb4d375ae4ea55963350f296c9c22f245ceff91e7c9edcd61320792901b783f" dependencies = [ "ark-ff", "ark-secp256k1", diff --git a/a.txt b/a.txt new file mode 100644 index 000000000..5df2f0968 --- /dev/null +++ b/a.txt @@ -0,0 +1,95 @@ + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 174 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 27 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 13 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 28 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 20 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.00s + diff --git a/rpc_state_reader/Cargo.toml b/rpc_state_reader/Cargo.toml index 0cdbbf8ef..e99d0147a 100644 --- a/rpc_state_reader/Cargo.toml +++ b/rpc_state_reader/Cargo.toml @@ -21,7 +21,7 @@ flate2 = "1.0.25" serde_with = "3.0.0" dotenv = "0.15.0" cairo-vm = "0.8.5" -blockifier = "=0.2.0-rc0" +blockifier = { path = "../../blockifier/crates/blockifier"} starknet_in_rust = { path = "../", version = "0.4.0" } [dev-dependencies] diff --git a/rpc_state_reader/a.txt b/rpc_state_reader/a.txt new file mode 100644 index 000000000..010be8bb4 --- /dev/null +++ b/rpc_state_reader/a.txt @@ -0,0 +1,11 @@ + +running 1 test +test transaction_tests::test_invoke_mainnet_0x06da92cfbdceac5e5e94a1f40772d6c79d34f011815606742658559ec77b6955 ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 14 filtered out; finished in 37.99s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + diff --git a/rpc_state_reader/src/rpc_state.rs b/rpc_state_reader/src/rpc_state.rs index 8401a897b..92b86638e 100644 --- a/rpc_state_reader/src/rpc_state.rs +++ b/rpc_state_reader/src/rpc_state.rs @@ -418,7 +418,7 @@ impl RpcState { contract_address.0.key().clone().to_string() ]), ) - .unwrap(); + .unwrap_or_default(); ClassHash(hash) } @@ -431,7 +431,7 @@ impl RpcState { contract_address.0.key().clone().to_string() ]), ) - .unwrap() + .unwrap_or_default() } pub fn get_storage_at( @@ -450,7 +450,7 @@ impl RpcState { self.block.to_value().unwrap() ]), ) - .unwrap() + .unwrap_or_default() } /// Requests the given transaction to the Feeder Gateway API. diff --git a/rpc_state_reader/src/utils.rs b/rpc_state_reader/src/utils.rs index a56d9f3b7..437f80b2c 100644 --- a/rpc_state_reader/src/utils.rs +++ b/rpc_state_reader/src/utils.rs @@ -82,6 +82,11 @@ pub fn deserialize_transaction_json( "unimplemented invoke version: {x}" ))), }, + "DEPLOY_ACCOUNT" => { + Ok(Transaction::DeployAccount( + serde_json::from_value(transaction)?, + )) + } x => Err(serde::de::Error::custom(format!( "unimplemented transaction type deserialization: {x}" ))), diff --git a/rpc_state_reader/t.txt b/rpc_state_reader/t.txt new file mode 100644 index 000000000..57d08dd57 --- /dev/null +++ b/rpc_state_reader/t.txt @@ -0,0 +1,25 @@ + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 13 filtered out; finished in 0.00s + + +running 1 test + SIR internal_calls[0][0].len() = 1 + SIR internal_calls[0][1].len() = 1 + SNT internal_calls[0][0].len() = 1 + SNT internal_calls[0][1].len() = 1 +test starknet_in_rust_test_case_tx::_0x6817103c032c1ca43fa503422ced5dd9f97733522f95f778cd4daed36ab78e6_316719_rpcchain_mainnet_expects ... FAILED + +failures: + +failures: + starknet_in_rust_test_case_tx::_0x6817103c032c1ca43fa503422ced5dd9f97733522f95f778cd4daed36ab78e6_316719_rpcchain_mainnet_expects + +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 8 filtered out; finished in 43.02s + diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index a32139934..d6533e842 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -7,7 +7,7 @@ use blockifier::{ }, transaction::{ account_transaction::AccountTransaction, objects::TransactionExecutionInfo, - transactions::ExecutableTransaction, + transactions::{ExecutableTransaction, DeployAccountTransaction}, }, }; use blockifier::{ @@ -19,7 +19,7 @@ use blockifier::{ use cairo_lang_starknet::{ casm_contract_class::CasmContractClass, contract_class::ContractClass as SierraContractClass, }; -use cairo_vm::types::program::Program; +use cairo_vm::{types::program::Program, felt::felt_str}; use pretty_assertions_sorted::{assert_eq, assert_eq_sorted}; use rpc_state_reader::rpc_state::*; use rpc_state_reader::utils; @@ -176,6 +176,7 @@ pub fn execute_tx( let invoke = InvokeTransaction { tx, tx_hash }; AccountTransaction::Invoke(invoke) } + SNTransaction::DeployAccount(tx) =>AccountTransaction::DeployAccount(DeployAccountTransaction { tx, tx_hash, contract_address: ContractAddress(StarkHash::new(felt_str!("1358183270800653661466375915013911001148965821491018888567169956392292310604").to_be_bytes()).unwrap().try_into().unwrap()) }), _ => unimplemented!(), }; @@ -236,55 +237,10 @@ fn blockifier_test_recent_tx() { .len() ); } - -#[test_case( - "0x014640564509873cf9d24a311e1207040c8b60efd38d96caef79855f0b0075d5", - 90006, - RpcChain::MainNet - => ignore["old transaction, gas mismatch"] -)] -#[test_case( - "0x025844447697eb7d5df4d8268b23aef6c11de4087936048278c2559fc35549eb", - 197000, - RpcChain::MainNet -)] -#[test_case( - "0x00164bfc80755f62de97ae7c98c9d67c1767259427bcf4ccfcc9683d44d54676", - 197000, - RpcChain::MainNet -)] -#[test_case( - "0x05d200ef175ba15d676a68b36f7a7b72c17c17604eda4c1efc2ed5e4973e2c91", - 169928, // real block 169929 - RpcChain::MainNet -)] #[test_case( - "0x0528ec457cf8757f3eefdf3f0728ed09feeecc50fd97b1e4c5da94e27e9aa1d6", - 169928, // real block 169929 - RpcChain::MainNet -)] -#[test_case( - "0x0737677385a30ec4cbf9f6d23e74479926975b74db3d55dc5e46f4f8efee41cf", - 169928, // real block 169929 - RpcChain::MainNet - => ignore["resource mismatch"] -)] -#[test_case( - "0x026c17728b9cd08a061b1f17f08034eb70df58c1a96421e73ee6738ad258a94c", - 169928, // real block 169929 - RpcChain::MainNet -)] -#[test_case( - // review later - "0x0743092843086fa6d7f4a296a226ee23766b8acf16728aef7195ce5414dc4d84", - 186548, // real block 186549 - RpcChain::MainNet - => ignore["resource mismatch"] -)] -#[test_case( - "0x00724fc4a84f489ed032ebccebfc9541eb8dc64b0e76b933ed6fc30cd6000bd1", - 186551, // real block 186552 - RpcChain::MainNet + "0x1cbc74e101a1533082a021ce53235cfd744899b0ff948d1949a64646e0f15c2", + 885298, // real block 885299 + RpcChain::TestNet )] fn blockifier_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index c2ed6b9d6..abc4c6d3c 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use cairo_vm::felt::{felt_str, Felt252}; +use cairo_vm::{felt::{felt_str, Felt252}, vm::errors::vm_errors::VirtualMachineError}; use pretty_assertions_sorted::{assert_eq, assert_eq_sorted}; use starknet_api::{ block::BlockNumber, @@ -28,7 +28,7 @@ use starknet_in_rust::{ state_cache::StorageEntry, BlockInfo, }, - transaction::InvokeFunction, + transaction::{InvokeFunction, DeployAccount}, utils::{Address, ClassHash}, }; @@ -143,6 +143,9 @@ pub fn execute_tx_configurable( SNTransaction::Invoke(tx) => InvokeFunction::from_invoke_transaction(tx, chain_id) .unwrap() .create_for_simulation(skip_validate, false, false, false, skip_nonce_check), + SNTransaction::DeployAccount(tx) => { + DeployAccount::from_sn_api_transaction(tx, chain_id.to_felt()).unwrap().create_for_simulation(skip_validate, false, false, false) + }, _ => unimplemented!(), }; @@ -163,7 +166,7 @@ pub fn execute_tx_configurable( Default::default(), true, ); - + dbg!("before execute"); ( tx.execute(&mut state, &block_context, u128::MAX).unwrap(), trace, @@ -213,78 +216,79 @@ fn test_get_transaction_try_from() { }; } -#[test] -fn test_get_gas_price() { - let block = BlockValue::Number(BlockNumber(169928)); - let rpc_state = RpcState::new_infura(RpcChain::MainNet, block); - - let price = rpc_state.get_gas_price(169928).unwrap(); - assert_eq!(price, 22804578690); -} - -#[test_case( - "0x014640564509873cf9d24a311e1207040c8b60efd38d96caef79855f0b0075d5", - 90006, - RpcChain::MainNet - => ignore["old transaction, gas mismatch"] -)] -#[test_case( - "0x025844447697eb7d5df4d8268b23aef6c11de4087936048278c2559fc35549eb", - 197000, - RpcChain::MainNet -)] -#[test_case( - "0x00164bfc80755f62de97ae7c98c9d67c1767259427bcf4ccfcc9683d44d54676", - 197000, - RpcChain::MainNet -)] -#[test_case( - "0x05d200ef175ba15d676a68b36f7a7b72c17c17604eda4c1efc2ed5e4973e2c91", - 169928, // real block 169929 - RpcChain::MainNet - )] -#[test_case( - "0x0528ec457cf8757f3eefdf3f0728ed09feeecc50fd97b1e4c5da94e27e9aa1d6", - 169928, // real block 169929 - RpcChain::MainNet - )] -#[test_case( - "0x0737677385a30ec4cbf9f6d23e74479926975b74db3d55dc5e46f4f8efee41cf", - 169928, // real block 169929 - RpcChain::MainNet - => ignore["resource mismatch"] - )] -#[test_case( - "0x026c17728b9cd08a061b1f17f08034eb70df58c1a96421e73ee6738ad258a94c", - 169928, // real block 169929 - RpcChain::MainNet - )] -#[test_case( - // review later - "0x0743092843086fa6d7f4a296a226ee23766b8acf16728aef7195ce5414dc4d84", - 186548, // real block 186549 - RpcChain::MainNet - => ignore["resource mismatch"] - )] -#[test_case( - // fails in blockifier - "0x00724fc4a84f489ed032ebccebfc9541eb8dc64b0e76b933ed6fc30cd6000bd1", - 186551, // real block 186552 - RpcChain::MainNet - )] -#[test_case( - "0x176a92e8df0128d47f24eebc17174363457a956fa233cc6a7f8561bfbd5023a", - 317092, // real block 317093 - RpcChain::MainNet -)] +// #[test] +// fn test_get_gas_price() { +// let block = BlockValue::Number(BlockNumber(169928)); +// let rpc_state = RpcState::new_infura(RpcChain::MainNet, block); + +// let price = rpc_state.get_gas_price(169928).unwrap(); +// assert_eq!(price, 22804578690); +// } + +// #[test_case( +// "0x014640564509873cf9d24a311e1207040c8b60efd38d96caef79855f0b0075d5", +// 90006, +// RpcChain::MainNet +// => ignore["old transaction, gas mismatch"] +// )] +// #[test_case( +// "0x025844447697eb7d5df4d8268b23aef6c11de4087936048278c2559fc35549eb", +// 197000, +// RpcChain::MainNet +// )] +// #[test_case( +// "0x00164bfc80755f62de97ae7c98c9d67c1767259427bcf4ccfcc9683d44d54676", +// 197000, +// RpcChain::MainNet +// )] +// #[test_case( +// "0x05d200ef175ba15d676a68b36f7a7b72c17c17604eda4c1efc2ed5e4973e2c91", +// 169928, // real block 169929 +// RpcChain::MainNet +// )] +// #[test_case( +// "0x0528ec457cf8757f3eefdf3f0728ed09feeecc50fd97b1e4c5da94e27e9aa1d6", +// 169928, // real block 169929 +// RpcChain::MainNet +// )] +// #[test_case( +// "0x0737677385a30ec4cbf9f6d23e74479926975b74db3d55dc5e46f4f8efee41cf", +// 169928, // real block 169929 +// RpcChain::MainNet +// => ignore["resource mismatch"] +// )] +// #[test_case( +// "0x026c17728b9cd08a061b1f17f08034eb70df58c1a96421e73ee6738ad258a94c", +// 169928, // real block 169929 +// RpcChain::MainNet +// )] +// #[test_case( +// // review later +// "0x0743092843086fa6d7f4a296a226ee23766b8acf16728aef7195ce5414dc4d84", +// 186548, // real block 186549 +// RpcChain::MainNet +// => ignore["resource mismatch"] +// )] +// #[test_case( +// // fails in blockifier +// "0x00724fc4a84f489ed032ebccebfc9541eb8dc64b0e76b933ed6fc30cd6000bd1", +// 186551, // real block 186552 +// RpcChain::MainNet +// )] +// #[test_case( +// "0x176a92e8df0128d47f24eebc17174363457a956fa233cc6a7f8561bfbd5023a", +// 317092, // real block 317093 +// RpcChain::MainNet +// )] #[test_case( "0x1cbc74e101a1533082a021ce53235cfd744899b0ff948d1949a64646e0f15c2", 885298, // real block 885299 - RpcChain::MainNet + RpcChain::TestNet )] fn starknet_in_rust_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { + dbg!(block_number); let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); - + dbg!(block_number); let TransactionExecutionInfo { call_info, actual_fee, diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index 8a67ce9e9..c527ca9b4 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -26,10 +26,10 @@ pub fn calculate_tx_gas_usage( ) -> usize { let residual_message_segment_length = get_message_segment_lenght(&l2_to_l1_messages, l1_handler_payload_size); - + dbg!(residual_message_segment_length); let residual_onchain_data_segment_length = get_onchain_data_segment_length(n_modified_contracts, n_storage_changes, n_deployments); - + dbg!(residual_onchain_data_segment_length); let n_l2_to_l1_messages = l2_to_l1_messages.len(); let n_l1_to_l2_messages = match l1_handler_payload_size { Some(_size) => 1, @@ -43,6 +43,7 @@ pub fn calculate_tx_gas_usage( l1_handler_payload_size, &l2_to_l1_messages, ); + dbg!(starknet_gas_usage); let sharp_gas_usage = (residual_message_segment_length * SHARP_GAS_PER_MEMORY_WORD) + (residual_onchain_data_segment_length * SHARP_GAS_PER_MEMORY_WORD); diff --git a/src/state/cached_state.rs b/src/state/cached_state.rs index 4d9820c30..e917cf683 100644 --- a/src/state/cached_state.rs +++ b/src/state/cached_state.rs @@ -301,6 +301,11 @@ impl State for CachedState { &self.cache.class_hash_initial_values, ); + let compiled_class_hash_updates = subtract_mappings_keys( + &self.cache.compiled_class_hash_writes, + &self.cache.compiled_class_hash_initial_values, + ); + let nonce_updates = subtract_mappings_keys(&self.cache.nonce_writes, &self.cache.nonce_initial_values); diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index 17bf5445b..ddd4fcced 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -166,7 +166,9 @@ impl DeployAccount { state: &mut CachedState, block_context: &BlockContext, ) -> Result { + dbg!("handle nonce"); self.handle_nonce(state)?; + dbg!("handled nonce"); let mut transactional_state = state.create_transactional(); let mut tx_exec_info = self.apply(&mut transactional_state, block_context)?; @@ -258,6 +260,7 @@ impl DeployAccount { 0, ) .map_err::(|_| TransactionError::ResourcesCalculation)?; + dbg!(&actual_resources); Ok(TransactionExecutionInfo::new_without_fee_info( validate_info, @@ -400,7 +403,7 @@ impl DeployAccount { Ok(call_info) } - pub(crate) fn create_for_simulation( + pub fn create_for_simulation( &self, skip_validate: bool, skip_execute: bool, @@ -421,6 +424,42 @@ impl DeployAccount { Transaction::DeployAccount(tx) } + + pub fn from_sn_api_transaction( + value: starknet_api::transaction::DeployAccountTransaction, + chain_id: Felt252, + ) -> Result { + let max_fee = value.max_fee.0; + let version = Felt252::from_bytes_be(value.version.0.bytes()); + let nonce = dbg!(Felt252::from_bytes_be(value.nonce.0.bytes())); + let class_hash: [u8; 32] = value.class_hash.0.bytes().try_into().unwrap(); + let contract_address_salt = Felt252::from_bytes_be(value.contract_address_salt.0.bytes()); + + let signature = value + .signature + .0 + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + let constructor_calldata = value + .constructor_calldata + .0 + .as_ref() + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + + DeployAccount::new( + class_hash, + max_fee, + version, + nonce, + constructor_calldata, + signature, + contract_address_salt, + chain_id, + ) + } } // ---------------------------------- diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index 7bcd1a50f..a962d42d9 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -86,6 +86,7 @@ pub fn calculate_tx_fee( .to_owned(); let l1_gas_by_cairo_usage = calculate_l1_gas_by_cairo_usage(block_context, resources)?; + dbg!(l1_gas_by_cairo_usage); let total_l1_gas_usage = gas_usage.to_f64().unwrap() + l1_gas_by_cairo_usage; Ok(total_l1_gas_usage.ceil() as u128 * gas_price) diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 0009c2245..296b9f6a8 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -72,6 +72,7 @@ impl Transaction { block_context: &BlockContext, remaining_gas: u128, ) -> Result { + dbg!("execute"); match self { Transaction::Declare(tx) => tx.execute(state, block_context), Transaction::DeclareV2(tx) => tx.execute(state, block_context), diff --git a/src/utils.rs b/src/utils.rs index b25b4f7ad..04a74aef9 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -173,6 +173,7 @@ pub fn calculate_tx_resources( l1_handler_payload_size: Option, n_reverted_steps: usize, ) -> Result, TransactionError> { + dbg!(storage_changes); let (n_modified_contracts, n_storage_changes) = storage_changes; let non_optional_calls: Vec = call_info.iter().flatten().cloned().collect(); @@ -183,6 +184,9 @@ pub fn calculate_tx_resources( for call_info in non_optional_calls { l2_to_l1_messages.extend(call_info.get_sorted_l2_to_l1_messages()?) } + dbg!(&l2_to_l1_messages); + dbg!(l1_handler_payload_size); + dbg!(n_deployments); let l1_gas_usage = calculate_tx_gas_usage( l2_to_l1_messages, From ced01c49274c6ccc75fde6118b943c778066100b Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 18 Oct 2023 18:15:30 -0300 Subject: [PATCH 04/54] Fix get_onchain_data_segment_length --- src/definitions/constants.rs | 2 +- src/execution/gas_usage.rs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/definitions/constants.rs b/src/definitions/constants.rs index 85d4f9d69..22be16e6c 100644 --- a/src/definitions/constants.rs +++ b/src/definitions/constants.rs @@ -7,7 +7,7 @@ use std::collections::HashMap; pub(crate) const L2_TO_L1_MSG_HEADER_SIZE: usize = 3; pub(crate) const L1_TO_L2_MSG_HEADER_SIZE: usize = 5; -pub(crate) const DEPLOYMENT_INFO_SIZE: usize = 2; +pub(crate) const DEPLOYMENT_INFO_SIZE: usize = 1; pub(crate) const CONSUMED_MSG_TO_L2_N_TOPICS: usize = 3; pub(crate) const LOG_MSG_TO_L1_N_TOPICS: usize = 2; pub(crate) const N_DEFAULT_TOPICS: usize = 1; // Events have one default topic. diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index f0d254dc7..8a67ce9e9 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -110,7 +110,9 @@ pub const fn get_onchain_data_segment_length( n_storage_changes: usize, n_deployments: usize, ) -> usize { - n_modified_contracts * 2 + n_storage_changes * 2 + n_deployments * DEPLOYMENT_INFO_SIZE + n_modified_contracts * 2 + + n_deployments * DEPLOYMENT_INFO_SIZE + + n_storage_changes * 2 } /// Calculates the cost of ConsumedMessageToL2 event emissions caused by an L1 handler with the given From 1e7efffcfe822eaecc41d032a4b4a7df3d063623 Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 18 Oct 2023 18:35:27 -0300 Subject: [PATCH 05/54] Add StorageChangesCount struct --- src/state/state_api.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/state/state_api.rs b/src/state/state_api.rs index 818a063d6..4c9dcf37c 100644 --- a/src/state/state_api.rs +++ b/src/state/state_api.rs @@ -26,6 +26,13 @@ pub trait StateReader { ) -> Result; } +pub struct StorageChangesCount { + pub n_storage_updates: usize, + pub n_class_hash_updates: usize, + pub n_compiled_class_hash_updates: usize, + pub n_modified_contracts: usize +} + pub trait State { fn set_contract_class( &mut self, From 2347431b7291f17766af9c0c0f1ebeabdbcc59b7 Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 18 Oct 2023 18:52:43 -0300 Subject: [PATCH 06/54] Update test values --- src/execution/gas_usage.rs | 2 +- src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index 8a67ce9e9..b3778b868 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -264,7 +264,7 @@ mod test { assert_eq!( calculate_tx_gas_usage(vec![message1, message2], 2, 2, Some(2), 1), - 77051 + 76439 ) } } diff --git a/src/lib.rs b/src/lib.rs index c601d0df0..9f9b29b15 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1024,7 +1024,7 @@ mod test { assert_eq!( estimate_fee(&[deploy, invoke_tx], state, block_context,).unwrap(), - [(0, 2448), (0, 2448)] + [(0, 1836), (0, 2448)] ); } From ac56f81722187935cd3329a027acec29685623cd Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 12:06:11 -0300 Subject: [PATCH 07/54] Update test values --- tests/deploy_account.rs | 4 ++-- tests/internals.rs | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/deploy_account.rs b/tests/deploy_account.rs index 2cd8027e1..24ee3b162 100644 --- a/tests/deploy_account.rs +++ b/tests/deploy_account.rs @@ -104,7 +104,7 @@ fn internal_deploy_account() { ("n_steps", 3612), ("pedersen_builtin", 23), ("range_check_builtin", 83), - ("l1_gas_usage", 3672) + ("l1_gas_usage", 3060) ] .into_iter() .map(|(k, v)| (k.to_string(), v)) @@ -270,7 +270,7 @@ fn internal_deploy_account_cairo1() { ("n_steps", n_steps), ("pedersen_builtin", 23), ("range_check_builtin", 87), - ("l1_gas_usage", 4896) + ("l1_gas_usage", 4284) ] .into_iter() .map(|(k, v)| (k.to_string(), v)) diff --git a/tests/internals.rs b/tests/internals.rs index ac17b234d..9ca873c44 100644 --- a/tests/internals.rs +++ b/tests/internals.rs @@ -1490,7 +1490,7 @@ fn test_invoke_with_declarev2_tx() { fn test_deploy_account() { let (block_context, mut state) = create_account_tx_test_state().unwrap(); - let expected_fee = 3709; + let expected_fee = 3097; let deploy_account_tx = DeployAccount::new( felt_to_hash(&TEST_ACCOUNT_CONTRACT_CLASS_HASH), @@ -1561,7 +1561,7 @@ fn test_deploy_account() { ("n_steps".to_string(), 3625), ("range_check_builtin".to_string(), 83), ("pedersen_builtin".to_string(), 23), - ("l1_gas_usage".to_string(), 3672), + ("l1_gas_usage".to_string(), 3060), ]); let fee = calculate_tx_fee(&resources, *GAS_PRICE, &block_context).unwrap(); @@ -1706,12 +1706,12 @@ fn test_deploy_account_revert() { ("n_steps".to_string(), 3625), ("range_check_builtin".to_string(), 83), ("pedersen_builtin".to_string(), 23), - ("l1_gas_usage".to_string(), 3672), + ("l1_gas_usage".to_string(), 3060), ]); let fee = calculate_tx_fee(&resources, *GAS_PRICE, &block_context).unwrap(); - assert_eq!(fee, 3709); + assert_eq!(fee, 3097); let mut expected_execution_info = TransactionExecutionInfo::new( None, @@ -1749,7 +1749,7 @@ fn expected_deploy_account_states() -> ( CachedState, CachedState, ) { - let fee = Felt252::from(3709); + let fee = Felt252::from(3097); let mut state_before = CachedState::new( Arc::new(InMemoryStateReader::new( HashMap::from([ From 5d2e5e369ffd42c4ae6df984e3a7c27703c3d150 Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 12:09:59 -0300 Subject: [PATCH 08/54] fmt --- src/execution/gas_usage.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index b3778b868..683273177 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -110,9 +110,7 @@ pub const fn get_onchain_data_segment_length( n_storage_changes: usize, n_deployments: usize, ) -> usize { - n_modified_contracts * 2 - + n_deployments * DEPLOYMENT_INFO_SIZE - + n_storage_changes * 2 + n_modified_contracts * 2 + n_deployments * DEPLOYMENT_INFO_SIZE + n_storage_changes * 2 } /// Calculates the cost of ConsumedMessageToL2 event emissions caused by an L1 handler with the given From 0df3007d6d83c7decdc7e9b5ddd1fbe2889b8eb3 Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 12:23:36 -0300 Subject: [PATCH 09/54] Use StorageChangesCount struct in state method --- src/state/cached_state.rs | 27 +++++++++++++++++++-------- src/state/state_api.rs | 5 +++-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/state/cached_state.rs b/src/state/cached_state.rs index 4d9820c30..192dbbfe6 100644 --- a/src/state/cached_state.rs +++ b/src/state/cached_state.rs @@ -1,5 +1,5 @@ use super::{ - state_api::{State, StateReader}, + state_api::{State, StateReader, StorageChangesCount}, state_cache::{StateCache, StorageEntry}, }; use crate::{ @@ -286,7 +286,7 @@ impl State for CachedState { fn count_actual_storage_changes( &mut self, fee_token_and_sender_address: Option<(&Address, &Address)>, - ) -> Result<(usize, usize), StateError> { + ) -> Result { self.update_initial_values_of_write_only_accesses()?; let mut storage_updates = subtract_mappings( @@ -301,6 +301,11 @@ impl State for CachedState { &self.cache.class_hash_initial_values, ); + let compiled_class_hash_updates = subtract_mappings_keys( + &self.cache.compiled_class_hash_writes, + &self.cache.compiled_class_hash_initial_values, + ); + let nonce_updates = subtract_mappings_keys(&self.cache.nonce_writes, &self.cache.nonce_initial_values); @@ -320,7 +325,12 @@ impl State for CachedState { modified_contracts.remove(fee_token_address); } - Ok((modified_contracts.len(), storage_updates.len())) + Ok(StorageChangesCount { + n_storage_updates: storage_updates.len(), + n_class_hash_updates: class_hash_updates.count(), + n_compiled_class_hash_updates: compiled_class_hash_updates.count(), + n_modified_contracts: modified_contracts.len(), + }) } /// Returns the class hash for a given contract address. @@ -822,12 +832,13 @@ mod tests { let fee_token_address = Address(123.into()); let sender_address = Address(321.into()); - let expected_changes = { - let n_storage_updates = 3 + 1; // + 1 fee transfer balance update - let n_modified_contracts = 2; - - (n_modified_contracts, n_storage_updates) + let expected_changes = StorageChangesCount{ + n_storage_updates: 3 + 1, // + 1 fee transfer balance update, + n_class_hash_updates: 0, + n_compiled_class_hash_updates: 0, + n_modified_contracts: 2, }; + let changes = cached_state .count_actual_storage_changes(Some((&fee_token_address, &sender_address))) .unwrap(); diff --git a/src/state/state_api.rs b/src/state/state_api.rs index 4c9dcf37c..7eb5860a8 100644 --- a/src/state/state_api.rs +++ b/src/state/state_api.rs @@ -26,11 +26,12 @@ pub trait StateReader { ) -> Result; } +#[derive(Debug, Clone, Eq, PartialEq)] pub struct StorageChangesCount { pub n_storage_updates: usize, pub n_class_hash_updates: usize, pub n_compiled_class_hash_updates: usize, - pub n_modified_contracts: usize + pub n_modified_contracts: usize, } pub trait State { @@ -74,7 +75,7 @@ pub trait State { fn count_actual_storage_changes( &mut self, fee_token_and_sender_address: Option<(&Address, &Address)>, - ) -> Result<(usize, usize), StateError>; + ) -> Result; /// Returns the class hash of the contract class at the given address. /// Returns zero by default if the value is not present From fed2162f60712b05fdce903d52313275426db6a5 Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 12:43:43 -0300 Subject: [PATCH 10/54] Fix implicated code --- src/definitions/constants.rs | 2 +- src/execution/gas_usage.rs | 30 ++++++++++++++++++------------ src/state/cached_state.rs | 12 +++++++----- src/utils.rs | 16 ++++------------ 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/definitions/constants.rs b/src/definitions/constants.rs index 22be16e6c..4087af325 100644 --- a/src/definitions/constants.rs +++ b/src/definitions/constants.rs @@ -7,7 +7,7 @@ use std::collections::HashMap; pub(crate) const L2_TO_L1_MSG_HEADER_SIZE: usize = 3; pub(crate) const L1_TO_L2_MSG_HEADER_SIZE: usize = 5; -pub(crate) const DEPLOYMENT_INFO_SIZE: usize = 1; +pub(crate) const CLASS_UPDATE_SIZE: usize = 1; pub(crate) const CONSUMED_MSG_TO_L2_N_TOPICS: usize = 3; pub(crate) const LOG_MSG_TO_L1_N_TOPICS: usize = 2; pub(crate) const N_DEFAULT_TOPICS: usize = 1; // Events have one default topic. diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index 683273177..37537c81c 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -1,6 +1,7 @@ use crate::definitions::constants::*; use crate::execution::L2toL1MessageInfo; use crate::services::eth_definitions::eth_gas_constants::*; +use crate::state::state_api::StorageChangesCount; /// Estimates L1 gas usage by Starknet's update state and the verifier /// @@ -19,16 +20,13 @@ use crate::services::eth_definitions::eth_gas_constants::*; /// The estimation of L1 gas usage as a `usize` value. pub fn calculate_tx_gas_usage( l2_to_l1_messages: Vec, - n_modified_contracts: usize, - n_storage_changes: usize, + storage_changes: &StorageChangesCount, l1_handler_payload_size: Option, - n_deployments: usize, ) -> usize { let residual_message_segment_length = get_message_segment_lenght(&l2_to_l1_messages, l1_handler_payload_size); - let residual_onchain_data_segment_length = - get_onchain_data_segment_length(n_modified_contracts, n_storage_changes, n_deployments); + let residual_onchain_data_segment_length = get_onchain_data_segment_length(storage_changes); let n_l2_to_l1_messages = l2_to_l1_messages.len(); let n_l1_to_l2_messages = match l1_handler_payload_size { @@ -105,12 +103,11 @@ pub fn get_message_segment_lenght( /// # Returns: /// /// The on-chain data segment length -pub const fn get_onchain_data_segment_length( - n_modified_contracts: usize, - n_storage_changes: usize, - n_deployments: usize, -) -> usize { - n_modified_contracts * 2 + n_deployments * DEPLOYMENT_INFO_SIZE + n_storage_changes * 2 +pub const fn get_onchain_data_segment_length(storage_changes: &StorageChangesCount) -> usize { + storage_changes.n_modified_contracts * 2 + + storage_changes.n_class_hash_updates * CLASS_UPDATE_SIZE + + storage_changes.n_storage_updates * 2 + + storage_changes.n_compiled_class_hash_updates * 2 } /// Calculates the cost of ConsumedMessageToL2 event emissions caused by an L1 handler with the given @@ -261,7 +258,16 @@ mod test { let message2 = L2toL1MessageInfo::new(ord_ev2, Address(1235.into())); assert_eq!( - calculate_tx_gas_usage(vec![message1, message2], 2, 2, Some(2), 1), + calculate_tx_gas_usage( + vec![message1, message2], + &StorageChangesCount { + n_storage_updates: 2, + n_class_hash_updates: 1, + n_compiled_class_hash_updates: 0, + n_modified_contracts: 2 + }, + Some(2) + ), 76439 ) } diff --git a/src/state/cached_state.rs b/src/state/cached_state.rs index 192dbbfe6..c4a2508eb 100644 --- a/src/state/cached_state.rs +++ b/src/state/cached_state.rs @@ -296,10 +296,12 @@ impl State for CachedState { let storage_unique_updates = storage_updates.keys().map(|k| k.0.clone()); - let class_hash_updates = subtract_mappings_keys( + let class_hash_updates: Vec<&Address> = subtract_mappings_keys( &self.cache.class_hash_writes, &self.cache.class_hash_initial_values, - ); + ) + .collect(); + let n_class_hash_updates = class_hash_updates.len(); let compiled_class_hash_updates = subtract_mappings_keys( &self.cache.compiled_class_hash_writes, @@ -311,7 +313,7 @@ impl State for CachedState { let mut modified_contracts: HashSet
= HashSet::new(); modified_contracts.extend(storage_unique_updates); - modified_contracts.extend(class_hash_updates.cloned()); + modified_contracts.extend(class_hash_updates.into_iter().cloned()); modified_contracts.extend(nonce_updates.cloned()); // Add fee transfer storage update before actually charging it, as it needs to be included in the @@ -327,7 +329,7 @@ impl State for CachedState { Ok(StorageChangesCount { n_storage_updates: storage_updates.len(), - n_class_hash_updates: class_hash_updates.count(), + n_class_hash_updates, n_compiled_class_hash_updates: compiled_class_hash_updates.count(), n_modified_contracts: modified_contracts.len(), }) @@ -832,7 +834,7 @@ mod tests { let fee_token_address = Address(123.into()); let sender_address = Address(321.into()); - let expected_changes = StorageChangesCount{ + let expected_changes = StorageChangesCount { n_storage_updates: 3 + 1, // + 1 fee transfer balance update, n_class_hash_updates: 0, n_compiled_class_hash_updates: 0, diff --git a/src/utils.rs b/src/utils.rs index b25b4f7ad..06c76d51e 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,6 +1,6 @@ use crate::core::errors::hash_errors::HashError; use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; -use crate::state::state_api::State; +use crate::state::state_api::{State, StorageChangesCount}; use crate::{ definitions::transaction_type::TransactionType, execution::{ @@ -169,14 +169,11 @@ pub fn calculate_tx_resources( resources_manager: ExecutionResourcesManager, call_info: &[Option], tx_type: TransactionType, - storage_changes: (usize, usize), + storage_changes: StorageChangesCount, l1_handler_payload_size: Option, n_reverted_steps: usize, ) -> Result, TransactionError> { - let (n_modified_contracts, n_storage_changes) = storage_changes; - let non_optional_calls: Vec = call_info.iter().flatten().cloned().collect(); - let n_deployments = non_optional_calls.iter().map(get_call_n_deployments).sum(); let mut l2_to_l1_messages = Vec::new(); @@ -184,13 +181,8 @@ pub fn calculate_tx_resources( l2_to_l1_messages.extend(call_info.get_sorted_l2_to_l1_messages()?) } - let l1_gas_usage = calculate_tx_gas_usage( - l2_to_l1_messages, - n_modified_contracts, - n_storage_changes, - l1_handler_payload_size, - n_deployments, - ); + let l1_gas_usage = + calculate_tx_gas_usage(l2_to_l1_messages, &storage_changes, l1_handler_payload_size); let cairo_usage = resources_manager.cairo_usage.clone(); let tx_syscall_counter = resources_manager.syscall_counter; From 413dfa18a87c679a5bee538d174a77c039ce54d4 Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 12:54:43 -0300 Subject: [PATCH 11/54] Update doc --- src/execution/gas_usage.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index 37537c81c..9be0349ba 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -93,20 +93,17 @@ pub fn get_message_segment_lenght( } /// Calculates the amount of `felt252` added to the output message's segment by the given operations. -/// -/// # Parameters: -/// -/// - `n_modified_contracts`: The number of contracts modified by the transaction. -/// - `n_storage_changes`: The number of storage changes made by the transaction. -/// - `n_deployments`: The number of contracts deployed by the transaction. -/// -/// # Returns: -/// -/// The on-chain data segment length pub const fn get_onchain_data_segment_length(storage_changes: &StorageChangesCount) -> usize { + // For each newly modified contract: + // contract address (1 word). + // + 1 word with the following info: A flag indicating whether the class hash was updated, the + // number of entry updates, and the new nonce. storage_changes.n_modified_contracts * 2 + // For each class updated (through a deploy or a class replacement). + storage_changes.n_class_hash_updates * CLASS_UPDATE_SIZE + // For each modified storage cell: key, new value. + storage_changes.n_storage_updates * 2 + // For each compiled class updated (through declare): class_hash, compiled_class_hash + storage_changes.n_compiled_class_hash_updates * 2 } From d68054615d92546f643534808eee192bbb8b557d Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 13:08:19 -0300 Subject: [PATCH 12/54] Update test values --- tests/internals.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/internals.rs b/tests/internals.rs index 9ca873c44..9f0ff4a81 100644 --- a/tests/internals.rs +++ b/tests/internals.rs @@ -1260,7 +1260,7 @@ fn expected_fib_transaction_execution_info( } let resources = HashMap::from([ ("n_steps".to_string(), n_steps), - ("l1_gas_usage".to_string(), 4896), + ("l1_gas_usage".to_string(), 5508), ("pedersen_builtin".to_string(), 16), ("range_check_builtin".to_string(), 104), ]); @@ -1477,7 +1477,7 @@ fn test_invoke_with_declarev2_tx() { ]; let invoke_tx = invoke_tx(calldata, u128::MAX); - let expected_gas_consumed = 4908; + let expected_gas_consumed = 5551; let result = invoke_tx .execute(state, block_context, expected_gas_consumed) .unwrap(); From 6a2bd156c752ae664a32e26f50a0d03716c1dd16 Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 13:16:18 -0300 Subject: [PATCH 13/54] Rename method for consistency --- src/execution/gas_usage.rs | 18 +++++++++--------- src/state/cached_state.rs | 14 +++++++------- src/state/state_api.rs | 8 ++++---- src/transaction/declare.rs | 2 +- src/transaction/declare_v2.rs | 2 +- src/transaction/deploy.rs | 4 ++-- src/transaction/deploy_account.rs | 2 +- src/transaction/invoke_function.rs | 2 +- src/transaction/l1_handler.rs | 2 +- src/utils.rs | 6 +++--- 10 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index 9be0349ba..85e26a90a 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -1,7 +1,7 @@ use crate::definitions::constants::*; use crate::execution::L2toL1MessageInfo; use crate::services::eth_definitions::eth_gas_constants::*; -use crate::state::state_api::StorageChangesCount; +use crate::state::state_api::StateChangesCount; /// Estimates L1 gas usage by Starknet's update state and the verifier /// @@ -20,13 +20,13 @@ use crate::state::state_api::StorageChangesCount; /// The estimation of L1 gas usage as a `usize` value. pub fn calculate_tx_gas_usage( l2_to_l1_messages: Vec, - storage_changes: &StorageChangesCount, + state_changes: &StateChangesCount, l1_handler_payload_size: Option, ) -> usize { let residual_message_segment_length = get_message_segment_lenght(&l2_to_l1_messages, l1_handler_payload_size); - let residual_onchain_data_segment_length = get_onchain_data_segment_length(storage_changes); + let residual_onchain_data_segment_length = get_onchain_data_segment_length(state_changes); let n_l2_to_l1_messages = l2_to_l1_messages.len(); let n_l1_to_l2_messages = match l1_handler_payload_size { @@ -93,18 +93,18 @@ pub fn get_message_segment_lenght( } /// Calculates the amount of `felt252` added to the output message's segment by the given operations. -pub const fn get_onchain_data_segment_length(storage_changes: &StorageChangesCount) -> usize { +pub const fn get_onchain_data_segment_length(state_changes: &StateChangesCount) -> usize { // For each newly modified contract: // contract address (1 word). // + 1 word with the following info: A flag indicating whether the class hash was updated, the // number of entry updates, and the new nonce. - storage_changes.n_modified_contracts * 2 + state_changes.n_modified_contracts * 2 // For each class updated (through a deploy or a class replacement). - + storage_changes.n_class_hash_updates * CLASS_UPDATE_SIZE + + state_changes.n_class_hash_updates * CLASS_UPDATE_SIZE // For each modified storage cell: key, new value. - + storage_changes.n_storage_updates * 2 + + state_changes.n_storage_updates * 2 // For each compiled class updated (through declare): class_hash, compiled_class_hash - + storage_changes.n_compiled_class_hash_updates * 2 + + state_changes.n_compiled_class_hash_updates * 2 } /// Calculates the cost of ConsumedMessageToL2 event emissions caused by an L1 handler with the given @@ -257,7 +257,7 @@ mod test { assert_eq!( calculate_tx_gas_usage( vec![message1, message2], - &StorageChangesCount { + &StateChangesCount { n_storage_updates: 2, n_class_hash_updates: 1, n_compiled_class_hash_updates: 0, diff --git a/src/state/cached_state.rs b/src/state/cached_state.rs index c4a2508eb..f47d5a60e 100644 --- a/src/state/cached_state.rs +++ b/src/state/cached_state.rs @@ -1,5 +1,5 @@ use super::{ - state_api::{State, StateReader, StorageChangesCount}, + state_api::{State, StateChangesCount, StateReader}, state_cache::{StateCache, StorageEntry}, }; use crate::{ @@ -283,10 +283,10 @@ impl State for CachedState { Ok(()) } - fn count_actual_storage_changes( + fn count_actual_state_changes( &mut self, fee_token_and_sender_address: Option<(&Address, &Address)>, - ) -> Result { + ) -> Result { self.update_initial_values_of_write_only_accesses()?; let mut storage_updates = subtract_mappings( @@ -327,7 +327,7 @@ impl State for CachedState { modified_contracts.remove(fee_token_address); } - Ok(StorageChangesCount { + Ok(StateChangesCount { n_storage_updates: storage_updates.len(), n_class_hash_updates, n_compiled_class_hash_updates: compiled_class_hash_updates.count(), @@ -812,7 +812,7 @@ mod tests { /// This test calculate the number of actual storage changes. #[test] - fn count_actual_storage_changes_test() { + fn count_actual_state_changes_test() { let state_reader = InMemoryStateReader::default(); let mut cached_state = CachedState::new(Arc::new(state_reader), HashMap::new()); @@ -834,7 +834,7 @@ mod tests { let fee_token_address = Address(123.into()); let sender_address = Address(321.into()); - let expected_changes = StorageChangesCount { + let expected_changes = StateChangesCount { n_storage_updates: 3 + 1, // + 1 fee transfer balance update, n_class_hash_updates: 0, n_compiled_class_hash_updates: 0, @@ -842,7 +842,7 @@ mod tests { }; let changes = cached_state - .count_actual_storage_changes(Some((&fee_token_address, &sender_address))) + .count_actual_state_changes(Some((&fee_token_address, &sender_address))) .unwrap(); assert_eq!(changes, expected_changes); diff --git a/src/state/state_api.rs b/src/state/state_api.rs index 7eb5860a8..4abe12354 100644 --- a/src/state/state_api.rs +++ b/src/state/state_api.rs @@ -27,7 +27,7 @@ pub trait StateReader { } #[derive(Debug, Clone, Eq, PartialEq)] -pub struct StorageChangesCount { +pub struct StateChangesCount { pub n_storage_updates: usize, pub n_class_hash_updates: usize, pub n_compiled_class_hash_updates: usize, @@ -71,11 +71,11 @@ pub trait State { fn apply_state_update(&mut self, sate_updates: &StateDiff) -> Result<(), StateError>; - /// Counts the amount of modified contracts and the updates to the storage - fn count_actual_storage_changes( + /// Counts the amount of state changes + fn count_actual_state_changes( &mut self, fee_token_and_sender_address: Option<(&Address, &Address)>, - ) -> Result; + ) -> Result; /// Returns the class hash of the contract class at the given address. /// Returns zero by default if the value is not present diff --git a/src/transaction/declare.rs b/src/transaction/declare.rs index 11ee6ae48..7c9168fcd 100644 --- a/src/transaction/declare.rs +++ b/src/transaction/declare.rs @@ -166,7 +166,7 @@ impl Declare { } else { self.run_validate_entrypoint(state, &mut resources_manager, block_context)? }; - let changes = state.count_actual_storage_changes(Some(( + let changes = state.count_actual_state_changes(Some(( &block_context.starknet_os_config.fee_token_address, &self.sender_address, )))?; diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index 854e94468..879f4efa5 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -328,7 +328,7 @@ impl DeclareV2 { (info, gas) }; - let storage_changes = state.count_actual_storage_changes(Some(( + let storage_changes = state.count_actual_state_changes(Some(( &block_context.starknet_os_config.fee_token_address, &self.sender_address, )))?; diff --git a/src/transaction/deploy.rs b/src/transaction/deploy.rs index 9632d8786..69b5b4267 100644 --- a/src/transaction/deploy.rs +++ b/src/transaction/deploy.rs @@ -187,7 +187,7 @@ impl Deploy { let resources_manager = ExecutionResourcesManager::default(); - let changes = state.count_actual_storage_changes(None)?; + let changes = state.count_actual_state_changes(None)?; let actual_resources = calculate_tx_resources( resources_manager, &[Some(call_info.clone())], @@ -250,7 +250,7 @@ impl Deploy { block_context.validate_max_n_steps, )?; - let changes = state.count_actual_storage_changes(None)?; + let changes = state.count_actual_state_changes(None)?; let actual_resources = calculate_tx_resources( resources_manager, &[call_info.clone()], diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index 17bf5445b..b3c4988e9 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -250,7 +250,7 @@ impl DeployAccount { resources_manager, &[Some(constructor_call_info.clone()), validate_info.clone()], TransactionType::DeployAccount, - state.count_actual_storage_changes(Some(( + state.count_actual_state_changes(Some(( &block_context.starknet_os_config.fee_token_address, &self.contract_address, )))?, diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 22e89c406..f8777ec2c 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -265,7 +265,7 @@ impl InvokeFunction { remaining_gas, )? }; - let changes = state.count_actual_storage_changes(Some(( + let changes = state.count_actual_state_changes(Some(( &block_context.starknet_os_config.fee_token_address, &self.contract_address, )))?; diff --git a/src/transaction/l1_handler.rs b/src/transaction/l1_handler.rs index 39c3ab9ea..451f95af5 100644 --- a/src/transaction/l1_handler.rs +++ b/src/transaction/l1_handler.rs @@ -137,7 +137,7 @@ impl L1Handler { )? }; - let changes = state.count_actual_storage_changes(None)?; + let changes = state.count_actual_state_changes(None)?; let actual_resources = calculate_tx_resources( resources_manager, &[call_info.clone()], diff --git a/src/utils.rs b/src/utils.rs index 06c76d51e..252c77789 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,6 +1,6 @@ use crate::core::errors::hash_errors::HashError; use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; -use crate::state::state_api::{State, StorageChangesCount}; +use crate::state::state_api::{State, StateChangesCount}; use crate::{ definitions::transaction_type::TransactionType, execution::{ @@ -169,7 +169,7 @@ pub fn calculate_tx_resources( resources_manager: ExecutionResourcesManager, call_info: &[Option], tx_type: TransactionType, - storage_changes: StorageChangesCount, + state_changes: StateChangesCount, l1_handler_payload_size: Option, n_reverted_steps: usize, ) -> Result, TransactionError> { @@ -182,7 +182,7 @@ pub fn calculate_tx_resources( } let l1_gas_usage = - calculate_tx_gas_usage(l2_to_l1_messages, &storage_changes, l1_handler_payload_size); + calculate_tx_gas_usage(l2_to_l1_messages, &state_changes, l1_handler_payload_size); let cairo_usage = resources_manager.cairo_usage.clone(); let tx_syscall_counter = resources_manager.syscall_counter; From 94804d2ac929c336faccccc611d7829d9d96464e Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 14:51:39 -0300 Subject: [PATCH 14/54] Add note comment --- rpc_state_reader/src/rpc_state.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rpc_state_reader/src/rpc_state.rs b/rpc_state_reader/src/rpc_state.rs index 92b86638e..76bdd4922 100644 --- a/rpc_state_reader/src/rpc_state.rs +++ b/rpc_state_reader/src/rpc_state.rs @@ -431,6 +431,7 @@ impl RpcState { contract_address.0.key().clone().to_string() ]), ) + // When running deploy_account transactions, the nonce doesn't exist on the previous block so we return 0 .unwrap_or_default() } From 5ae787ee7d3aa1ba1532917f766932efef9bc845 Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 15:16:30 -0300 Subject: [PATCH 15/54] Remove hardcoded contract address --- rpc_state_reader/tests/blockifier_tests.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index d6533e842..05d5521c0 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -19,7 +19,7 @@ use blockifier::{ use cairo_lang_starknet::{ casm_contract_class::CasmContractClass, contract_class::ContractClass as SierraContractClass, }; -use cairo_vm::{types::program::Program, felt::felt_str}; +use cairo_vm::types::program::Program; use pretty_assertions_sorted::{assert_eq, assert_eq_sorted}; use rpc_state_reader::rpc_state::*; use rpc_state_reader::utils; @@ -27,7 +27,7 @@ use starknet::core::types::ContractClass as SNContractClass; use starknet_api::{ block::BlockNumber, contract_address, - core::{ClassHash, CompiledClassHash, ContractAddress, Nonce, PatriciaKey}, + core::{ClassHash, CompiledClassHash, ContractAddress, Nonce, PatriciaKey, calculate_contract_address}, hash::{StarkFelt, StarkHash}, patricia_key, stark_felt, state::StorageKey, @@ -176,7 +176,9 @@ pub fn execute_tx( let invoke = InvokeTransaction { tx, tx_hash }; AccountTransaction::Invoke(invoke) } - SNTransaction::DeployAccount(tx) =>AccountTransaction::DeployAccount(DeployAccountTransaction { tx, tx_hash, contract_address: ContractAddress(StarkHash::new(felt_str!("1358183270800653661466375915013911001148965821491018888567169956392292310604").to_be_bytes()).unwrap().try_into().unwrap()) }), + SNTransaction::DeployAccount(tx) =>{ + let contract_address = calculate_contract_address(tx.contract_address_salt,tx.class_hash, &tx.constructor_calldata, ContractAddress::default()).unwrap(); + AccountTransaction::DeployAccount(DeployAccountTransaction { tx, tx_hash, contract_address: contract_address})}, _ => unimplemented!(), }; From e75750bf2fa8a9a492a0feb6f31bab4cdf0e2a37 Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 15:18:25 -0300 Subject: [PATCH 16/54] Remove txt files --- rpc_state_reader/a.txt | 11 ----------- rpc_state_reader/t.txt | 25 ------------------------- src/state/cached_state.rs | 5 ----- 3 files changed, 41 deletions(-) delete mode 100644 rpc_state_reader/a.txt delete mode 100644 rpc_state_reader/t.txt diff --git a/rpc_state_reader/a.txt b/rpc_state_reader/a.txt deleted file mode 100644 index 010be8bb4..000000000 --- a/rpc_state_reader/a.txt +++ /dev/null @@ -1,11 +0,0 @@ - -running 1 test -test transaction_tests::test_invoke_mainnet_0x06da92cfbdceac5e5e94a1f40772d6c79d34f011815606742658559ec77b6955 ... ok - -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 14 filtered out; finished in 37.99s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - diff --git a/rpc_state_reader/t.txt b/rpc_state_reader/t.txt deleted file mode 100644 index 57d08dd57..000000000 --- a/rpc_state_reader/t.txt +++ /dev/null @@ -1,25 +0,0 @@ - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 13 filtered out; finished in 0.00s - - -running 1 test - SIR internal_calls[0][0].len() = 1 - SIR internal_calls[0][1].len() = 1 - SNT internal_calls[0][0].len() = 1 - SNT internal_calls[0][1].len() = 1 -test starknet_in_rust_test_case_tx::_0x6817103c032c1ca43fa503422ced5dd9f97733522f95f778cd4daed36ab78e6_316719_rpcchain_mainnet_expects ... FAILED - -failures: - -failures: - starknet_in_rust_test_case_tx::_0x6817103c032c1ca43fa503422ced5dd9f97733522f95f778cd4daed36ab78e6_316719_rpcchain_mainnet_expects - -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 8 filtered out; finished in 43.02s - diff --git a/src/state/cached_state.rs b/src/state/cached_state.rs index e917cf683..4d9820c30 100644 --- a/src/state/cached_state.rs +++ b/src/state/cached_state.rs @@ -301,11 +301,6 @@ impl State for CachedState { &self.cache.class_hash_initial_values, ); - let compiled_class_hash_updates = subtract_mappings_keys( - &self.cache.compiled_class_hash_writes, - &self.cache.compiled_class_hash_initial_values, - ); - let nonce_updates = subtract_mappings_keys(&self.cache.nonce_writes, &self.cache.nonce_initial_values); From 7ddad62708453a7f32e027ce63daa8303122dc99 Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 15:20:09 -0300 Subject: [PATCH 17/54] Remove dbg prints --- src/utils.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/utils.rs b/src/utils.rs index 04a74aef9..b25b4f7ad 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -173,7 +173,6 @@ pub fn calculate_tx_resources( l1_handler_payload_size: Option, n_reverted_steps: usize, ) -> Result, TransactionError> { - dbg!(storage_changes); let (n_modified_contracts, n_storage_changes) = storage_changes; let non_optional_calls: Vec = call_info.iter().flatten().cloned().collect(); @@ -184,9 +183,6 @@ pub fn calculate_tx_resources( for call_info in non_optional_calls { l2_to_l1_messages.extend(call_info.get_sorted_l2_to_l1_messages()?) } - dbg!(&l2_to_l1_messages); - dbg!(l1_handler_payload_size); - dbg!(n_deployments); let l1_gas_usage = calculate_tx_gas_usage( l2_to_l1_messages, From c70a509a48ee1e604af09fa68a4e59c18538560c Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 15:22:18 -0300 Subject: [PATCH 18/54] Remove dbg prints --- rpc_state_reader/tests/sir_tests.rs | 131 ++++++++++++------------- src/execution/gas_usage.rs | 3 - src/syscalls/native_syscall_handler.rs | 4 +- src/transaction/deploy_account.rs | 5 +- src/transaction/fee.rs | 1 - src/transaction/mod.rs | 1 - 6 files changed, 67 insertions(+), 78 deletions(-) diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index abc4c6d3c..480380670 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -166,7 +166,6 @@ pub fn execute_tx_configurable( Default::default(), true, ); - dbg!("before execute"); ( tx.execute(&mut state, &block_context, u128::MAX).unwrap(), trace, @@ -216,79 +215,77 @@ fn test_get_transaction_try_from() { }; } -// #[test] -// fn test_get_gas_price() { -// let block = BlockValue::Number(BlockNumber(169928)); -// let rpc_state = RpcState::new_infura(RpcChain::MainNet, block); - -// let price = rpc_state.get_gas_price(169928).unwrap(); -// assert_eq!(price, 22804578690); -// } - -// #[test_case( -// "0x014640564509873cf9d24a311e1207040c8b60efd38d96caef79855f0b0075d5", -// 90006, -// RpcChain::MainNet -// => ignore["old transaction, gas mismatch"] -// )] -// #[test_case( -// "0x025844447697eb7d5df4d8268b23aef6c11de4087936048278c2559fc35549eb", -// 197000, -// RpcChain::MainNet -// )] -// #[test_case( -// "0x00164bfc80755f62de97ae7c98c9d67c1767259427bcf4ccfcc9683d44d54676", -// 197000, -// RpcChain::MainNet -// )] -// #[test_case( -// "0x05d200ef175ba15d676a68b36f7a7b72c17c17604eda4c1efc2ed5e4973e2c91", -// 169928, // real block 169929 -// RpcChain::MainNet -// )] -// #[test_case( -// "0x0528ec457cf8757f3eefdf3f0728ed09feeecc50fd97b1e4c5da94e27e9aa1d6", -// 169928, // real block 169929 -// RpcChain::MainNet -// )] -// #[test_case( -// "0x0737677385a30ec4cbf9f6d23e74479926975b74db3d55dc5e46f4f8efee41cf", -// 169928, // real block 169929 -// RpcChain::MainNet -// => ignore["resource mismatch"] -// )] -// #[test_case( -// "0x026c17728b9cd08a061b1f17f08034eb70df58c1a96421e73ee6738ad258a94c", -// 169928, // real block 169929 -// RpcChain::MainNet -// )] -// #[test_case( -// // review later -// "0x0743092843086fa6d7f4a296a226ee23766b8acf16728aef7195ce5414dc4d84", -// 186548, // real block 186549 -// RpcChain::MainNet -// => ignore["resource mismatch"] -// )] -// #[test_case( -// // fails in blockifier -// "0x00724fc4a84f489ed032ebccebfc9541eb8dc64b0e76b933ed6fc30cd6000bd1", -// 186551, // real block 186552 -// RpcChain::MainNet -// )] -// #[test_case( -// "0x176a92e8df0128d47f24eebc17174363457a956fa233cc6a7f8561bfbd5023a", -// 317092, // real block 317093 -// RpcChain::MainNet -// )] +#[test] +fn test_get_gas_price() { + let block = BlockValue::Number(BlockNumber(169928)); + let rpc_state = RpcState::new_infura(RpcChain::MainNet, block); + + let price = rpc_state.get_gas_price(169928).unwrap(); + assert_eq!(price, 22804578690); +} + +#[test_case( + "0x014640564509873cf9d24a311e1207040c8b60efd38d96caef79855f0b0075d5", + 90006, + RpcChain::MainNet + => ignore["old transaction, gas mismatch"] +)] +#[test_case( + "0x025844447697eb7d5df4d8268b23aef6c11de4087936048278c2559fc35549eb", + 197000, + RpcChain::MainNet +)] +#[test_case( + "0x00164bfc80755f62de97ae7c98c9d67c1767259427bcf4ccfcc9683d44d54676", + 197000, + RpcChain::MainNet +)] +#[test_case( + "0x05d200ef175ba15d676a68b36f7a7b72c17c17604eda4c1efc2ed5e4973e2c91", + 169928, // real block 169929 + RpcChain::MainNet + )] +#[test_case( + "0x0528ec457cf8757f3eefdf3f0728ed09feeecc50fd97b1e4c5da94e27e9aa1d6", + 169928, // real block 169929 + RpcChain::MainNet + )] +#[test_case( + "0x0737677385a30ec4cbf9f6d23e74479926975b74db3d55dc5e46f4f8efee41cf", + 169928, // real block 169929 + RpcChain::MainNet + => ignore["resource mismatch"] + )] +#[test_case( + "0x026c17728b9cd08a061b1f17f08034eb70df58c1a96421e73ee6738ad258a94c", + 169928, // real block 169929 + RpcChain::MainNet + )] +#[test_case( + // review later + "0x0743092843086fa6d7f4a296a226ee23766b8acf16728aef7195ce5414dc4d84", + 186548, // real block 186549 + RpcChain::MainNet + => ignore["resource mismatch"] + )] +#[test_case( + // fails in blockifier + "0x00724fc4a84f489ed032ebccebfc9541eb8dc64b0e76b933ed6fc30cd6000bd1", + 186551, // real block 186552 + RpcChain::MainNet + )] +#[test_case( + "0x176a92e8df0128d47f24eebc17174363457a956fa233cc6a7f8561bfbd5023a", + 317092, // real block 317093 + RpcChain::MainNet +)] #[test_case( "0x1cbc74e101a1533082a021ce53235cfd744899b0ff948d1949a64646e0f15c2", 885298, // real block 885299 RpcChain::TestNet )] fn starknet_in_rust_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { - dbg!(block_number); let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); - dbg!(block_number); let TransactionExecutionInfo { call_info, actual_fee, diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index c527ca9b4..d0b212661 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -26,10 +26,8 @@ pub fn calculate_tx_gas_usage( ) -> usize { let residual_message_segment_length = get_message_segment_lenght(&l2_to_l1_messages, l1_handler_payload_size); - dbg!(residual_message_segment_length); let residual_onchain_data_segment_length = get_onchain_data_segment_length(n_modified_contracts, n_storage_changes, n_deployments); - dbg!(residual_onchain_data_segment_length); let n_l2_to_l1_messages = l2_to_l1_messages.len(); let n_l1_to_l2_messages = match l1_handler_payload_size { Some(_size) => 1, @@ -43,7 +41,6 @@ pub fn calculate_tx_gas_usage( l1_handler_payload_size, &l2_to_l1_messages, ); - dbg!(starknet_gas_usage); let sharp_gas_usage = (residual_message_segment_length * SHARP_GAS_PER_MEMORY_WORD) + (residual_onchain_data_segment_length * SHARP_GAS_PER_MEMORY_WORD); diff --git a/src/syscalls/native_syscall_handler.rs b/src/syscalls/native_syscall_handler.rs index 49ce159c2..5fae6840d 100644 --- a/src/syscalls/native_syscall_handler.rs +++ b/src/syscalls/native_syscall_handler.rs @@ -173,9 +173,9 @@ impl<'a, S: StateReader> StarkNetSyscallHandler for NativeSyscallHandler<'a, S> _gas: &mut u128, ) -> SyscallResult { let value = match self.starknet_storage_state.read(&address.to_be_bytes()) { - Ok(value) => Ok(dbg!(value)), + Ok(value) => Ok(value), Err(_e @ StateError::Io(_)) => todo!(), - Err(_) => Ok(dbg!(Felt252::zero())), + Err(_) => Ok(Felt252::zero()), }; println!("Called `storage_read({address_domain}, {address}) = {value:?}` from MLIR."); value diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index ddd4fcced..6e816a976 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -166,9 +166,7 @@ impl DeployAccount { state: &mut CachedState, block_context: &BlockContext, ) -> Result { - dbg!("handle nonce"); self.handle_nonce(state)?; - dbg!("handled nonce"); let mut transactional_state = state.create_transactional(); let mut tx_exec_info = self.apply(&mut transactional_state, block_context)?; @@ -260,7 +258,6 @@ impl DeployAccount { 0, ) .map_err::(|_| TransactionError::ResourcesCalculation)?; - dbg!(&actual_resources); Ok(TransactionExecutionInfo::new_without_fee_info( validate_info, @@ -431,7 +428,7 @@ impl DeployAccount { ) -> Result { let max_fee = value.max_fee.0; let version = Felt252::from_bytes_be(value.version.0.bytes()); - let nonce = dbg!(Felt252::from_bytes_be(value.nonce.0.bytes())); + let nonce = Felt252::from_bytes_be(value.nonce.0.bytes()); let class_hash: [u8; 32] = value.class_hash.0.bytes().try_into().unwrap(); let contract_address_salt = Felt252::from_bytes_be(value.contract_address_salt.0.bytes()); diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index a962d42d9..7bcd1a50f 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -86,7 +86,6 @@ pub fn calculate_tx_fee( .to_owned(); let l1_gas_by_cairo_usage = calculate_l1_gas_by_cairo_usage(block_context, resources)?; - dbg!(l1_gas_by_cairo_usage); let total_l1_gas_usage = gas_usage.to_f64().unwrap() + l1_gas_by_cairo_usage; Ok(total_l1_gas_usage.ceil() as u128 * gas_price) diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 296b9f6a8..0009c2245 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -72,7 +72,6 @@ impl Transaction { block_context: &BlockContext, remaining_gas: u128, ) -> Result { - dbg!("execute"); match self { Transaction::Declare(tx) => tx.execute(state, block_context), Transaction::DeclareV2(tx) => tx.execute(state, block_context), From 14576a63c622afbeac1902bd09596abcac67f441 Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 15:23:00 -0300 Subject: [PATCH 19/54] Format --- rpc_state_reader/src/utils.rs | 8 +++---- rpc_state_reader/tests/blockifier_tests.rs | 27 +++++++++++++++++----- rpc_state_reader/tests/sir_tests.rs | 13 +++++++---- src/execution/gas_usage.rs | 4 +--- src/transaction/deploy_account.rs | 4 ++-- 5 files changed, 36 insertions(+), 20 deletions(-) diff --git a/rpc_state_reader/src/utils.rs b/rpc_state_reader/src/utils.rs index 437f80b2c..59c1d9121 100644 --- a/rpc_state_reader/src/utils.rs +++ b/rpc_state_reader/src/utils.rs @@ -82,11 +82,9 @@ pub fn deserialize_transaction_json( "unimplemented invoke version: {x}" ))), }, - "DEPLOY_ACCOUNT" => { - Ok(Transaction::DeployAccount( - serde_json::from_value(transaction)?, - )) - } + "DEPLOY_ACCOUNT" => Ok(Transaction::DeployAccount(serde_json::from_value( + transaction, + )?)), x => Err(serde::de::Error::custom(format!( "unimplemented transaction type deserialization: {x}" ))), diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index 05d5521c0..0198c346c 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -6,8 +6,9 @@ use blockifier::{ state_api::{StateReader, StateResult}, }, transaction::{ - account_transaction::AccountTransaction, objects::TransactionExecutionInfo, - transactions::{ExecutableTransaction, DeployAccountTransaction}, + account_transaction::AccountTransaction, + objects::TransactionExecutionInfo, + transactions::{DeployAccountTransaction, ExecutableTransaction}, }, }; use blockifier::{ @@ -27,7 +28,10 @@ use starknet::core::types::ContractClass as SNContractClass; use starknet_api::{ block::BlockNumber, contract_address, - core::{ClassHash, CompiledClassHash, ContractAddress, Nonce, PatriciaKey, calculate_contract_address}, + core::{ + calculate_contract_address, ClassHash, CompiledClassHash, ContractAddress, Nonce, + PatriciaKey, + }, hash::{StarkFelt, StarkHash}, patricia_key, stark_felt, state::StorageKey, @@ -176,9 +180,20 @@ pub fn execute_tx( let invoke = InvokeTransaction { tx, tx_hash }; AccountTransaction::Invoke(invoke) } - SNTransaction::DeployAccount(tx) =>{ - let contract_address = calculate_contract_address(tx.contract_address_salt,tx.class_hash, &tx.constructor_calldata, ContractAddress::default()).unwrap(); - AccountTransaction::DeployAccount(DeployAccountTransaction { tx, tx_hash, contract_address: contract_address})}, + SNTransaction::DeployAccount(tx) => { + let contract_address = calculate_contract_address( + tx.contract_address_salt, + tx.class_hash, + &tx.constructor_calldata, + ContractAddress::default(), + ) + .unwrap(); + AccountTransaction::DeployAccount(DeployAccountTransaction { + tx, + tx_hash, + contract_address: contract_address, + }) + } _ => unimplemented!(), }; diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 480380670..134e54b79 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -1,6 +1,9 @@ use std::sync::Arc; -use cairo_vm::{felt::{felt_str, Felt252}, vm::errors::vm_errors::VirtualMachineError}; +use cairo_vm::{ + felt::{felt_str, Felt252}, + vm::errors::vm_errors::VirtualMachineError, +}; use pretty_assertions_sorted::{assert_eq, assert_eq_sorted}; use starknet_api::{ block::BlockNumber, @@ -28,7 +31,7 @@ use starknet_in_rust::{ state_cache::StorageEntry, BlockInfo, }, - transaction::{InvokeFunction, DeployAccount}, + transaction::{DeployAccount, InvokeFunction}, utils::{Address, ClassHash}, }; @@ -144,8 +147,10 @@ pub fn execute_tx_configurable( .unwrap() .create_for_simulation(skip_validate, false, false, false, skip_nonce_check), SNTransaction::DeployAccount(tx) => { - DeployAccount::from_sn_api_transaction(tx, chain_id.to_felt()).unwrap().create_for_simulation(skip_validate, false, false, false) - }, + DeployAccount::from_sn_api_transaction(tx, chain_id.to_felt()) + .unwrap() + .create_for_simulation(skip_validate, false, false, false) + } _ => unimplemented!(), }; diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index d0b212661..4327851eb 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -108,9 +108,7 @@ pub const fn get_onchain_data_segment_length( n_storage_changes: usize, n_deployments: usize, ) -> usize { - n_modified_contracts * 2 - + n_deployments * DEPLOYMENT_INFO_SIZE - + n_storage_changes * 2 + n_modified_contracts * 2 + n_deployments * DEPLOYMENT_INFO_SIZE + n_storage_changes * 2 } /// Calculates the cost of ConsumedMessageToL2 event emissions caused by an L1 handler with the given diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index 6e816a976..a9b304d6c 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -431,7 +431,7 @@ impl DeployAccount { let nonce = Felt252::from_bytes_be(value.nonce.0.bytes()); let class_hash: [u8; 32] = value.class_hash.0.bytes().try_into().unwrap(); let contract_address_salt = Felt252::from_bytes_be(value.contract_address_salt.0.bytes()); - + let signature = value .signature .0 @@ -445,7 +445,7 @@ impl DeployAccount { .iter() .map(|f| Felt252::from_bytes_be(f.bytes())) .collect(); - + DeployAccount::new( class_hash, max_fee, From bc06dbd29116171b7f96603ceac0bdbaebc12f70 Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 15:24:36 -0300 Subject: [PATCH 20/54] Restore blockifier version --- rpc_state_reader/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpc_state_reader/Cargo.toml b/rpc_state_reader/Cargo.toml index e99d0147a..0cdbbf8ef 100644 --- a/rpc_state_reader/Cargo.toml +++ b/rpc_state_reader/Cargo.toml @@ -21,7 +21,7 @@ flate2 = "1.0.25" serde_with = "3.0.0" dotenv = "0.15.0" cairo-vm = "0.8.5" -blockifier = { path = "../../blockifier/crates/blockifier"} +blockifier = "=0.2.0-rc0" starknet_in_rust = { path = "../", version = "0.4.0" } [dev-dependencies] From 11f9f0099e4f88d05eee42c253e150449e87e5d5 Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 15:25:43 -0300 Subject: [PATCH 21/54] Restore tests --- Cargo.lock | 2 + rpc_state_reader/tests/blockifier_tests.rs | 50 ++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 3333df779..0a838e946 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -726,6 +726,8 @@ dependencies = [ [[package]] name = "blockifier" version = "0.2.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb4d375ae4ea55963350f296c9c22f245ceff91e7c9edcd61320792901b783f" dependencies = [ "ark-ff", "ark-secp256k1", diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index 0198c346c..b5442baf0 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -254,6 +254,56 @@ fn blockifier_test_recent_tx() { .len() ); } + +#[test_case( + "0x014640564509873cf9d24a311e1207040c8b60efd38d96caef79855f0b0075d5", + 90006, + RpcChain::MainNet + => ignore["old transaction, gas mismatch"] +)] +#[test_case( + "0x025844447697eb7d5df4d8268b23aef6c11de4087936048278c2559fc35549eb", + 197000, + RpcChain::MainNet +)] +#[test_case( + "0x00164bfc80755f62de97ae7c98c9d67c1767259427bcf4ccfcc9683d44d54676", + 197000, + RpcChain::MainNet +)] +#[test_case( + "0x05d200ef175ba15d676a68b36f7a7b72c17c17604eda4c1efc2ed5e4973e2c91", + 169928, // real block 169929 + RpcChain::MainNet +)] +#[test_case( + "0x0528ec457cf8757f3eefdf3f0728ed09feeecc50fd97b1e4c5da94e27e9aa1d6", + 169928, // real block 169929 + RpcChain::MainNet +)] +#[test_case( + "0x0737677385a30ec4cbf9f6d23e74479926975b74db3d55dc5e46f4f8efee41cf", + 169928, // real block 169929 + RpcChain::MainNet + => ignore["resource mismatch"] +)] +#[test_case( + "0x026c17728b9cd08a061b1f17f08034eb70df58c1a96421e73ee6738ad258a94c", + 169928, // real block 169929 + RpcChain::MainNet +)] +#[test_case( + // review later + "0x0743092843086fa6d7f4a296a226ee23766b8acf16728aef7195ce5414dc4d84", + 186548, // real block 186549 + RpcChain::MainNet + => ignore["resource mismatch"] +)] +#[test_case( + "0x00724fc4a84f489ed032ebccebfc9541eb8dc64b0e76b933ed6fc30cd6000bd1", + 186551, // real block 186552 + RpcChain::MainNet +)] #[test_case( "0x1cbc74e101a1533082a021ce53235cfd744899b0ff948d1949a64646e0f15c2", 885298, // real block 885299 From 52fb29838f0acad542c67b88932e018ec2726b2e Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 15:27:58 -0300 Subject: [PATCH 22/54] Restore newlines --- rpc_state_reader/tests/sir_tests.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 134e54b79..902a5f25c 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -171,6 +171,7 @@ pub fn execute_tx_configurable( Default::default(), true, ); + ( tx.execute(&mut state, &block_context, u128::MAX).unwrap(), trace, @@ -291,6 +292,7 @@ fn test_get_gas_price() { )] fn starknet_in_rust_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); + let TransactionExecutionInfo { call_info, actual_fee, From b0673c4e61704c5e7960530e6505bef8f825db3f Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 15:28:34 -0300 Subject: [PATCH 23/54] Restore newlines --- src/execution/gas_usage.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index 4327851eb..ed25a0101 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -26,8 +26,10 @@ pub fn calculate_tx_gas_usage( ) -> usize { let residual_message_segment_length = get_message_segment_lenght(&l2_to_l1_messages, l1_handler_payload_size); + let residual_onchain_data_segment_length = get_onchain_data_segment_length(n_modified_contracts, n_storage_changes, n_deployments); + let n_l2_to_l1_messages = l2_to_l1_messages.len(); let n_l1_to_l2_messages = match l1_handler_payload_size { Some(_size) => 1, From c82c68284da12d574ce56d949fa3e6a2fff8b1fa Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 15:29:53 -0300 Subject: [PATCH 24/54] Remove txt file --- a.txt | 95 ----------------------------------------------------------- 1 file changed, 95 deletions(-) delete mode 100644 a.txt diff --git a/a.txt b/a.txt deleted file mode 100644 index 5df2f0968..000000000 --- a/a.txt +++ /dev/null @@ -1,95 +0,0 @@ - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 174 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 27 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 13 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 28 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 20 filtered out; finished in 0.00s - - -running 0 tests - -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.00s - From 3a0b7fed37ee96dcdd5b993a033672186a5ce26e Mon Sep 17 00:00:00 2001 From: Federica Date: Thu, 19 Oct 2023 15:46:07 -0300 Subject: [PATCH 25/54] fmt --- rpc_state_reader/tests/blockifier_tests.rs | 2 +- rpc_state_reader/tests/sir_tests.rs | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index b5442baf0..4a84bf680 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -191,7 +191,7 @@ pub fn execute_tx( AccountTransaction::DeployAccount(DeployAccountTransaction { tx, tx_hash, - contract_address: contract_address, + contract_address, }) } _ => unimplemented!(), diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 902a5f25c..951f6389b 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -1,9 +1,6 @@ use std::sync::Arc; -use cairo_vm::{ - felt::{felt_str, Felt252}, - vm::errors::vm_errors::VirtualMachineError, -}; +use cairo_vm::felt::{felt_str, Felt252}; use pretty_assertions_sorted::{assert_eq, assert_eq_sorted}; use starknet_api::{ block::BlockNumber, From 620abe34aa1a7c3bb5ab06a768a4c32f2d029153 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 23 Oct 2023 14:55:07 -0300 Subject: [PATCH 26/54] Add test case with declare --- rpc_state_reader/tests/blockifier_tests.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index 4a84bf680..9c48a4534 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -309,6 +309,11 @@ fn blockifier_test_recent_tx() { 885298, // real block 885299 RpcChain::TestNet )] +#[test_case( + "0x60506c49e65d84e2cdd0e9142dc43832a0a59cb6a9cbcce1ab4f57c20ba4afb", + 347899, // real block 347900 + RpcChain::MainNet +)] fn blockifier_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); From 0fb938d729e557246cf3bf4c20e53306f8c8a65d Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 23 Oct 2023 14:58:13 -0300 Subject: [PATCH 27/54] Deserialize Declare transactions --- rpc_state_reader/src/utils.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/rpc_state_reader/src/utils.rs b/rpc_state_reader/src/utils.rs index 59c1d9121..6ea01a72d 100644 --- a/rpc_state_reader/src/utils.rs +++ b/rpc_state_reader/src/utils.rs @@ -11,7 +11,7 @@ use starknet_api::{ core::EntryPointSelector, deprecated_contract_class::{EntryPoint, EntryPointOffset, EntryPointType}, hash::{StarkFelt, StarkHash}, - transaction::{InvokeTransaction, Transaction}, + transaction::{InvokeTransaction, Transaction, DeclareTransaction}, }; #[derive(Debug, Deserialize)] @@ -85,6 +85,20 @@ pub fn deserialize_transaction_json( "DEPLOY_ACCOUNT" => Ok(Transaction::DeployAccount(serde_json::from_value( transaction, )?)), + "DECLARE" => match tx_version.as_str() { + "0x0" => Ok(Transaction::Declare(DeclareTransaction::V0( + serde_json::from_value(transaction)?, + ))), + "0x1" => Ok(Transaction::Declare(DeclareTransaction::V1( + serde_json::from_value(transaction)?, + ))), + "0x2" => Ok(Transaction::Declare(DeclareTransaction::V2( + serde_json::from_value(transaction)?, + ))), + x => Err(serde::de::Error::custom(format!( + "unimplemented invoke version: {x}" + ))), + }, x => Err(serde::de::Error::custom(format!( "unimplemented transaction type deserialization: {x}" ))), From f2a164c30f54955b284838a5a0ad959886880f1a Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 23 Oct 2023 15:25:23 -0300 Subject: [PATCH 28/54] Create blockifier Declare transaction --- rpc_state_reader/tests/blockifier_tests.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index 9c48a4534..d8423b2af 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -8,7 +8,7 @@ use blockifier::{ transaction::{ account_transaction::AccountTransaction, objects::TransactionExecutionInfo, - transactions::{DeployAccountTransaction, ExecutableTransaction}, + transactions::{DeployAccountTransaction, ExecutableTransaction, DeclareTransaction}, }, }; use blockifier::{ @@ -194,6 +194,11 @@ pub fn execute_tx( contract_address, }) } + SNTransaction::Declare(tx) => { + let contract_class = state.get_compiled_contract_class(&tx.class_hash()).unwrap(); + let declare = DeclareTransaction::new(tx, tx_hash, contract_class).unwrap(); + AccountTransaction::Declare(declare) + } _ => unimplemented!(), }; From 41c09cd68b7513744f45697a9b10de2325831f51 Mon Sep 17 00:00:00 2001 From: fmoletta <99273364+fmoletta@users.noreply.github.com> Date: Mon, 23 Oct 2023 22:46:12 +0300 Subject: [PATCH 29/54] Fix/Refactor `State::count actual storage changes` (#1086) * Add StorageChangesCount struct * Use StorageChangesCount struct in state method * Fix implicated code * Update doc * Update test values * Rename method for consistency --- src/definitions/constants.rs | 2 +- src/execution/gas_usage.rs | 47 ++++++++++++++++-------------- src/state/cached_state.rs | 39 ++++++++++++++++--------- src/state/state_api.rs | 14 +++++++-- src/transaction/declare.rs | 2 +- src/transaction/declare_v2.rs | 2 +- src/transaction/deploy.rs | 4 +-- src/transaction/deploy_account.rs | 2 +- src/transaction/invoke_function.rs | 2 +- src/transaction/l1_handler.rs | 2 +- src/utils.rs | 16 +++------- tests/internals.rs | 4 +-- 12 files changed, 76 insertions(+), 60 deletions(-) diff --git a/src/definitions/constants.rs b/src/definitions/constants.rs index 22be16e6c..4087af325 100644 --- a/src/definitions/constants.rs +++ b/src/definitions/constants.rs @@ -7,7 +7,7 @@ use std::collections::HashMap; pub(crate) const L2_TO_L1_MSG_HEADER_SIZE: usize = 3; pub(crate) const L1_TO_L2_MSG_HEADER_SIZE: usize = 5; -pub(crate) const DEPLOYMENT_INFO_SIZE: usize = 1; +pub(crate) const CLASS_UPDATE_SIZE: usize = 1; pub(crate) const CONSUMED_MSG_TO_L2_N_TOPICS: usize = 3; pub(crate) const LOG_MSG_TO_L1_N_TOPICS: usize = 2; pub(crate) const N_DEFAULT_TOPICS: usize = 1; // Events have one default topic. diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index 683273177..85e26a90a 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -1,6 +1,7 @@ use crate::definitions::constants::*; use crate::execution::L2toL1MessageInfo; use crate::services::eth_definitions::eth_gas_constants::*; +use crate::state::state_api::StateChangesCount; /// Estimates L1 gas usage by Starknet's update state and the verifier /// @@ -19,16 +20,13 @@ use crate::services::eth_definitions::eth_gas_constants::*; /// The estimation of L1 gas usage as a `usize` value. pub fn calculate_tx_gas_usage( l2_to_l1_messages: Vec, - n_modified_contracts: usize, - n_storage_changes: usize, + state_changes: &StateChangesCount, l1_handler_payload_size: Option, - n_deployments: usize, ) -> usize { let residual_message_segment_length = get_message_segment_lenght(&l2_to_l1_messages, l1_handler_payload_size); - let residual_onchain_data_segment_length = - get_onchain_data_segment_length(n_modified_contracts, n_storage_changes, n_deployments); + let residual_onchain_data_segment_length = get_onchain_data_segment_length(state_changes); let n_l2_to_l1_messages = l2_to_l1_messages.len(); let n_l1_to_l2_messages = match l1_handler_payload_size { @@ -95,22 +93,18 @@ pub fn get_message_segment_lenght( } /// Calculates the amount of `felt252` added to the output message's segment by the given operations. -/// -/// # Parameters: -/// -/// - `n_modified_contracts`: The number of contracts modified by the transaction. -/// - `n_storage_changes`: The number of storage changes made by the transaction. -/// - `n_deployments`: The number of contracts deployed by the transaction. -/// -/// # Returns: -/// -/// The on-chain data segment length -pub const fn get_onchain_data_segment_length( - n_modified_contracts: usize, - n_storage_changes: usize, - n_deployments: usize, -) -> usize { - n_modified_contracts * 2 + n_deployments * DEPLOYMENT_INFO_SIZE + n_storage_changes * 2 +pub const fn get_onchain_data_segment_length(state_changes: &StateChangesCount) -> usize { + // For each newly modified contract: + // contract address (1 word). + // + 1 word with the following info: A flag indicating whether the class hash was updated, the + // number of entry updates, and the new nonce. + state_changes.n_modified_contracts * 2 + // For each class updated (through a deploy or a class replacement). + + state_changes.n_class_hash_updates * CLASS_UPDATE_SIZE + // For each modified storage cell: key, new value. + + state_changes.n_storage_updates * 2 + // For each compiled class updated (through declare): class_hash, compiled_class_hash + + state_changes.n_compiled_class_hash_updates * 2 } /// Calculates the cost of ConsumedMessageToL2 event emissions caused by an L1 handler with the given @@ -261,7 +255,16 @@ mod test { let message2 = L2toL1MessageInfo::new(ord_ev2, Address(1235.into())); assert_eq!( - calculate_tx_gas_usage(vec![message1, message2], 2, 2, Some(2), 1), + calculate_tx_gas_usage( + vec![message1, message2], + &StateChangesCount { + n_storage_updates: 2, + n_class_hash_updates: 1, + n_compiled_class_hash_updates: 0, + n_modified_contracts: 2 + }, + Some(2) + ), 76439 ) } diff --git a/src/state/cached_state.rs b/src/state/cached_state.rs index 4d9820c30..f47d5a60e 100644 --- a/src/state/cached_state.rs +++ b/src/state/cached_state.rs @@ -1,5 +1,5 @@ use super::{ - state_api::{State, StateReader}, + state_api::{State, StateChangesCount, StateReader}, state_cache::{StateCache, StorageEntry}, }; use crate::{ @@ -283,10 +283,10 @@ impl State for CachedState { Ok(()) } - fn count_actual_storage_changes( + fn count_actual_state_changes( &mut self, fee_token_and_sender_address: Option<(&Address, &Address)>, - ) -> Result<(usize, usize), StateError> { + ) -> Result { self.update_initial_values_of_write_only_accesses()?; let mut storage_updates = subtract_mappings( @@ -296,9 +296,16 @@ impl State for CachedState { let storage_unique_updates = storage_updates.keys().map(|k| k.0.clone()); - let class_hash_updates = subtract_mappings_keys( + let class_hash_updates: Vec<&Address> = subtract_mappings_keys( &self.cache.class_hash_writes, &self.cache.class_hash_initial_values, + ) + .collect(); + let n_class_hash_updates = class_hash_updates.len(); + + let compiled_class_hash_updates = subtract_mappings_keys( + &self.cache.compiled_class_hash_writes, + &self.cache.compiled_class_hash_initial_values, ); let nonce_updates = @@ -306,7 +313,7 @@ impl State for CachedState { let mut modified_contracts: HashSet
= HashSet::new(); modified_contracts.extend(storage_unique_updates); - modified_contracts.extend(class_hash_updates.cloned()); + modified_contracts.extend(class_hash_updates.into_iter().cloned()); modified_contracts.extend(nonce_updates.cloned()); // Add fee transfer storage update before actually charging it, as it needs to be included in the @@ -320,7 +327,12 @@ impl State for CachedState { modified_contracts.remove(fee_token_address); } - Ok((modified_contracts.len(), storage_updates.len())) + Ok(StateChangesCount { + n_storage_updates: storage_updates.len(), + n_class_hash_updates, + n_compiled_class_hash_updates: compiled_class_hash_updates.count(), + n_modified_contracts: modified_contracts.len(), + }) } /// Returns the class hash for a given contract address. @@ -800,7 +812,7 @@ mod tests { /// This test calculate the number of actual storage changes. #[test] - fn count_actual_storage_changes_test() { + fn count_actual_state_changes_test() { let state_reader = InMemoryStateReader::default(); let mut cached_state = CachedState::new(Arc::new(state_reader), HashMap::new()); @@ -822,14 +834,15 @@ mod tests { let fee_token_address = Address(123.into()); let sender_address = Address(321.into()); - let expected_changes = { - let n_storage_updates = 3 + 1; // + 1 fee transfer balance update - let n_modified_contracts = 2; - - (n_modified_contracts, n_storage_updates) + let expected_changes = StateChangesCount { + n_storage_updates: 3 + 1, // + 1 fee transfer balance update, + n_class_hash_updates: 0, + n_compiled_class_hash_updates: 0, + n_modified_contracts: 2, }; + let changes = cached_state - .count_actual_storage_changes(Some((&fee_token_address, &sender_address))) + .count_actual_state_changes(Some((&fee_token_address, &sender_address))) .unwrap(); assert_eq!(changes, expected_changes); diff --git a/src/state/state_api.rs b/src/state/state_api.rs index 818a063d6..4abe12354 100644 --- a/src/state/state_api.rs +++ b/src/state/state_api.rs @@ -26,6 +26,14 @@ pub trait StateReader { ) -> Result; } +#[derive(Debug, Clone, Eq, PartialEq)] +pub struct StateChangesCount { + pub n_storage_updates: usize, + pub n_class_hash_updates: usize, + pub n_compiled_class_hash_updates: usize, + pub n_modified_contracts: usize, +} + pub trait State { fn set_contract_class( &mut self, @@ -63,11 +71,11 @@ pub trait State { fn apply_state_update(&mut self, sate_updates: &StateDiff) -> Result<(), StateError>; - /// Counts the amount of modified contracts and the updates to the storage - fn count_actual_storage_changes( + /// Counts the amount of state changes + fn count_actual_state_changes( &mut self, fee_token_and_sender_address: Option<(&Address, &Address)>, - ) -> Result<(usize, usize), StateError>; + ) -> Result; /// Returns the class hash of the contract class at the given address. /// Returns zero by default if the value is not present diff --git a/src/transaction/declare.rs b/src/transaction/declare.rs index 11ee6ae48..7c9168fcd 100644 --- a/src/transaction/declare.rs +++ b/src/transaction/declare.rs @@ -166,7 +166,7 @@ impl Declare { } else { self.run_validate_entrypoint(state, &mut resources_manager, block_context)? }; - let changes = state.count_actual_storage_changes(Some(( + let changes = state.count_actual_state_changes(Some(( &block_context.starknet_os_config.fee_token_address, &self.sender_address, )))?; diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index 854e94468..879f4efa5 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -328,7 +328,7 @@ impl DeclareV2 { (info, gas) }; - let storage_changes = state.count_actual_storage_changes(Some(( + let storage_changes = state.count_actual_state_changes(Some(( &block_context.starknet_os_config.fee_token_address, &self.sender_address, )))?; diff --git a/src/transaction/deploy.rs b/src/transaction/deploy.rs index 9632d8786..69b5b4267 100644 --- a/src/transaction/deploy.rs +++ b/src/transaction/deploy.rs @@ -187,7 +187,7 @@ impl Deploy { let resources_manager = ExecutionResourcesManager::default(); - let changes = state.count_actual_storage_changes(None)?; + let changes = state.count_actual_state_changes(None)?; let actual_resources = calculate_tx_resources( resources_manager, &[Some(call_info.clone())], @@ -250,7 +250,7 @@ impl Deploy { block_context.validate_max_n_steps, )?; - let changes = state.count_actual_storage_changes(None)?; + let changes = state.count_actual_state_changes(None)?; let actual_resources = calculate_tx_resources( resources_manager, &[call_info.clone()], diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index 17bf5445b..b3c4988e9 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -250,7 +250,7 @@ impl DeployAccount { resources_manager, &[Some(constructor_call_info.clone()), validate_info.clone()], TransactionType::DeployAccount, - state.count_actual_storage_changes(Some(( + state.count_actual_state_changes(Some(( &block_context.starknet_os_config.fee_token_address, &self.contract_address, )))?, diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 22e89c406..f8777ec2c 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -265,7 +265,7 @@ impl InvokeFunction { remaining_gas, )? }; - let changes = state.count_actual_storage_changes(Some(( + let changes = state.count_actual_state_changes(Some(( &block_context.starknet_os_config.fee_token_address, &self.contract_address, )))?; diff --git a/src/transaction/l1_handler.rs b/src/transaction/l1_handler.rs index 39c3ab9ea..451f95af5 100644 --- a/src/transaction/l1_handler.rs +++ b/src/transaction/l1_handler.rs @@ -137,7 +137,7 @@ impl L1Handler { )? }; - let changes = state.count_actual_storage_changes(None)?; + let changes = state.count_actual_state_changes(None)?; let actual_resources = calculate_tx_resources( resources_manager, &[call_info.clone()], diff --git a/src/utils.rs b/src/utils.rs index b25b4f7ad..252c77789 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,6 +1,6 @@ use crate::core::errors::hash_errors::HashError; use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; -use crate::state::state_api::State; +use crate::state::state_api::{State, StateChangesCount}; use crate::{ definitions::transaction_type::TransactionType, execution::{ @@ -169,14 +169,11 @@ pub fn calculate_tx_resources( resources_manager: ExecutionResourcesManager, call_info: &[Option], tx_type: TransactionType, - storage_changes: (usize, usize), + state_changes: StateChangesCount, l1_handler_payload_size: Option, n_reverted_steps: usize, ) -> Result, TransactionError> { - let (n_modified_contracts, n_storage_changes) = storage_changes; - let non_optional_calls: Vec = call_info.iter().flatten().cloned().collect(); - let n_deployments = non_optional_calls.iter().map(get_call_n_deployments).sum(); let mut l2_to_l1_messages = Vec::new(); @@ -184,13 +181,8 @@ pub fn calculate_tx_resources( l2_to_l1_messages.extend(call_info.get_sorted_l2_to_l1_messages()?) } - let l1_gas_usage = calculate_tx_gas_usage( - l2_to_l1_messages, - n_modified_contracts, - n_storage_changes, - l1_handler_payload_size, - n_deployments, - ); + let l1_gas_usage = + calculate_tx_gas_usage(l2_to_l1_messages, &state_changes, l1_handler_payload_size); let cairo_usage = resources_manager.cairo_usage.clone(); let tx_syscall_counter = resources_manager.syscall_counter; diff --git a/tests/internals.rs b/tests/internals.rs index 9ca873c44..9f0ff4a81 100644 --- a/tests/internals.rs +++ b/tests/internals.rs @@ -1260,7 +1260,7 @@ fn expected_fib_transaction_execution_info( } let resources = HashMap::from([ ("n_steps".to_string(), n_steps), - ("l1_gas_usage".to_string(), 4896), + ("l1_gas_usage".to_string(), 5508), ("pedersen_builtin".to_string(), 16), ("range_check_builtin".to_string(), 104), ]); @@ -1477,7 +1477,7 @@ fn test_invoke_with_declarev2_tx() { ]; let invoke_tx = invoke_tx(calldata, u128::MAX); - let expected_gas_consumed = 4908; + let expected_gas_consumed = 5551; let result = invoke_tx .execute(state, block_context, expected_gas_consumed) .unwrap(); From 2fed600eb5a27c4665d52edf5c762241020a4ede Mon Sep 17 00:00:00 2001 From: fmoletta <99273364+fmoletta@users.noreply.github.com> Date: Mon, 23 Oct 2023 23:01:43 +0300 Subject: [PATCH 30/54] Add the ability to execute `DeployAccount` transactions using the `RpcState` (#1089) * Add test case * Fix get_onchain_data_segment_length * Debug setup * Add StorageChangesCount struct * Use StorageChangesCount struct in state method * Fix implicated code * Update doc * Update test values * Rename method for consistency * Add note comment * Remove hardcoded contract address * Remove txt files * Remove dbg prints * Remove dbg prints * Format * Restore blockifier version * Restore tests * Restore newlines * Restore newlines * Remove txt file * fmt * Fix bug in `From for CompiledClass` implementation (#1090) * Fix bug in CompiledClass * Add tests --- rpc_state_reader/src/rpc_state.rs | 7 ++-- rpc_state_reader/src/utils.rs | 3 ++ rpc_state_reader/tests/blockifier_tests.rs | 34 +++++++++++++++-- rpc_state_reader/tests/sir_tests.rs | 17 ++++++++- .../api/contract_classes/compiled_class.rs | 2 +- src/transaction/deploy_account.rs | 38 ++++++++++++++++++- 6 files changed, 92 insertions(+), 9 deletions(-) diff --git a/rpc_state_reader/src/rpc_state.rs b/rpc_state_reader/src/rpc_state.rs index 8401a897b..76bdd4922 100644 --- a/rpc_state_reader/src/rpc_state.rs +++ b/rpc_state_reader/src/rpc_state.rs @@ -418,7 +418,7 @@ impl RpcState { contract_address.0.key().clone().to_string() ]), ) - .unwrap(); + .unwrap_or_default(); ClassHash(hash) } @@ -431,7 +431,8 @@ impl RpcState { contract_address.0.key().clone().to_string() ]), ) - .unwrap() + // When running deploy_account transactions, the nonce doesn't exist on the previous block so we return 0 + .unwrap_or_default() } pub fn get_storage_at( @@ -450,7 +451,7 @@ impl RpcState { self.block.to_value().unwrap() ]), ) - .unwrap() + .unwrap_or_default() } /// Requests the given transaction to the Feeder Gateway API. diff --git a/rpc_state_reader/src/utils.rs b/rpc_state_reader/src/utils.rs index a56d9f3b7..59c1d9121 100644 --- a/rpc_state_reader/src/utils.rs +++ b/rpc_state_reader/src/utils.rs @@ -82,6 +82,9 @@ pub fn deserialize_transaction_json( "unimplemented invoke version: {x}" ))), }, + "DEPLOY_ACCOUNT" => Ok(Transaction::DeployAccount(serde_json::from_value( + transaction, + )?)), x => Err(serde::de::Error::custom(format!( "unimplemented transaction type deserialization: {x}" ))), diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index a32139934..0bcb17f0e 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -6,8 +6,9 @@ use blockifier::{ state_api::{StateReader, StateResult}, }, transaction::{ - account_transaction::AccountTransaction, objects::TransactionExecutionInfo, - transactions::ExecutableTransaction, + account_transaction::AccountTransaction, + objects::TransactionExecutionInfo, + transactions::{DeployAccountTransaction, ExecutableTransaction}, }, }; use blockifier::{ @@ -27,7 +28,10 @@ use starknet::core::types::ContractClass as SNContractClass; use starknet_api::{ block::BlockNumber, contract_address, - core::{ClassHash, CompiledClassHash, ContractAddress, Nonce, PatriciaKey}, + core::{ + calculate_contract_address, ClassHash, CompiledClassHash, ContractAddress, Nonce, + PatriciaKey, + }, hash::{StarkFelt, StarkHash}, patricia_key, stark_felt, state::StorageKey, @@ -176,6 +180,20 @@ pub fn execute_tx( let invoke = InvokeTransaction { tx, tx_hash }; AccountTransaction::Invoke(invoke) } + SNTransaction::DeployAccount(tx) => { + let contract_address = calculate_contract_address( + tx.contract_address_salt, + tx.class_hash, + &tx.constructor_calldata, + ContractAddress::default(), + ) + .unwrap(); + AccountTransaction::DeployAccount(DeployAccountTransaction { + tx, + tx_hash, + contract_address, + }) + } _ => unimplemented!(), }; @@ -286,6 +304,16 @@ fn blockifier_test_recent_tx() { 186551, // real block 186552 RpcChain::MainNet )] +#[test_case( + "0x1cbc74e101a1533082a021ce53235cfd744899b0ff948d1949a64646e0f15c2", + 885298, // real block 885299 + RpcChain::TestNet +)] +#[test_case( + "0x5a5de1f42f6005f3511ea6099daed9bcbcf9de334ee714e8563977e25f71601", + 281513, // real block 281514 + RpcChain::MainNet +)] fn blockifier_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 9cb71fe22..4fdbcbe12 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -28,7 +28,7 @@ use starknet_in_rust::{ state_cache::StorageEntry, BlockInfo, }, - transaction::InvokeFunction, + transaction::{DeployAccount, InvokeFunction}, utils::{Address, ClassHash}, }; @@ -143,6 +143,11 @@ pub fn execute_tx_configurable( SNTransaction::Invoke(tx) => InvokeFunction::from_invoke_transaction(tx, chain_id) .unwrap() .create_for_simulation(skip_validate, false, false, false, skip_nonce_check), + SNTransaction::DeployAccount(tx) => { + DeployAccount::from_sn_api_transaction(tx, chain_id.to_felt()) + .unwrap() + .create_for_simulation(skip_validate, false, false, false) + } _ => unimplemented!(), }; @@ -277,6 +282,16 @@ fn test_get_gas_price() { 317092, // real block 317093 RpcChain::MainNet )] +#[test_case( + "0x1cbc74e101a1533082a021ce53235cfd744899b0ff948d1949a64646e0f15c2", + 885298, // real block 885299 + RpcChain::TestNet +)] +#[test_case( + "0x5a5de1f42f6005f3511ea6099daed9bcbcf9de334ee714e8563977e25f71601", + 281513, // real block 281514 + RpcChain::MainNet +)] fn starknet_in_rust_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); diff --git a/src/services/api/contract_classes/compiled_class.rs b/src/services/api/contract_classes/compiled_class.rs index 7306d5756..26b56281f 100644 --- a/src/services/api/contract_classes/compiled_class.rs +++ b/src/services/api/contract_classes/compiled_class.rs @@ -130,7 +130,7 @@ impl From for CompiledClass { ) }) .collect::>(); - entry_points_by_type.insert(EntryPointType::Constructor, l1_handler_entries); + entry_points_by_type.insert(EntryPointType::L1Handler, l1_handler_entries); let v = serde_json::to_value(&_deprecated_contract_class.abi).unwrap(); let abi: Option = serde_json::from_value(v).unwrap(); diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index b3c4988e9..94fcae14f 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -400,7 +400,7 @@ impl DeployAccount { Ok(call_info) } - pub(crate) fn create_for_simulation( + pub fn create_for_simulation( &self, skip_validate: bool, skip_execute: bool, @@ -421,6 +421,42 @@ impl DeployAccount { Transaction::DeployAccount(tx) } + + pub fn from_sn_api_transaction( + value: starknet_api::transaction::DeployAccountTransaction, + chain_id: Felt252, + ) -> Result { + let max_fee = value.max_fee.0; + let version = Felt252::from_bytes_be(value.version.0.bytes()); + let nonce = Felt252::from_bytes_be(value.nonce.0.bytes()); + let class_hash: [u8; 32] = value.class_hash.0.bytes().try_into().unwrap(); + let contract_address_salt = Felt252::from_bytes_be(value.contract_address_salt.0.bytes()); + + let signature = value + .signature + .0 + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + let constructor_calldata = value + .constructor_calldata + .0 + .as_ref() + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + + DeployAccount::new( + class_hash, + max_fee, + version, + nonce, + constructor_calldata, + signature, + contract_address_salt, + chain_id, + ) + } } // ---------------------------------- From bff5b452261f32ead710cbbf35e3615dafe794c1 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 23 Oct 2023 17:10:59 -0300 Subject: [PATCH 31/54] fetch class hash from the next block in declare tx --- rpc_state_reader/tests/blockifier_tests.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index d8423b2af..f37e3c2b1 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -195,7 +195,11 @@ pub fn execute_tx( }) } SNTransaction::Declare(tx) => { - let contract_class = state.get_compiled_contract_class(&tx.class_hash()).unwrap(); + // Fetch the contract_class from the next block (as we don't have it in the previous one) + let next_block_state_reader = RpcStateReader(RpcState::new_infura(network, (block_number.next()).into())); + let mut next_block_state = CachedState::new(next_block_state_reader, Default::default()); + let contract_class = next_block_state.get_compiled_contract_class(&tx.class_hash()).unwrap(); + let declare = DeclareTransaction::new(tx, tx_hash, contract_class).unwrap(); AccountTransaction::Declare(declare) } From 219633d33ec74380b9db355fa0839013b3ddf634 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 23 Oct 2023 17:23:13 -0300 Subject: [PATCH 32/54] Return an error if a class_hash is not declared + add tests for declare tx --- rpc_state_reader/src/rpc_state.rs | 5 +-- rpc_state_reader/tests/blockifier_tests.rs | 47 ++++++++++++++++++---- rpc_state_reader/tests/sir_tests.rs | 2 +- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/rpc_state_reader/src/rpc_state.rs b/rpc_state_reader/src/rpc_state.rs index 76bdd4922..7bd19828b 100644 --- a/rpc_state_reader/src/rpc_state.rs +++ b/rpc_state_reader/src/rpc_state.rs @@ -401,12 +401,11 @@ impl RpcState { } } - pub fn get_contract_class(&self, class_hash: &ClassHash) -> SNContractClass { + pub fn get_contract_class(&self, class_hash: &ClassHash) -> Option { self.rpc_call_result( "starknet_getClass", &json!([self.block.to_value().unwrap(), class_hash.0.to_string()]), - ) - .unwrap() + ).ok() } pub fn get_class_hash_at(&self, contract_address: &ContractAddress) -> ClassHash { diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index f37e3c2b1..c91646aa5 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -3,7 +3,7 @@ use blockifier::{ execution::{contract_class::ContractClass, entry_point::CallInfo}, state::{ cached_state::{CachedState, GlobalContractCache}, - state_api::{StateReader, StateResult}, + state_api::{StateReader, StateResult}, errors::StateError, }, transaction::{ account_transaction::AccountTransaction, @@ -66,7 +66,7 @@ impl StateReader for RpcStateReader { class_hash: &ClassHash, ) -> StateResult { Ok(match self.0.get_contract_class(class_hash) { - SNContractClass::Legacy(compressed_legacy_cc) => { + Some(SNContractClass::Legacy(compressed_legacy_cc)) => { let as_str = utils::decode_reader(compressed_legacy_cc.program).unwrap(); let program = Program::from_bytes(as_str.as_bytes(), None).unwrap(); let entry_points_by_type = utils::map_entry_points_by_type_legacy( @@ -78,7 +78,7 @@ impl StateReader for RpcStateReader { }); BlockifierContractClass::V0(ContractClassV0(inner)) } - SNContractClass::Sierra(flattened_sierra_cc) => { + Some(SNContractClass::Sierra(flattened_sierra_cc)) => { let middle_sierra: utils::MiddleSierraContractClass = { let v = serde_json::to_value(flattened_sierra_cc).unwrap(); serde_json::from_value(v).unwrap() @@ -93,6 +93,7 @@ impl StateReader for RpcStateReader { let casm_cc = CasmContractClass::from_contract_class(sierra_cc, false).unwrap(); BlockifierContractClass::V1(casm_cc.try_into().unwrap()) } + None => return Err(StateError::UndeclaredClassHash(*class_hash)) }) } @@ -318,11 +319,6 @@ fn blockifier_test_recent_tx() { 885298, // real block 885299 RpcChain::TestNet )] -#[test_case( - "0x60506c49e65d84e2cdd0e9142dc43832a0a59cb6a9cbcce1ab4f57c20ba4afb", - 347899, // real block 347900 - RpcChain::MainNet -)] fn blockifier_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); @@ -394,3 +390,38 @@ fn blockifier_test_case_reverted_tx(hash: &str, block_number: u64, chain: RpcCha ); } } + +#[test_case( + // Declare tx + "0x60506c49e65d84e2cdd0e9142dc43832a0a59cb6a9cbcce1ab4f57c20ba4afb", + 347899, // real block 347900 + RpcChain::MainNet +)] +#[test_case( + // Declare tx + "0x1088aa18785779e1e8eef406dc495654ad42a9729b57969ad0dbf2189c40bee", + 271887, // real block 271888 + RpcChain::MainNet +)] +fn blockifier_test_case_declare_tx(hash: &str, block_number: u64, chain: RpcChain) { + let (tx_info, _trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); + let TransactionExecutionInfo { + execute_call_info, + actual_fee, + .. + } = tx_info; + + assert!(execute_call_info.is_none()); + + let actual_fee = actual_fee.0; + if receipt.actual_fee != actual_fee { + let diff = 100 * receipt.actual_fee.abs_diff(actual_fee) / receipt.actual_fee; + + if diff >= 5 { + assert_eq!( + actual_fee, receipt.actual_fee, + "actual_fee mismatch differs from the baseline by more than 5% ({diff}%)", + ); + } + } +} diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 951f6389b..372938d38 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -42,7 +42,7 @@ pub struct RpcStateReader(RpcState); impl StateReader for RpcStateReader { fn get_contract_class(&self, class_hash: &ClassHash) -> Result { let hash = SNClassHash(StarkHash::new(*class_hash).unwrap()); - Ok(CompiledClass::from(self.0.get_contract_class(&hash))) + Ok(CompiledClass::from(self.0.get_contract_class(&hash).unwrap())) } fn get_class_hash_at(&self, contract_address: &Address) -> Result { From 3422eec195e747710f8ff16371abb3c91fb822c2 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 23 Oct 2023 17:26:40 -0300 Subject: [PATCH 33/54] Fix error msg --- rpc_state_reader/src/utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpc_state_reader/src/utils.rs b/rpc_state_reader/src/utils.rs index 6ea01a72d..fc88c579f 100644 --- a/rpc_state_reader/src/utils.rs +++ b/rpc_state_reader/src/utils.rs @@ -96,7 +96,7 @@ pub fn deserialize_transaction_json( serde_json::from_value(transaction)?, ))), x => Err(serde::de::Error::custom(format!( - "unimplemented invoke version: {x}" + "unimplemented declare version: {x}" ))), }, x => Err(serde::de::Error::custom(format!( From fb5f2b483b76a7244993b561bac8247aa86b09c4 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 23 Oct 2023 17:59:50 -0300 Subject: [PATCH 34/54] Add support for DeclareV0-1 in sir_tests --- rpc_state_reader/src/rpc_state.rs | 3 +- rpc_state_reader/src/utils.rs | 2 +- rpc_state_reader/tests/blockifier_tests.rs | 17 +++-- rpc_state_reader/tests/sir_tests.rs | 78 +++++++++++++++++++++- 4 files changed, 89 insertions(+), 11 deletions(-) diff --git a/rpc_state_reader/src/rpc_state.rs b/rpc_state_reader/src/rpc_state.rs index 7bd19828b..cb5b0808f 100644 --- a/rpc_state_reader/src/rpc_state.rs +++ b/rpc_state_reader/src/rpc_state.rs @@ -405,7 +405,8 @@ impl RpcState { self.rpc_call_result( "starknet_getClass", &json!([self.block.to_value().unwrap(), class_hash.0.to_string()]), - ).ok() + ) + .ok() } pub fn get_class_hash_at(&self, contract_address: &ContractAddress) -> ClassHash { diff --git a/rpc_state_reader/src/utils.rs b/rpc_state_reader/src/utils.rs index fc88c579f..9a1fce09b 100644 --- a/rpc_state_reader/src/utils.rs +++ b/rpc_state_reader/src/utils.rs @@ -11,7 +11,7 @@ use starknet_api::{ core::EntryPointSelector, deprecated_contract_class::{EntryPoint, EntryPointOffset, EntryPointType}, hash::{StarkFelt, StarkHash}, - transaction::{InvokeTransaction, Transaction, DeclareTransaction}, + transaction::{DeclareTransaction, InvokeTransaction, Transaction}, }; #[derive(Debug, Deserialize)] diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index c91646aa5..354b0c013 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -3,12 +3,13 @@ use blockifier::{ execution::{contract_class::ContractClass, entry_point::CallInfo}, state::{ cached_state::{CachedState, GlobalContractCache}, - state_api::{StateReader, StateResult}, errors::StateError, + errors::StateError, + state_api::{StateReader, StateResult}, }, transaction::{ account_transaction::AccountTransaction, objects::TransactionExecutionInfo, - transactions::{DeployAccountTransaction, ExecutableTransaction, DeclareTransaction}, + transactions::{DeclareTransaction, DeployAccountTransaction, ExecutableTransaction}, }, }; use blockifier::{ @@ -93,7 +94,7 @@ impl StateReader for RpcStateReader { let casm_cc = CasmContractClass::from_contract_class(sierra_cc, false).unwrap(); BlockifierContractClass::V1(casm_cc.try_into().unwrap()) } - None => return Err(StateError::UndeclaredClassHash(*class_hash)) + None => return Err(StateError::UndeclaredClassHash(*class_hash)), }) } @@ -197,9 +198,13 @@ pub fn execute_tx( } SNTransaction::Declare(tx) => { // Fetch the contract_class from the next block (as we don't have it in the previous one) - let next_block_state_reader = RpcStateReader(RpcState::new_infura(network, (block_number.next()).into())); - let mut next_block_state = CachedState::new(next_block_state_reader, Default::default()); - let contract_class = next_block_state.get_compiled_contract_class(&tx.class_hash()).unwrap(); + let next_block_state_reader = + RpcStateReader(RpcState::new_infura(network, (block_number.next()).into())); + let mut next_block_state = + CachedState::new(next_block_state_reader, Default::default()); + let contract_class = next_block_state + .get_compiled_contract_class(&tx.class_hash()) + .unwrap(); let declare = DeclareTransaction::new(tx, tx_hash, contract_class).unwrap(); AccountTransaction::Declare(declare) diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 372938d38..5b9ad5122 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -8,7 +8,7 @@ use starknet_api::{ hash::{StarkFelt, StarkHash}, stark_felt, state::StorageKey, - transaction::{Transaction as SNTransaction, TransactionHash}, + transaction::{Transaction as SNTransaction, TransactionHash, TransactionVersion}, }; use starknet_in_rust::{ core::errors::state_errors::StateError, @@ -28,7 +28,7 @@ use starknet_in_rust::{ state_cache::StorageEntry, BlockInfo, }, - transaction::{DeployAccount, InvokeFunction}, + transaction::{Declare, DeployAccount, InvokeFunction}, utils::{Address, ClassHash}, }; @@ -42,7 +42,9 @@ pub struct RpcStateReader(RpcState); impl StateReader for RpcStateReader { fn get_contract_class(&self, class_hash: &ClassHash) -> Result { let hash = SNClassHash(StarkHash::new(*class_hash).unwrap()); - Ok(CompiledClass::from(self.0.get_contract_class(&hash).unwrap())) + Ok(CompiledClass::from( + self.0.get_contract_class(&hash).unwrap(), + )) } fn get_class_hash_at(&self, contract_address: &Address) -> Result { @@ -148,6 +150,41 @@ pub fn execute_tx_configurable( .unwrap() .create_for_simulation(skip_validate, false, false, false) } + SNTransaction::Declare(tx) => { + if tx.version() != TransactionVersion(2_u8.into()) { + // Fetch the contract_class from the next block (as we don't have it in the previous one) + let next_block_state_reader = + RpcStateReader(RpcState::new_infura(network, (block_number.next()).into())); + let mut next_block_state = + CachedState::new(Arc::new(next_block_state_reader), Default::default()); + let contract_class = match next_block_state + .get_contract_class(tx.class_hash().0.bytes().try_into().unwrap()) + .unwrap() + { + CompiledClass::Deprecated(cc) => cc.as_ref().clone(), + _ => unreachable!(), + }; + + let declare = Declare::new_with_tx_and_class_hash( + contract_class, + Address(Felt252::from_bytes_be(tx.sender_address().0.key().bytes())), + tx.max_fee().0, + Felt252::new(1), + tx.signature() + .0 + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(), + Felt252::from_bytes_be(tx.nonce().0.bytes()), + Felt252::from_bytes_be(tx_hash.0.bytes()), + tx.class_hash().0.bytes().try_into().unwrap() + ) + .unwrap(); + declare.create_for_simulation(skip_validate, false, false, false) + } else { + unimplemented!() + } + } _ => unimplemented!(), }; @@ -416,3 +453,38 @@ fn test_validate_fee(hash: &str, block_number: u64, chain: RpcChain) { assert_eq!(tx_info.actual_fee, receipt.actual_fee); assert!(tx_info_without_fee.actual_fee < tx_info.actual_fee); } + +// #[test_case( +// // Declare tx +// "0x60506c49e65d84e2cdd0e9142dc43832a0a59cb6a9cbcce1ab4f57c20ba4afb", +// 347899, // real block 347900 +// RpcChain::MainNet +// )] +#[test_case( + // Declare tx + "0x1088aa18785779e1e8eef406dc495654ad42a9729b57969ad0dbf2189c40bee", + 271887, // real block 271888 + RpcChain::MainNet +)] +fn starknet_in_rust_test_case_declare_tx(hash: &str, block_number: u64, chain: RpcChain) { + let (tx_info, _trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); + let TransactionExecutionInfo { + call_info, + actual_fee, + .. + } = tx_info; + + assert!(call_info.is_none()); + + let actual_fee = actual_fee; + if receipt.actual_fee != actual_fee { + let diff = 100 * receipt.actual_fee.abs_diff(actual_fee) / receipt.actual_fee; + + if diff >= 5 { + assert_eq!( + actual_fee, receipt.actual_fee, + "actual_fee mismatch differs from the baseline by more than 5% ({diff}%)", + ); + } + } +} From e26aa30910fe98423de781ef909dd3e0e19b7cc8 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 23 Oct 2023 18:34:21 -0300 Subject: [PATCH 35/54] Make Sierra class optional in declare v2 + other changes --- rpc_state_reader/tests/sir_tests.rs | 27 +++++++++----- src/lib.rs | 4 +- src/transaction/declare.rs | 40 +++++++++++++++++++- src/transaction/declare_v2.rs | 57 ++++++++++++++++------------- src/transaction/error.rs | 2 + tests/internals.rs | 4 +- 6 files changed, 93 insertions(+), 41 deletions(-) diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 5b9ad5122..2ab0724fc 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -151,16 +151,17 @@ pub fn execute_tx_configurable( .create_for_simulation(skip_validate, false, false, false) } SNTransaction::Declare(tx) => { + // Fetch the contract_class from the next block (as we don't have it in the previous one) + let next_block_state_reader = + RpcStateReader(RpcState::new_infura(network, (block_number.next()).into())); + let mut next_block_state = + CachedState::new(Arc::new(next_block_state_reader), Default::default()); + let contract_class = next_block_state + .get_contract_class(tx.class_hash().0.bytes().try_into().unwrap()) + .unwrap(); + if tx.version() != TransactionVersion(2_u8.into()) { - // Fetch the contract_class from the next block (as we don't have it in the previous one) - let next_block_state_reader = - RpcStateReader(RpcState::new_infura(network, (block_number.next()).into())); - let mut next_block_state = - CachedState::new(Arc::new(next_block_state_reader), Default::default()); - let contract_class = match next_block_state - .get_contract_class(tx.class_hash().0.bytes().try_into().unwrap()) - .unwrap() - { + let contract_class = match contract_class { CompiledClass::Deprecated(cc) => cc.as_ref().clone(), _ => unreachable!(), }; @@ -177,11 +178,17 @@ pub fn execute_tx_configurable( .collect(), Felt252::from_bytes_be(tx.nonce().0.bytes()), Felt252::from_bytes_be(tx_hash.0.bytes()), - tx.class_hash().0.bytes().try_into().unwrap() + tx.class_hash().0.bytes().try_into().unwrap(), ) .unwrap(); declare.create_for_simulation(skip_validate, false, false, false) } else { + let contract_class = match contract_class { + CompiledClass::Casm(cc) => cc.as_ref().clone(), + _ => unreachable!(), + }; + + //let declare = DecalreV2:: unimplemented!() } } diff --git a/src/lib.rs b/src/lib.rs index 9f9b29b15..696c2e1d1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -870,8 +870,8 @@ mod test { nonce: 0.into(), hash_value: 0.into(), compiled_class_hash: TEST_FIB_COMPILED_CONTRACT_CLASS_HASH.clone(), - sierra_contract_class, - sierra_class_hash, + sierra_contract_class: Some(sierra_contract_class), + sierra_class_hash: Some(sierra_class_hash), casm_class: Default::default(), skip_execute: false, skip_fee_transfer: false, diff --git a/src/transaction/declare.rs b/src/transaction/declare.rs index 7c9168fcd..825be2986 100644 --- a/src/transaction/declare.rs +++ b/src/transaction/declare.rs @@ -145,6 +145,44 @@ impl Declare { Ok(internal_declare) } + #[allow(clippy::too_many_arguments)] + pub fn new_with_tx_and_class_hash( + contract_class: ContractClass, + sender_address: Address, + max_fee: u128, + version: Felt252, + signature: Vec, + nonce: Felt252, + hash_value: Felt252, + class_hash: ClassHash, + ) -> Result { + let validate_entry_point_selector = VALIDATE_DECLARE_ENTRY_POINT_SELECTOR.clone(); + + let internal_declare = Declare { + class_hash, + sender_address, + validate_entry_point_selector, + version, + max_fee, + signature, + nonce, + hash_value, + contract_class, + skip_execute: false, + skip_validate: false, + skip_fee_transfer: false, + }; + + verify_version( + &internal_declare.version, + internal_declare.max_fee, + &internal_declare.nonce, + &internal_declare.signature, + )?; + + Ok(internal_declare) + } + pub fn get_calldata(&self) -> Vec { let bytes = Felt252::from_bytes_be(&self.class_hash); Vec::from([bytes]) @@ -302,7 +340,7 @@ impl Declare { Ok(tx_exec_info) } - pub(crate) fn create_for_simulation( + pub fn create_for_simulation( &self, skip_validate: bool, skip_execute: bool, diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index 879f4efa5..4f88ef143 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -42,8 +42,8 @@ pub struct DeclareV2 { pub signature: Vec, pub nonce: Felt252, pub compiled_class_hash: Felt252, - pub sierra_contract_class: SierraContractClass, - pub sierra_class_hash: Felt252, + pub sierra_contract_class: Option, + pub sierra_class_hash: Option, pub hash_value: Felt252, pub casm_class: Option, pub skip_validate: bool, @@ -89,8 +89,8 @@ impl DeclareV2 { )?; Self::new_with_sierra_class_hash_and_tx_hash( - sierra_contract_class, - sierra_class_hash, + Some(sierra_contract_class.clone()), + Some(sierra_class_hash), casm_contract_class, compiled_class_hash, sender_address, @@ -118,8 +118,8 @@ impl DeclareV2 { /// may not hold. #[allow(clippy::too_many_arguments)] pub fn new_with_sierra_class_hash_and_tx_hash( - sierra_contract_class: &SierraContractClass, - sierra_class_hash: Felt252, + sierra_contract_class: Option, + sierra_class_hash: Option, casm_contract_class: Option, compiled_class_hash: Felt252, sender_address: Address, @@ -171,7 +171,7 @@ impl DeclareV2 { /// - hash_value: The transaction hash. #[allow(clippy::too_many_arguments)] pub fn new_with_tx_hash( - sierra_contract_class: &SierraContractClass, + sierra_contract_class: Option, casm_contract_class: Option, compiled_class_hash: Felt252, sender_address: Address, @@ -181,7 +181,10 @@ impl DeclareV2 { nonce: Felt252, hash_value: Felt252, ) -> Result { - let sierra_class_hash = compute_sierra_class_hash(sierra_contract_class)?; + let sierra_class_hash = match sierra_contract_class { + Some(ref scc) => Some(compute_sierra_class_hash(scc)?), + None => None + }; Self::new_with_sierra_class_hash_and_tx_hash( sierra_contract_class, @@ -211,7 +214,7 @@ impl DeclareV2 { /// - nonce: The nonce of the contract. #[allow(clippy::too_many_arguments)] pub fn new_with_sierra_class_hash( - sierra_contract_class: &SierraContractClass, + sierra_contract_class: Option, sierra_class_hash: Felt252, casm_contract_class: Option, compiled_class_hash: Felt252, @@ -234,7 +237,7 @@ impl DeclareV2 { Self::new_with_sierra_class_hash_and_tx_hash( sierra_contract_class, - sierra_class_hash, + Some(sierra_class_hash), casm_contract_class, compiled_class_hash, sender_address, @@ -371,7 +374,7 @@ impl DeclareV2 { ) -> Result<(), TransactionError> { let casm_class = match &self.casm_class { None => { - CasmContractClass::from_contract_class(self.sierra_contract_class.clone(), true) + CasmContractClass::from_contract_class(self.sierra_contract_class.clone().ok_or(TransactionError::DeclareV2NoSierraOrCasm)?, true) .map_err(|e| TransactionError::SierraCompileError(e.to_string()))? } Some(casm_contract_class) => casm_contract_class.clone(), @@ -384,16 +387,18 @@ impl DeclareV2 { self.compiled_class_hash.to_string(), )); } - state.set_compiled_class_hash(&self.sierra_class_hash, &self.compiled_class_hash)?; + if let (Some(ref hash), Some(ref class)) = (&self.sierra_class_hash, &self.sierra_contract_class) { + state.set_compiled_class_hash(hash, &self.compiled_class_hash)?; + state.set_sierra_program( + hash, + class.sierra_program.clone(), + )?; + } state.set_contract_class( &self.compiled_class_hash.to_be_bytes(), &CompiledClass::Casm(Arc::new(casm_class)), )?; - state.set_sierra_program( - &self.sierra_class_hash, - self.sierra_contract_class.sierra_program.clone(), - )?; Ok(()) } @@ -516,7 +521,7 @@ mod tests { // create internal declare v2 let internal_declare = DeclareV2::new_with_tx_hash( - &sierra_contract_class, + Some(sierra_contract_class), None, casm_class_hash, sender_address, @@ -540,7 +545,7 @@ mod tests { // test we can retreive the data let expected_casm_class = CasmContractClass::from_contract_class( - internal_declare.sierra_contract_class.clone(), + internal_declare.sierra_contract_class.unwrap().clone(), true, ) .unwrap(); @@ -585,7 +590,7 @@ mod tests { // create internal declare v2 let internal_declare = DeclareV2::new_with_tx_hash( - &sierra_contract_class, + Some(sierra_contract_class), Some(casm_class), casm_class_hash, sender_address, @@ -609,7 +614,7 @@ mod tests { // test we can retreive the data let expected_casm_class = CasmContractClass::from_contract_class( - internal_declare.sierra_contract_class.clone(), + internal_declare.sierra_contract_class.unwrap(), true, ) .unwrap(); @@ -655,8 +660,8 @@ mod tests { // create internal declare v2 let internal_declare = DeclareV2::new_with_sierra_class_hash_and_tx_hash( - &sierra_contract_class, - sierra_class_hash, + Some(sierra_contract_class), + Some(sierra_class_hash), Some(casm_class), casm_class_hash, sender_address, @@ -680,7 +685,7 @@ mod tests { // test we can retreive the data let expected_casm_class = CasmContractClass::from_contract_class( - internal_declare.sierra_contract_class.clone(), + internal_declare.sierra_contract_class.unwrap(), true, ) .unwrap(); @@ -725,7 +730,7 @@ mod tests { // create internal declare v2 let internal_declare = DeclareV2::new_with_tx_hash( - &sierra_contract_class, + Some(sierra_contract_class), None, casm_class_hash, sender_address, @@ -749,7 +754,7 @@ mod tests { // test we can retreive the data let expected_casm_class = CasmContractClass::from_contract_class( - internal_declare.sierra_contract_class.clone(), + internal_declare.sierra_contract_class.unwrap().clone(), true, ) .unwrap(); @@ -795,7 +800,7 @@ mod tests { // create internal declare v2 let internal_declare = DeclareV2::new_with_tx_hash( - &sierra_contract_class, + Some(sierra_contract_class), None, sended_class_hash.clone(), sender_address, diff --git a/src/transaction/error.rs b/src/transaction/error.rs index c254dd152..87a1f76a5 100644 --- a/src/transaction/error.rs +++ b/src/transaction/error.rs @@ -147,4 +147,6 @@ pub enum TransactionError { InvalidCompiledClassHash(String, String), #[error(transparent)] FromByteArrayError(#[from] FromByteArrayError), + #[error("DeclareV2 transaction has neither Sierra nor Casm contract class set")] + DeclareV2NoSierraOrCasm, } diff --git a/tests/internals.rs b/tests/internals.rs index 9f0ff4a81..b7fbac854 100644 --- a/tests/internals.rs +++ b/tests/internals.rs @@ -762,8 +762,8 @@ fn declarev2_tx() -> DeclareV2 { nonce: 0.into(), hash_value: 0.into(), compiled_class_hash: casm_class_hash, - sierra_contract_class, - sierra_class_hash, + sierra_contract_class: Some(sierra_contract_class), + sierra_class_hash: Some(sierra_class_hash), casm_class: casm_class.into(), skip_execute: false, skip_fee_transfer: false, From 6a70c11cba59742fc38925e948722c1985de6001 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 23 Oct 2023 18:58:30 -0300 Subject: [PATCH 36/54] Add support for DeclareV2 --- rpc_state_reader/tests/sir_tests.rs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 2ab0724fc..889f55ac6 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -11,7 +11,7 @@ use starknet_api::{ transaction::{Transaction as SNTransaction, TransactionHash, TransactionVersion}, }; use starknet_in_rust::{ - core::errors::state_errors::StateError, + core::{contract_address::compute_casm_class_hash, errors::state_errors::StateError}, definitions::{ block_context::{BlockContext, StarknetChainId, StarknetOsConfig}, constants::{ @@ -28,7 +28,7 @@ use starknet_in_rust::{ state_cache::StorageEntry, BlockInfo, }, - transaction::{Declare, DeployAccount, InvokeFunction}, + transaction::{Declare, DeclareV2, DeployAccount, InvokeFunction}, utils::{Address, ClassHash}, }; @@ -170,7 +170,7 @@ pub fn execute_tx_configurable( contract_class, Address(Felt252::from_bytes_be(tx.sender_address().0.key().bytes())), tx.max_fee().0, - Felt252::new(1), + Felt252::from_bytes_be(tx.version().0.bytes()), tx.signature() .0 .iter() @@ -188,8 +188,25 @@ pub fn execute_tx_configurable( _ => unreachable!(), }; - //let declare = DecalreV2:: - unimplemented!() + let compiled_class_hash = compute_casm_class_hash(&contract_class).unwrap(); + + let declare = DeclareV2::new_with_tx_hash( + None, + Some(contract_class), + compiled_class_hash, + Address(Felt252::from_bytes_be(tx.sender_address().0.key().bytes())), + tx.max_fee().0, + Felt252::from_bytes_be(tx.version().0.bytes()), + tx.signature() + .0 + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(), + Felt252::from_bytes_be(tx.nonce().0.bytes()), + Felt252::from_bytes_be(tx_hash.0.bytes()), + ) + .unwrap(); + declare.create_for_simulation(skip_validate, false, false, false) } } _ => unimplemented!(), From bf55785b6bc3b33bd410b4756d709566d1897023 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 23 Oct 2023 18:58:51 -0300 Subject: [PATCH 37/54] Uncomment test --- rpc_state_reader/tests/sir_tests.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 889f55ac6..00725446a 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -478,12 +478,12 @@ fn test_validate_fee(hash: &str, block_number: u64, chain: RpcChain) { assert!(tx_info_without_fee.actual_fee < tx_info.actual_fee); } -// #[test_case( -// // Declare tx -// "0x60506c49e65d84e2cdd0e9142dc43832a0a59cb6a9cbcce1ab4f57c20ba4afb", -// 347899, // real block 347900 -// RpcChain::MainNet -// )] +#[test_case( + // Declare tx + "0x60506c49e65d84e2cdd0e9142dc43832a0a59cb6a9cbcce1ab4f57c20ba4afb", + 347899, // real block 347900 + RpcChain::MainNet +)] #[test_case( // Declare tx "0x1088aa18785779e1e8eef406dc495654ad42a9729b57969ad0dbf2189c40bee", From 5893af0b4d29b9d7cd3af5492298bb2518465331 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 23 Oct 2023 19:01:06 -0300 Subject: [PATCH 38/54] fix --- src/transaction/declare_v2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index 4f88ef143..e418cd116 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -451,7 +451,7 @@ impl DeclareV2 { // --------------- // Simulation // --------------- - pub(crate) fn create_for_simulation( + pub fn create_for_simulation( &self, skip_validate: bool, skip_execute: bool, From 200e8dee48e99b442475db16d8352c686133f4a7 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 24 Oct 2023 12:55:13 -0300 Subject: [PATCH 39/54] Use new_with_sierra_class_hash_and_tx_hash --- rpc_state_reader/tests/sir_tests.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 00725446a..fdfc19c99 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -190,8 +190,9 @@ pub fn execute_tx_configurable( let compiled_class_hash = compute_casm_class_hash(&contract_class).unwrap(); - let declare = DeclareV2::new_with_tx_hash( + let declare = DeclareV2::new_with_sierra_class_hash_and_tx_hash( None, + Some(Felt252::from_bytes_be(tx.class_hash().0.bytes())), Some(contract_class), compiled_class_hash, Address(Felt252::from_bytes_be(tx.sender_address().0.key().bytes())), From 2fefb3dda1cf00fc70e9916e71759151e2f91650 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 24 Oct 2023 12:56:46 -0300 Subject: [PATCH 40/54] use CompiledClassHash instead of CompiledClass where applicatble --- src/state/cached_state.rs | 2 +- src/state/mod.rs | 7 +++---- src/state/state_cache.rs | 24 +++++++++++------------- src/transaction/declare_v2.rs | 13 ++++++++----- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/state/cached_state.rs b/src/state/cached_state.rs index f47d5a60e..764a18384 100644 --- a/src/state/cached_state.rs +++ b/src/state/cached_state.rs @@ -266,7 +266,7 @@ impl State for CachedState { let compiled_class_hash = compiled_class_hash.to_be_bytes(); self.cache - .class_hash_to_compiled_class_hash + .compiled_class_hash_writes .insert(class_hash, compiled_class_hash); Ok(()) } diff --git a/src/state/mod.rs b/src/state/mod.rs index 06cba7613..70a884df1 100644 --- a/src/state/mod.rs +++ b/src/state/mod.rs @@ -6,8 +6,7 @@ pub mod state_cache; use crate::{ core::errors::state_errors::StateError, - services::api::contract_classes::compiled_class::CompiledClass, - utils::{get_keys, to_cache_state_storage_mapping, to_state_diff_storage_mapping}, + utils::{get_keys, to_cache_state_storage_mapping, to_state_diff_storage_mapping, CompiledClassHash}, }; use cairo_vm::{felt::Felt252, vm::runners::cairo_runner::ExecutionResources}; use getset::Getters; @@ -106,7 +105,7 @@ impl ExecutionResourcesManager { pub struct StateDiff { pub(crate) address_to_class_hash: HashMap, pub(crate) address_to_nonce: HashMap, - pub(crate) class_hash_to_compiled_class: HashMap, + pub(crate) class_hash_to_compiled_class: HashMap, pub(crate) storage_updates: HashMap>, } @@ -114,7 +113,7 @@ impl StateDiff { pub const fn new( address_to_class_hash: HashMap, address_to_nonce: HashMap, - class_hash_to_compiled_class: HashMap, + class_hash_to_compiled_class: HashMap, storage_updates: HashMap>, ) -> Self { StateDiff { diff --git a/src/state/state_cache.rs b/src/state/state_cache.rs index 6238c258d..cdd5a8726 100644 --- a/src/state/state_cache.rs +++ b/src/state/state_cache.rs @@ -1,6 +1,5 @@ use crate::{ core::errors::state_errors::StateError, - services::api::contract_classes::compiled_class::CompiledClass, utils::{Address, ClassHash, CompiledClassHash}, }; use cairo_vm::felt::Felt252; @@ -18,7 +17,7 @@ pub struct StateCache { #[get_mut = "pub"] pub(crate) class_hash_initial_values: HashMap, #[get_mut = "pub"] - pub(crate) compiled_class_hash_initial_values: HashMap, + pub(crate) compiled_class_hash_initial_values: HashMap, #[getset(get = "pub", get_mut = "pub")] pub(crate) nonce_initial_values: HashMap, #[getset(get = "pub", get_mut = "pub")] @@ -28,7 +27,7 @@ pub struct StateCache { #[get_mut = "pub"] pub(crate) class_hash_writes: HashMap, #[get_mut = "pub"] - pub(crate) compiled_class_hash_writes: HashMap, + pub(crate) compiled_class_hash_writes: HashMap, #[get_mut = "pub"] pub(crate) nonce_writes: HashMap, #[getset(get = "pub", get_mut = "pub")] @@ -43,11 +42,11 @@ impl StateCache { /// Create a new StateCache with given initial and written values for testing pub const fn new( class_hash_initial_values: HashMap, - compiled_class_hash_initial_values: HashMap, + compiled_class_hash_initial_values: HashMap, nonce_initial_values: HashMap, storage_initial_values: HashMap, class_hash_writes: HashMap, - compiled_class_hash_writes: HashMap, + compiled_class_hash_writes: HashMap, nonce_writes: HashMap, storage_writes: HashMap, class_hash_to_compiled_class_hash: HashMap, @@ -84,11 +83,11 @@ impl StateCache { #[allow(clippy::too_many_arguments)] pub const fn new_for_testing( class_hash_initial_values: HashMap, - compiled_class_hash_initial_values: HashMap, + compiled_class_hash_initial_values: HashMap, nonce_initial_values: HashMap, storage_initial_values: HashMap, class_hash_writes: HashMap, - compiled_class_hash_writes: HashMap, + compiled_class_hash_writes: HashMap, nonce_writes: HashMap, storage_writes: HashMap<(Address, [u8; 32]), Felt252>, class_hash_to_compiled_class_hash: HashMap, @@ -116,7 +115,7 @@ impl StateCache { /// Get the compiled hash for a given class hash #[allow(dead_code)] - pub(crate) fn get_compiled_class_hash(&self, class_hash: &ClassHash) -> Option<&CompiledClass> { + pub(crate) fn get_compiled_class_hash(&self, class_hash: &ClassHash) -> Option<&CompiledClassHash> { if self.compiled_class_hash_writes.contains_key(class_hash) { return self.compiled_class_hash_writes.get(class_hash); } @@ -143,7 +142,7 @@ impl StateCache { pub(crate) fn update_writes( &mut self, address_to_class_hash: &HashMap, - class_hash_to_compiled_class_hash: &HashMap, + class_hash_to_compiled_class_hash: &HashMap, address_to_nonce: &HashMap, storage_updates: &HashMap, ) { @@ -158,7 +157,7 @@ impl StateCache { pub fn set_initial_values( &mut self, address_to_class_hash: &HashMap, - class_hash_to_compiled_class: &HashMap, + class_hash_to_compiled_class: &HashMap, address_to_nonce: &HashMap, storage_updates: &HashMap, ) -> Result<(), StateError> { @@ -219,9 +218,8 @@ impl StateCache { /// Unit tests for StateCache #[cfg(test)] mod tests { - use std::sync::Arc; - use crate::services::api::contract_classes::deprecated_contract_class::ContractClass; + use crate::{services::api::contract_classes::deprecated_contract_class::ContractClass, core::contract_address::compute_deprecated_class_hash}; use super::*; @@ -232,7 +230,7 @@ mod tests { let contract_class = ContractClass::from_path("starknet_programs/raw_contract_classes/class_with_abi.json") .unwrap(); - let compiled_class = CompiledClass::Deprecated(Arc::new(contract_class)); + let compiled_class = compute_deprecated_class_hash(&contract_class).unwrap().to_be_bytes(); let class_hash_to_compiled_class_hash = HashMap::from([([8; 32], compiled_class)]); let address_to_nonce = HashMap::from([(Address(9.into()), 12.into())]); let storage_updates = HashMap::from([((Address(4.into()), [1; 32]), 18.into())]); diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index e418cd116..0dce3f1b8 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -183,7 +183,7 @@ impl DeclareV2 { ) -> Result { let sierra_class_hash = match sierra_contract_class { Some(ref scc) => Some(compute_sierra_class_hash(scc)?), - None => None + None => None, }; Self::new_with_sierra_class_hash_and_tx_hash( @@ -373,10 +373,13 @@ impl DeclareV2 { state: &mut S, ) -> Result<(), TransactionError> { let casm_class = match &self.casm_class { - None => { - CasmContractClass::from_contract_class(self.sierra_contract_class.clone().ok_or(TransactionError::DeclareV2NoSierraOrCasm)?, true) - .map_err(|e| TransactionError::SierraCompileError(e.to_string()))? - } + None => CasmContractClass::from_contract_class( + self.sierra_contract_class + .clone() + .ok_or(TransactionError::DeclareV2NoSierraOrCasm)?, + true, + ) + .map_err(|e| TransactionError::SierraCompileError(e.to_string()))?, Some(casm_contract_class) => casm_contract_class.clone(), }; From dc60e6b1fc2e95bc297f374b6121bb372bd524ac Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 24 Oct 2023 13:48:19 -0300 Subject: [PATCH 41/54] Handle nonce in declare v2 + run fmt --- src/state/mod.rs | 4 +++- src/state/state_cache.rs | 14 +++++++++++--- src/transaction/declare_v2.rs | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/state/mod.rs b/src/state/mod.rs index 70a884df1..c09d5a4e9 100644 --- a/src/state/mod.rs +++ b/src/state/mod.rs @@ -6,7 +6,9 @@ pub mod state_cache; use crate::{ core::errors::state_errors::StateError, - utils::{get_keys, to_cache_state_storage_mapping, to_state_diff_storage_mapping, CompiledClassHash}, + utils::{ + get_keys, to_cache_state_storage_mapping, to_state_diff_storage_mapping, CompiledClassHash, + }, }; use cairo_vm::{felt::Felt252, vm::runners::cairo_runner::ExecutionResources}; use getset::Getters; diff --git a/src/state/state_cache.rs b/src/state/state_cache.rs index cdd5a8726..828af1728 100644 --- a/src/state/state_cache.rs +++ b/src/state/state_cache.rs @@ -115,7 +115,10 @@ impl StateCache { /// Get the compiled hash for a given class hash #[allow(dead_code)] - pub(crate) fn get_compiled_class_hash(&self, class_hash: &ClassHash) -> Option<&CompiledClassHash> { + pub(crate) fn get_compiled_class_hash( + &self, + class_hash: &ClassHash, + ) -> Option<&CompiledClassHash> { if self.compiled_class_hash_writes.contains_key(class_hash) { return self.compiled_class_hash_writes.get(class_hash); } @@ -219,7 +222,10 @@ impl StateCache { #[cfg(test)] mod tests { - use crate::{services::api::contract_classes::deprecated_contract_class::ContractClass, core::contract_address::compute_deprecated_class_hash}; + use crate::{ + core::contract_address::compute_deprecated_class_hash, + services::api::contract_classes::deprecated_contract_class::ContractClass, + }; use super::*; @@ -230,7 +236,9 @@ mod tests { let contract_class = ContractClass::from_path("starknet_programs/raw_contract_classes/class_with_abi.json") .unwrap(); - let compiled_class = compute_deprecated_class_hash(&contract_class).unwrap().to_be_bytes(); + let compiled_class = compute_deprecated_class_hash(&contract_class) + .unwrap() + .to_be_bytes(); let class_hash_to_compiled_class_hash = HashMap::from([([8; 32], compiled_class)]); let address_to_nonce = HashMap::from([(Address(9.into()), 12.into())]); let storage_updates = HashMap::from([((Address(4.into()), [1; 32]), 18.into())]); diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index 0dce3f1b8..6108d1349 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -313,6 +313,7 @@ impl DeclareV2 { state: &mut CachedState, block_context: &BlockContext, ) -> Result { + self.handle_nonce(state)?; verify_version(&self.version, self.max_fee, &self.nonce, &self.signature)?; let initial_gas = INITIAL_GAS_COST; From 163e7ca0238f26b1b8852033843ac00295684083 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 24 Oct 2023 13:49:05 -0300 Subject: [PATCH 42/54] Set casm class before counting state changes in declare v2 --- src/transaction/declare_v2.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index 6108d1349..d9885e927 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -331,11 +331,13 @@ impl DeclareV2 { )?; (info, gas) }; + self.compile_and_store_casm_class(state)?; let storage_changes = state.count_actual_state_changes(Some(( &block_context.starknet_os_config.fee_token_address, &self.sender_address, )))?; + let actual_resources = calculate_tx_resources( resources_manager, &[execution_result.call_info.clone()], @@ -355,7 +357,6 @@ impl DeclareV2 { &mut tx_execution_context, self.skip_fee_transfer, )?; - self.compile_and_store_casm_class(state)?; let mut tx_exec_info = TransactionExecutionInfo::new_without_fee_info( execution_result.call_info, From 35154ff1d9e58382e818098611626ded1f83be5c Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 24 Oct 2023 13:50:23 -0300 Subject: [PATCH 43/54] Changes --- src/transaction/declare_v2.rs | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index d9885e927..a3b2dde16 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -392,18 +392,17 @@ impl DeclareV2 { self.compiled_class_hash.to_string(), )); } - if let (Some(ref hash), Some(ref class)) = (&self.sierra_class_hash, &self.sierra_contract_class) { - state.set_compiled_class_hash(hash, &self.compiled_class_hash)?; - state.set_sierra_program( - hash, - class.sierra_program.clone(), - )?; - } - - state.set_contract_class( - &self.compiled_class_hash.to_be_bytes(), - &CompiledClass::Casm(Arc::new(casm_class)), - )?; + if let Some(ref hash) = self.sierra_class_hash { + state.set_compiled_class_hash(hash, &self.compiled_class_hash)?; + if let Some(ref class) = self.sierra_contract_class { + state.set_sierra_program(hash, class.sierra_program.clone())?; + } + + state.set_contract_class( + &hash.to_be_bytes(), + &CompiledClass::Casm(Arc::new(casm_class)), + )?; + } Ok(()) } From ab0a4f3b0b2c152d9d8b81b49b1cef2dadbf3df6 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 24 Oct 2023 13:59:10 -0300 Subject: [PATCH 44/54] Make sierra class hash non-optional --- rpc_state_reader/tests/sir_tests.rs | 2 +- src/lib.rs | 2 +- src/transaction/declare_v2.rs | 45 +++++++++++++---------------- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index fdfc19c99..2ece8ca8b 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -192,7 +192,7 @@ pub fn execute_tx_configurable( let declare = DeclareV2::new_with_sierra_class_hash_and_tx_hash( None, - Some(Felt252::from_bytes_be(tx.class_hash().0.bytes())), + Felt252::from_bytes_be(tx.class_hash().0.bytes()), Some(contract_class), compiled_class_hash, Address(Felt252::from_bytes_be(tx.sender_address().0.key().bytes())), diff --git a/src/lib.rs b/src/lib.rs index 696c2e1d1..b306eea18 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -871,7 +871,7 @@ mod test { hash_value: 0.into(), compiled_class_hash: TEST_FIB_COMPILED_CONTRACT_CLASS_HASH.clone(), sierra_contract_class: Some(sierra_contract_class), - sierra_class_hash: Some(sierra_class_hash), + sierra_class_hash, casm_class: Default::default(), skip_execute: false, skip_fee_transfer: false, diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index a3b2dde16..ef16c2031 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -43,7 +43,7 @@ pub struct DeclareV2 { pub nonce: Felt252, pub compiled_class_hash: Felt252, pub sierra_contract_class: Option, - pub sierra_class_hash: Option, + pub sierra_class_hash: Felt252, pub hash_value: Felt252, pub casm_class: Option, pub skip_validate: bool, @@ -90,7 +90,7 @@ impl DeclareV2 { Self::new_with_sierra_class_hash_and_tx_hash( Some(sierra_contract_class.clone()), - Some(sierra_class_hash), + sierra_class_hash, casm_contract_class, compiled_class_hash, sender_address, @@ -119,7 +119,7 @@ impl DeclareV2 { #[allow(clippy::too_many_arguments)] pub fn new_with_sierra_class_hash_and_tx_hash( sierra_contract_class: Option, - sierra_class_hash: Option, + sierra_class_hash: Felt252, casm_contract_class: Option, compiled_class_hash: Felt252, sender_address: Address, @@ -171,7 +171,7 @@ impl DeclareV2 { /// - hash_value: The transaction hash. #[allow(clippy::too_many_arguments)] pub fn new_with_tx_hash( - sierra_contract_class: Option, + sierra_contract_class: &SierraContractClass, casm_contract_class: Option, compiled_class_hash: Felt252, sender_address: Address, @@ -181,13 +181,10 @@ impl DeclareV2 { nonce: Felt252, hash_value: Felt252, ) -> Result { - let sierra_class_hash = match sierra_contract_class { - Some(ref scc) => Some(compute_sierra_class_hash(scc)?), - None => None, - }; + let sierra_class_hash = compute_sierra_class_hash(sierra_contract_class)?; Self::new_with_sierra_class_hash_and_tx_hash( - sierra_contract_class, + Some(sierra_contract_class.clone()), sierra_class_hash, casm_contract_class, compiled_class_hash, @@ -237,7 +234,7 @@ impl DeclareV2 { Self::new_with_sierra_class_hash_and_tx_hash( sierra_contract_class, - Some(sierra_class_hash), + sierra_class_hash, casm_contract_class, compiled_class_hash, sender_address, @@ -392,18 +389,16 @@ impl DeclareV2 { self.compiled_class_hash.to_string(), )); } - if let Some(ref hash) = self.sierra_class_hash { - state.set_compiled_class_hash(hash, &self.compiled_class_hash)?; - if let Some(ref class) = self.sierra_contract_class { - state.set_sierra_program(hash, class.sierra_program.clone())?; - } - - state.set_contract_class( - &hash.to_be_bytes(), - &CompiledClass::Casm(Arc::new(casm_class)), - )?; + if let Some(ref class) = self.sierra_contract_class { + state.set_sierra_program(&self.sierra_class_hash, class.sierra_program.clone())?; } + state.set_compiled_class_hash(&self.sierra_class_hash, &self.compiled_class_hash)?; + state.set_contract_class( + &self.sierra_class_hash.to_be_bytes(), + &CompiledClass::Casm(Arc::new(casm_class)), + )?; + Ok(()) } @@ -525,7 +520,7 @@ mod tests { // create internal declare v2 let internal_declare = DeclareV2::new_with_tx_hash( - Some(sierra_contract_class), + &sierra_contract_class, None, casm_class_hash, sender_address, @@ -594,7 +589,7 @@ mod tests { // create internal declare v2 let internal_declare = DeclareV2::new_with_tx_hash( - Some(sierra_contract_class), + &sierra_contract_class, Some(casm_class), casm_class_hash, sender_address, @@ -665,7 +660,7 @@ mod tests { let internal_declare = DeclareV2::new_with_sierra_class_hash_and_tx_hash( Some(sierra_contract_class), - Some(sierra_class_hash), + sierra_class_hash, Some(casm_class), casm_class_hash, sender_address, @@ -734,7 +729,7 @@ mod tests { // create internal declare v2 let internal_declare = DeclareV2::new_with_tx_hash( - Some(sierra_contract_class), + &sierra_contract_class, None, casm_class_hash, sender_address, @@ -804,7 +799,7 @@ mod tests { // create internal declare v2 let internal_declare = DeclareV2::new_with_tx_hash( - Some(sierra_contract_class), + &sierra_contract_class, None, sended_class_hash.clone(), sender_address, From cd010fd1392159b0ce0c7bde86d885243df89bb5 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 24 Oct 2023 14:08:52 -0300 Subject: [PATCH 45/54] fix + clippy --- src/state/state_cache.rs | 2 +- src/transaction/declare_v2.rs | 2 +- tests/internals.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/state/state_cache.rs b/src/state/state_cache.rs index 828af1728..849702e0d 100644 --- a/src/state/state_cache.rs +++ b/src/state/state_cache.rs @@ -204,7 +204,7 @@ impl StateCache { for (k, v) in self.compiled_class_hash_writes.iter() { self.compiled_class_hash_initial_values - .insert(*k, v.clone()); + .insert(*k, *v); } for (k, v) in self.storage_writes.iter() { diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index ef16c2031..f26cc5655 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -395,7 +395,7 @@ impl DeclareV2 { state.set_compiled_class_hash(&self.sierra_class_hash, &self.compiled_class_hash)?; state.set_contract_class( - &self.sierra_class_hash.to_be_bytes(), + &self.compiled_class_hash.to_be_bytes(), &CompiledClass::Casm(Arc::new(casm_class)), )?; diff --git a/tests/internals.rs b/tests/internals.rs index b7fbac854..5807ff7e0 100644 --- a/tests/internals.rs +++ b/tests/internals.rs @@ -763,7 +763,7 @@ fn declarev2_tx() -> DeclareV2 { hash_value: 0.into(), compiled_class_hash: casm_class_hash, sierra_contract_class: Some(sierra_contract_class), - sierra_class_hash: Some(sierra_class_hash), + sierra_class_hash, casm_class: casm_class.into(), skip_execute: false, skip_fee_transfer: false, From 2ba01457f1ebd86cfdd51e69125d1bc5c470f9d0 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 24 Oct 2023 15:10:43 -0300 Subject: [PATCH 46/54] Use state_reader instead of creating a state to fetch the next block s contract classes --- rpc_state_reader/tests/blockifier_tests.rs | 6 ++---- rpc_state_reader/tests/sir_tests.rs | 4 +--- src/state/state_cache.rs | 3 +-- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index 354b0c013..def2cdd24 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -198,11 +198,9 @@ pub fn execute_tx( } SNTransaction::Declare(tx) => { // Fetch the contract_class from the next block (as we don't have it in the previous one) - let next_block_state_reader = + let mut next_block_state_reader = RpcStateReader(RpcState::new_infura(network, (block_number.next()).into())); - let mut next_block_state = - CachedState::new(next_block_state_reader, Default::default()); - let contract_class = next_block_state + let contract_class = next_block_state_reader .get_compiled_contract_class(&tx.class_hash()) .unwrap(); diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 2ece8ca8b..3e241a62f 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -154,9 +154,7 @@ pub fn execute_tx_configurable( // Fetch the contract_class from the next block (as we don't have it in the previous one) let next_block_state_reader = RpcStateReader(RpcState::new_infura(network, (block_number.next()).into())); - let mut next_block_state = - CachedState::new(Arc::new(next_block_state_reader), Default::default()); - let contract_class = next_block_state + let contract_class = next_block_state_reader .get_contract_class(tx.class_hash().0.bytes().try_into().unwrap()) .unwrap(); diff --git a/src/state/state_cache.rs b/src/state/state_cache.rs index 849702e0d..23a77400c 100644 --- a/src/state/state_cache.rs +++ b/src/state/state_cache.rs @@ -203,8 +203,7 @@ impl StateCache { } for (k, v) in self.compiled_class_hash_writes.iter() { - self.compiled_class_hash_initial_values - .insert(*k, *v); + self.compiled_class_hash_initial_values.insert(*k, *v); } for (k, v) in self.storage_writes.iter() { From 3c5f3cf3b8449a177acfca4acc40bc5ac4ef1e59 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 24 Oct 2023 15:24:07 -0300 Subject: [PATCH 47/54] Add removed test --- rpc_state_reader/tests/sir_tests.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 3e241a62f..8f1dca76f 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -347,6 +347,11 @@ fn test_get_gas_price() { 885298, // real block 885299 RpcChain::TestNet )] +#[test_case( + "0x5a5de1f42f6005f3511ea6099daed9bcbcf9de334ee714e8563977e25f71601", + 281513, // real block 281514 + RpcChain::MainNet +)] fn starknet_in_rust_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); From 5d2a42fc1e61d55d4749ca2e1dca91a3d435914b Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 24 Oct 2023 16:11:29 -0300 Subject: [PATCH 48/54] Update test values --- tests/deploy_account.rs | 2 +- tests/internals.rs | 28 +++++++++++++++++++++------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/tests/deploy_account.rs b/tests/deploy_account.rs index 24ee3b162..1b7d26f3b 100644 --- a/tests/deploy_account.rs +++ b/tests/deploy_account.rs @@ -270,7 +270,7 @@ fn internal_deploy_account_cairo1() { ("n_steps", n_steps), ("pedersen_builtin", 23), ("range_check_builtin", 87), - ("l1_gas_usage", 4284) + ("l1_gas_usage", 5508) ] .into_iter() .map(|(k, v)| (k.to_string(), v)) diff --git a/tests/internals.rs b/tests/internals.rs index 5807ff7e0..11d9b28f7 100644 --- a/tests/internals.rs +++ b/tests/internals.rs @@ -597,6 +597,20 @@ fn invoke_tx(calldata: Vec, max_fee: u128) -> InvokeFunction { .unwrap() } +fn invoke_tx_with_nonce(calldata: Vec, max_fee: u128, nonce: Felt252) -> InvokeFunction { + InvokeFunction::new( + TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), + EXECUTE_ENTRY_POINT_SELECTOR.clone(), + max_fee, + TRANSACTION_VERSION.clone(), + calldata, + vec![], + StarknetChainId::TestNet.to_felt(), + Some(nonce), + ) + .unwrap() +} + fn expected_fee_transfer_info(fee: u128) -> CallInfo { CallInfo { failure_flag: false, @@ -695,13 +709,13 @@ fn expected_fib_fee_transfer_info(fee: u128) -> CallInfo { ], }], storage_read_values: vec![ - INITIAL_BALANCE.clone() - Felt252::from(1252), + INITIAL_BALANCE.clone() - Felt252::from(3700), Felt252::zero(), - INITIAL_BALANCE.clone() - Felt252::from(1252), + INITIAL_BALANCE.clone() - Felt252::from(3700), Felt252::zero(), - Felt252::from(1252), + Felt252::from(3700), Felt252::zero(), - Felt252::from(1252), + Felt252::from(3700), Felt252::zero(), ], accessed_storage_keys: HashSet::from([ @@ -1013,7 +1027,7 @@ fn test_declarev2_tx() { ("n_steps".to_string(), 2715), ("range_check_builtin".to_string(), 63), ("pedersen_builtin".to_string(), 15), - ("l1_gas_usage".to_string(), 1224), + ("l1_gas_usage".to_string(), 3672), ]); let fee = calculate_tx_fee(&resources, *GAS_PRICE, &block_context).unwrap(); @@ -1260,7 +1274,7 @@ fn expected_fib_transaction_execution_info( } let resources = HashMap::from([ ("n_steps".to_string(), n_steps), - ("l1_gas_usage".to_string(), 5508), + ("l1_gas_usage".to_string(), 6732), ("pedersen_builtin".to_string(), 16), ("range_check_builtin".to_string(), 104), ]); @@ -1475,7 +1489,7 @@ fn test_invoke_with_declarev2_tx() { Felt252::from(0), // b Felt252::from(0), // n ]; - let invoke_tx = invoke_tx(calldata, u128::MAX); + let invoke_tx = invoke_tx_with_nonce(calldata, u128::MAX, Felt252::one()); let expected_gas_consumed = 5551; let result = invoke_tx From 7aeefc7a684d020e3864dfb5520b8ff047ef5c0e Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 25 Oct 2023 13:45:19 -0300 Subject: [PATCH 49/54] Make validate_invocation and fee_transfer_info fields optional + add L1_HANDLER transaction RpcState --- rpc_state_reader/src/lib.rs | 43 +++++++++++++++++++++++++------ rpc_state_reader/src/rpc_state.rs | 4 +-- rpc_state_reader/src/utils.rs | 1 + 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/rpc_state_reader/src/lib.rs b/rpc_state_reader/src/lib.rs index 2ae84fab1..094029c55 100644 --- a/rpc_state_reader/src/lib.rs +++ b/rpc_state_reader/src/lib.rs @@ -138,7 +138,7 @@ mod tests { ); assert_eq!( - tx_trace.validate_invocation.calldata, + tx_trace.validate_invocation.as_ref().unwrap().calldata, Some(vec![ stark_felt!("1"), stark_felt!("690c876e61beda61e994543af68038edac4e1cb1990ab06e52a2d27e56a1232"), @@ -157,9 +157,16 @@ mod tests { stark_felt!("38bd34c31a0a5c"), ]) ); - assert_eq!(tx_trace.validate_invocation.retdata, Some(vec![])); + assert_eq!( + tx_trace.validate_invocation.as_ref().unwrap().retdata, + Some(vec![]) + ); assert_eq_sorted!( - tx_trace.validate_invocation.execution_resources, + tx_trace + .validate_invocation + .as_ref() + .unwrap() + .execution_resources, ExecutionResources { n_steps: 790, n_memory_holes: 51, @@ -170,7 +177,15 @@ mod tests { ]), } ); - assert_eq!(tx_trace.validate_invocation.internal_calls.len(), 1); + assert_eq!( + tx_trace + .validate_invocation + .as_ref() + .unwrap() + .internal_calls + .len(), + 1 + ); assert_eq!( tx_trace.function_invocation.as_ref().unwrap().calldata, @@ -243,7 +258,7 @@ mod tests { ); assert_eq!( - tx_trace.fee_transfer_invocation.calldata, + tx_trace.fee_transfer_invocation.as_ref().unwrap().calldata, Some(vec![ stark_felt!("1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8"), stark_felt!("2b0322a23ba4"), @@ -251,11 +266,15 @@ mod tests { ]) ); assert_eq!( - tx_trace.fee_transfer_invocation.retdata, + tx_trace.fee_transfer_invocation.as_ref().unwrap().retdata, Some(vec![1u128.into()]) ); assert_eq_sorted!( - tx_trace.fee_transfer_invocation.execution_resources, + tx_trace + .fee_transfer_invocation + .as_ref() + .unwrap() + .execution_resources, ExecutionResources { n_steps: 586, n_memory_holes: 42, @@ -265,7 +284,15 @@ mod tests { ]), } ); - assert_eq!(tx_trace.fee_transfer_invocation.internal_calls.len(), 1); + assert_eq!( + tx_trace + .fee_transfer_invocation + .as_ref() + .unwrap() + .internal_calls + .len(), + 1 + ); } #[test] diff --git a/rpc_state_reader/src/rpc_state.rs b/rpc_state_reader/src/rpc_state.rs index cb5b0808f..60bfd21b2 100644 --- a/rpc_state_reader/src/rpc_state.rs +++ b/rpc_state_reader/src/rpc_state.rs @@ -158,9 +158,9 @@ pub struct RpcResponse { #[derive(Debug, Deserialize, Clone, Eq, PartialEq)] pub struct TransactionTrace { - pub validate_invocation: RpcCallInfo, + pub validate_invocation: Option, pub function_invocation: Option, - pub fee_transfer_invocation: RpcCallInfo, + pub fee_transfer_invocation: Option, pub signature: Vec, pub revert_error: Option, } diff --git a/rpc_state_reader/src/utils.rs b/rpc_state_reader/src/utils.rs index 9a1fce09b..1a5ecffb4 100644 --- a/rpc_state_reader/src/utils.rs +++ b/rpc_state_reader/src/utils.rs @@ -99,6 +99,7 @@ pub fn deserialize_transaction_json( "unimplemented declare version: {x}" ))), }, + "L1_HANDLER" => Ok(Transaction::L1Handler(serde_json::from_value(transaction)?)), x => Err(serde::de::Error::custom(format!( "unimplemented transaction type deserialization: {x}" ))), From b4e016d6b21172de1b8380a633e1e4fcd65a61bd Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 25 Oct 2023 14:08:08 -0300 Subject: [PATCH 50/54] Add L1Handler to blockifier_tests::execute_tx --- rpc_state_reader/tests/blockifier_tests.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index a516ff693..c134a5fae 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -9,7 +9,7 @@ use blockifier::{ transaction::{ account_transaction::AccountTransaction, objects::TransactionExecutionInfo, - transactions::{DeclareTransaction, DeployAccountTransaction, ExecutableTransaction}, + transactions::{DeclareTransaction, DeployAccountTransaction, ExecutableTransaction, L1HandlerTransaction}, }, }; use blockifier::{ @@ -207,6 +207,17 @@ pub fn execute_tx( let declare = DeclareTransaction::new(tx, tx_hash, contract_class).unwrap(); AccountTransaction::Declare(declare) } + SNTransaction::L1Handler(tx) => { + // As L1Hanlder is not an account transaction we execute it here and return the result + let blockifier_tx = L1HandlerTransaction { tx, tx_hash, paid_fee_on_l1: starknet_api::transaction::Fee(u128::MAX) }; + return ( + blockifier_tx + .execute(&mut state, &block_context, true, true) + .unwrap(), + trace, + receipt, + ); + } _ => unimplemented!(), }; From 621b962292e1ee13def77a52042d1ca92b0a4de6 Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 25 Oct 2023 14:09:27 -0300 Subject: [PATCH 51/54] Add blockifier test case --- rpc_state_reader/tests/blockifier_tests.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index c134a5fae..e7e60ed8a 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -338,6 +338,11 @@ fn blockifier_test_recent_tx() { 281513, // real block 281514 RpcChain::MainNet )] +#[test_case( + "0x26be3e906db66973de1ca5eec1ddb4f30e3087dbdce9560778937071c3d3a83", + 351268, // real block 351269 + RpcChain::MainNet +)] fn blockifier_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); From 05ef7184c42634c8430c0ab122ca670c1431b7ac Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 25 Oct 2023 14:29:44 -0300 Subject: [PATCH 52/54] Add L1Handler to sir_tests::execute_tx --- rpc_state_reader/tests/blockifier_tests.rs | 11 +++++++-- rpc_state_reader/tests/sir_tests.rs | 14 +++++++++++- src/transaction/l1_handler.rs | 26 +++++++++++++++++++++- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index e7e60ed8a..2ef3d55ea 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -9,7 +9,10 @@ use blockifier::{ transaction::{ account_transaction::AccountTransaction, objects::TransactionExecutionInfo, - transactions::{DeclareTransaction, DeployAccountTransaction, ExecutableTransaction, L1HandlerTransaction}, + transactions::{ + DeclareTransaction, DeployAccountTransaction, ExecutableTransaction, + L1HandlerTransaction, + }, }, }; use blockifier::{ @@ -209,7 +212,11 @@ pub fn execute_tx( } SNTransaction::L1Handler(tx) => { // As L1Hanlder is not an account transaction we execute it here and return the result - let blockifier_tx = L1HandlerTransaction { tx, tx_hash, paid_fee_on_l1: starknet_api::transaction::Fee(u128::MAX) }; + let blockifier_tx = L1HandlerTransaction { + tx, + tx_hash, + paid_fee_on_l1: starknet_api::transaction::Fee(u128::MAX), + }; return ( blockifier_tx .execute(&mut state, &block_context, true, true) diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 8f1dca76f..81a607e8c 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -28,7 +28,7 @@ use starknet_in_rust::{ state_cache::StorageEntry, BlockInfo, }, - transaction::{Declare, DeclareV2, DeployAccount, InvokeFunction}, + transaction::{Declare, DeclareV2, DeployAccount, InvokeFunction, L1Handler}, utils::{Address, ClassHash}, }; @@ -208,6 +208,13 @@ pub fn execute_tx_configurable( declare.create_for_simulation(skip_validate, false, false, false) } } + SNTransaction::L1Handler(tx) => L1Handler::from_sn_api_tx( + tx, + Felt252::from_bytes_be(tx_hash.0.bytes()), + Some(Felt252::from(u128::MAX)), + ) + .unwrap() + .create_for_simulation(skip_validate, false), _ => unimplemented!(), }; @@ -352,6 +359,11 @@ fn test_get_gas_price() { 281513, // real block 281514 RpcChain::MainNet )] +#[test_case( + "0x26be3e906db66973de1ca5eec1ddb4f30e3087dbdce9560778937071c3d3a83", + 351268, // real block 351269 + RpcChain::MainNet +)] fn starknet_in_rust_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); diff --git a/src/transaction/l1_handler.rs b/src/transaction/l1_handler.rs index 451f95af5..e52dddcc5 100644 --- a/src/transaction/l1_handler.rs +++ b/src/transaction/l1_handler.rs @@ -200,7 +200,7 @@ impl L1Handler { } /// Creates a L1Handler for simulation purposes. - pub(crate) fn create_for_simulation( + pub fn create_for_simulation( &self, skip_validate: bool, skip_execute: bool, @@ -213,6 +213,30 @@ impl L1Handler { Transaction::L1Handler(tx) } + + /// Creates a `L1Handler` from a starknet api `L1HandlerTransaction`. + pub fn from_sn_api_tx( + tx: starknet_api::transaction::L1HandlerTransaction, + tx_hash: Felt252, + paid_fee_on_l1: Option, + ) -> Result { + L1Handler::new_with_tx_hash( + Address(Felt252::from_bytes_be( + tx.contract_address.0.key().bytes(), + )), + Felt252::from_bytes_be( + tx.entry_point_selector.0.bytes()), + tx.calldata + .0 + .as_ref() + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(), + Felt252::from_bytes_be(tx.nonce.0.bytes()), + paid_fee_on_l1, + tx_hash + ) + } } #[cfg(test)] From 959b202b466db862463db410aee414d630814eba Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 25 Oct 2023 14:48:03 -0300 Subject: [PATCH 53/54] Add one more test case --- rpc_state_reader/tests/blockifier_tests.rs | 5 +++++ rpc_state_reader/tests/sir_tests.rs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index 2ef3d55ea..de4af1011 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -350,6 +350,11 @@ fn blockifier_test_recent_tx() { 351268, // real block 351269 RpcChain::MainNet )] +#[test_case( + "0x4f552c9430bd21ad300db56c8f4cae45d554a18fac20bf1703f180fac587d7e", + 351225, // real block 351226 + RpcChain::MainNet +)] fn blockifier_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 81a607e8c..d312e261f 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -364,6 +364,11 @@ fn test_get_gas_price() { 351268, // real block 351269 RpcChain::MainNet )] +#[test_case( + "0x4f552c9430bd21ad300db56c8f4cae45d554a18fac20bf1703f180fac587d7e", + 351225, // real block 351226 + RpcChain::MainNet +)] fn starknet_in_rust_test_case_tx(hash: &str, block_number: u64, chain: RpcChain) { let (tx_info, trace, receipt) = execute_tx(hash, chain, BlockNumber(block_number)); From 6c9f64320785f79693d5164d39c59f5d98271254 Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 25 Oct 2023 14:50:03 -0300 Subject: [PATCH 54/54] fmt --- src/transaction/l1_handler.rs | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/transaction/l1_handler.rs b/src/transaction/l1_handler.rs index e52dddcc5..a0fd8db80 100644 --- a/src/transaction/l1_handler.rs +++ b/src/transaction/l1_handler.rs @@ -200,11 +200,7 @@ impl L1Handler { } /// Creates a L1Handler for simulation purposes. - pub fn create_for_simulation( - &self, - skip_validate: bool, - skip_execute: bool, - ) -> Transaction { + pub fn create_for_simulation(&self, skip_validate: bool, skip_execute: bool) -> Transaction { let tx = L1Handler { skip_validate, skip_execute, @@ -221,20 +217,17 @@ impl L1Handler { paid_fee_on_l1: Option, ) -> Result { L1Handler::new_with_tx_hash( - Address(Felt252::from_bytes_be( - tx.contract_address.0.key().bytes(), - )), - Felt252::from_bytes_be( - tx.entry_point_selector.0.bytes()), + Address(Felt252::from_bytes_be(tx.contract_address.0.key().bytes())), + Felt252::from_bytes_be(tx.entry_point_selector.0.bytes()), tx.calldata - .0 - .as_ref() - .iter() - .map(|f| Felt252::from_bytes_be(f.bytes())) - .collect(), - Felt252::from_bytes_be(tx.nonce.0.bytes()), - paid_fee_on_l1, - tx_hash + .0 + .as_ref() + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(), + Felt252::from_bytes_be(tx.nonce.0.bytes()), + paid_fee_on_l1, + tx_hash, ) } }