From e2e2ea1f790a8ab11065058bb46a0d7d1e11e5ea Mon Sep 17 00:00:00 2001 From: mohiiit Date: Wed, 16 Oct 2024 00:01:58 +0530 Subject: [PATCH 01/10] feat: added special address with block number and block hash --- crates/client/mempool/src/block_production.rs | 25 ++++++++++++++++++- .../chain_config/src/chain_config.rs | 2 ++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/crates/client/mempool/src/block_production.rs b/crates/client/mempool/src/block_production.rs index 027dbc489..efb035207 100644 --- a/crates/client/mempool/src/block_production.rs +++ b/crates/client/mempool/src/block_production.rs @@ -405,9 +405,32 @@ impl BlockProductionTask { // Complete the block with full bouncer capacity. let start_time = Instant::now(); - let (new_state_diff, _n_executed) = + let (mut new_state_diff, _n_executed) = self.continue_block(self.backend.chain_config().bouncer_config.block_max_capacity)?; + if block_n >= 10 { + let prev_block_number = block_n - 10; + match self.backend.get_block_hash(&BlockId::Number(prev_block_number)) { + Ok(Some(prev_block_hash)) => { + let address = Felt::ONE; + new_state_diff.storage_diffs.push(ContractStorageDiffItem { + address, + storage_entries: vec![StorageEntry { + key: Felt::from(prev_block_number), + value: prev_block_hash, + }], + }); + } + Ok(None) => { + // this shouldn't happen, ideally should panic + log::error!("No block hash found for block number {}", prev_block_number); + } + Err(e) => { + log::error!("Error fetching block hash for block {}: {:?}", prev_block_number, e); + } + } + } + // Convert the pending block to a closed block and save to db. let parent_block_hash = Felt::ZERO; // temp parent block hash diff --git a/crates/primitives/chain_config/src/chain_config.rs b/crates/primitives/chain_config/src/chain_config.rs index c55ec327f..d487701b1 100644 --- a/crates/primitives/chain_config/src/chain_config.rs +++ b/crates/primitives/chain_config/src/chain_config.rs @@ -263,6 +263,8 @@ impl ChainConfig { chain_name: "Madara".into(), chain_id: ChainId::Other("MADARA_DEVNET".into()), sequencer_address: Felt::from_hex_unchecked("0x123").try_into().unwrap(), + block_time: Duration::from_secs(4), + pending_block_update_time: Duration::from_secs(1), ..ChainConfig::starknet_sepolia() } } From 91e0837e22eb63cf585d212275a68ff27741be32 Mon Sep 17 00:00:00 2001 From: mohiiit Date: Wed, 16 Oct 2024 00:21:38 +0530 Subject: [PATCH 02/10] fix: changelog and clippy --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d71ee1212..7796cf02c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Next release +- fix(snos): added special address while closing block for SNOS - fix(devnet): devnet predeployed contracts stable address across systems (re) - chore: Fixed README table format - fix(cli): fixed devnet cli arguments From a067c6a1cc7353b5b5591f213a6e0fa5a01771f2 Mon Sep 17 00:00:00 2001 From: mohiiit Date: Wed, 16 Oct 2024 03:00:57 +0530 Subject: [PATCH 03/10] comments resolved --- crates/client/mempool/src/block_production.rs | 14 +++++++++----- crates/primitives/chain_config/src/chain_config.rs | 2 -- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/crates/client/mempool/src/block_production.rs b/crates/client/mempool/src/block_production.rs index efb035207..a60faefe6 100644 --- a/crates/client/mempool/src/block_production.rs +++ b/crates/client/mempool/src/block_production.rs @@ -408,6 +408,8 @@ impl BlockProductionTask { let (mut new_state_diff, _n_executed) = self.continue_block(self.backend.chain_config().bouncer_config.block_max_capacity)?; + // SNOS requirement: For blocks >= 10, the hash of the block 10 blocks prior + // at address 0x1 with the block number as the key if block_n >= 10 { let prev_block_number = block_n - 10; match self.backend.get_block_hash(&BlockId::Number(prev_block_number)) { @@ -415,18 +417,20 @@ impl BlockProductionTask { let address = Felt::ONE; new_state_diff.storage_diffs.push(ContractStorageDiffItem { address, - storage_entries: vec![StorageEntry { - key: Felt::from(prev_block_number), - value: prev_block_hash, - }], + storage_entries: vec![StorageEntry { key: Felt::from(block_n), value: prev_block_hash }], }); } Ok(None) => { - // this shouldn't happen, ideally should panic log::error!("No block hash found for block number {}", prev_block_number); + return Err(Error::Unexpected( + format!("No block hash found for block number {}", prev_block_number).into(), + )); } Err(e) => { log::error!("Error fetching block hash for block {}: {:?}", prev_block_number, e); + return Err(Error::Unexpected( + format!("Error fetching block hash for block {}: {:?}", prev_block_number, e).into(), + )); } } } diff --git a/crates/primitives/chain_config/src/chain_config.rs b/crates/primitives/chain_config/src/chain_config.rs index d487701b1..c55ec327f 100644 --- a/crates/primitives/chain_config/src/chain_config.rs +++ b/crates/primitives/chain_config/src/chain_config.rs @@ -263,8 +263,6 @@ impl ChainConfig { chain_name: "Madara".into(), chain_id: ChainId::Other("MADARA_DEVNET".into()), sequencer_address: Felt::from_hex_unchecked("0x123").try_into().unwrap(), - block_time: Duration::from_secs(4), - pending_block_update_time: Duration::from_secs(1), ..ChainConfig::starknet_sepolia() } } From d583d7681f40ddb11a8ec4209f8f9fad63b957c5 Mon Sep 17 00:00:00 2001 From: mohiiit Date: Wed, 16 Oct 2024 09:43:46 +0530 Subject: [PATCH 04/10] fmt: removing double error logs --- crates/client/mempool/src/block_production.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/client/mempool/src/block_production.rs b/crates/client/mempool/src/block_production.rs index a60faefe6..5f9610b22 100644 --- a/crates/client/mempool/src/block_production.rs +++ b/crates/client/mempool/src/block_production.rs @@ -421,13 +421,11 @@ impl BlockProductionTask { }); } Ok(None) => { - log::error!("No block hash found for block number {}", prev_block_number); return Err(Error::Unexpected( format!("No block hash found for block number {}", prev_block_number).into(), )); } Err(e) => { - log::error!("Error fetching block hash for block {}: {:?}", prev_block_number, e); return Err(Error::Unexpected( format!("Error fetching block hash for block {}: {:?}", prev_block_number, e).into(), )); From 7381840770be925cbb279b6cb279b03513b978ef Mon Sep 17 00:00:00 2001 From: mohiiit Date: Thu, 17 Oct 2024 17:24:22 +0530 Subject: [PATCH 05/10] get storage at updated with special address case --- configs/presets/devnet.yaml | 4 +-- crates/client/mempool/src/block_production.rs | 5 +++- .../v0_7_1/methods/read/get_storage_at.rs | 29 ++++++++++++------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/configs/presets/devnet.yaml b/configs/presets/devnet.yaml index 8f559ef9f..46b051587 100644 --- a/configs/presets/devnet.yaml +++ b/configs/presets/devnet.yaml @@ -3,7 +3,7 @@ chain_id: "MADARA_DEVNET" native_fee_token_address: "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d" parent_fee_token_address: "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7" latest_protocol_version: "0.13.2" -block_time: "30s" +block_time: "10s" pending_block_update_time: "2s" execution_batch_size: 16 bouncer_config: @@ -25,5 +25,5 @@ bouncer_config: n_events: 18446744073709551615 state_diff_size: 131072 sequencer_address: "0x123" -eth_core_contract_address: "0xE2Bb56ee936fd6433DC0F6e7e3b8365C906AA057" +eth_core_contract_address: "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512" eth_gps_statement_verifier: "0xf294781D719D2F4169cE54469C28908E6FA752C1" diff --git a/crates/client/mempool/src/block_production.rs b/crates/client/mempool/src/block_production.rs index 5f9610b22..b91361981 100644 --- a/crates/client/mempool/src/block_production.rs +++ b/crates/client/mempool/src/block_production.rs @@ -417,7 +417,10 @@ impl BlockProductionTask { let address = Felt::ONE; new_state_diff.storage_diffs.push(ContractStorageDiffItem { address, - storage_entries: vec![StorageEntry { key: Felt::from(block_n), value: prev_block_hash }], + storage_entries: vec![StorageEntry { + key: Felt::from(prev_block_number), + value: prev_block_hash, + }], }); } Ok(None) => { diff --git a/crates/client/rpc/src/versions/v0_7_1/methods/read/get_storage_at.rs b/crates/client/rpc/src/versions/v0_7_1/methods/read/get_storage_at.rs index bd89fe86c..2f333b703 100644 --- a/crates/client/rpc/src/versions/v0_7_1/methods/read/get_storage_at.rs +++ b/crates/client/rpc/src/versions/v0_7_1/methods/read/get_storage_at.rs @@ -1,9 +1,9 @@ -use starknet_core::types::BlockId; -use starknet_types_core::felt::Felt; - use crate::errors::{StarknetRpcApiError, StarknetRpcResult}; use crate::utils::ResultExt; use crate::Starknet; +use mc_db::db_block_id::{DbBlockId, DbBlockIdResolvable}; +use starknet_core::types::BlockId; +use starknet_types_core::felt::Felt; /// Get the value of the storage at the given address and key. /// @@ -45,17 +45,26 @@ pub fn get_storage_at( return Err(StarknetRpcApiError::BlockNotFound); } - // Check if contract exists - starknet - .backend - .get_contract_class_hash_at(&block_id, &contract_address) // TODO: contains api without deser - .or_internal_server_error("Failed to check if contract is deployed")? - .ok_or(StarknetRpcApiError::ContractNotFound)?; + let block_number = block_id.resolve_db_block_id(&starknet.backend)?; + + // Skip contract check if block number > 10 and contract_address is Felt::ONE + let skip_contract_check = match block_number { + Some(DbBlockId::Number(num)) if num >= 10 && contract_address == Felt::ONE => true, + _ => false, + }; + + if !skip_contract_check { + starknet + .backend + .get_contract_class_hash_at(&block_id, &contract_address) + .or_internal_server_error("Failed to check if contract is deployed")? + .ok_or(StarknetRpcApiError::ContractNotFound)?; + } let storage = starknet .backend .get_contract_storage_at(&block_id, &contract_address, &key) - .or_internal_server_error("Error getting contract class hash at")? + .or_internal_server_error("Error getting contract storage at")? .unwrap_or(Felt::ZERO); Ok(storage) From f08dc892cce1ed53c643e722e2c1626d04d14acc Mon Sep 17 00:00:00 2001 From: mohiiit Date: Thu, 17 Oct 2024 22:18:09 +0530 Subject: [PATCH 06/10] refactor: get storage at updated for rpc and state reader --- .../exec/src/blockifier_state_adapter.rs | 11 ------ crates/client/mempool/src/block_production.rs | 38 ++++++++----------- 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/crates/client/exec/src/blockifier_state_adapter.rs b/crates/client/exec/src/blockifier_state_adapter.rs index bb265ccbc..ed7f16503 100644 --- a/crates/client/exec/src/blockifier_state_adapter.rs +++ b/crates/client/exec/src/blockifier_state_adapter.rs @@ -41,17 +41,6 @@ impl StateReader for BlockifierStateAdapter { ) { return Ok(Felt::ZERO); } - - return self - .backend - .get_block_hash(&BlockId::Number(requested_block_number)) - .map_err(|err| { - log::warn!("Failed to retrieve block hash for block number {requested_block_number}: {err:#}"); - StateError::StateReadError(format!( - "Failed to retrieve block hash for block number {requested_block_number}", - )) - })? - .ok_or(StateError::OldBlockHashNotProvided); } let Some(on_top_of_block_id) = self.on_top_of_block_id else { return Ok(Felt::ZERO) }; diff --git a/crates/client/mempool/src/block_production.rs b/crates/client/mempool/src/block_production.rs index b91361981..d3d5f6bb7 100644 --- a/crates/client/mempool/src/block_production.rs +++ b/crates/client/mempool/src/block_production.rs @@ -412,28 +412,22 @@ impl BlockProductionTask { // at address 0x1 with the block number as the key if block_n >= 10 { let prev_block_number = block_n - 10; - match self.backend.get_block_hash(&BlockId::Number(prev_block_number)) { - Ok(Some(prev_block_hash)) => { - let address = Felt::ONE; - new_state_diff.storage_diffs.push(ContractStorageDiffItem { - address, - storage_entries: vec![StorageEntry { - key: Felt::from(prev_block_number), - value: prev_block_hash, - }], - }); - } - Ok(None) => { - return Err(Error::Unexpected( - format!("No block hash found for block number {}", prev_block_number).into(), - )); - } - Err(e) => { - return Err(Error::Unexpected( - format!("Error fetching block hash for block {}: {:?}", prev_block_number, e).into(), - )); - } - } + let prev_block_hash = self + .backend + .get_block_hash(&BlockId::Number(prev_block_number)) + .map_err(|err| { + Error::Unexpected( + format!("Error fetching block hash for block {prev_block_number}: {err:#}").into(), + ) + })? + .ok_or_else(|| { + Error::Unexpected(format!("No block hash found for block number {prev_block_number}").into()) + })?; + let address = Felt::ONE; + new_state_diff.storage_diffs.push(ContractStorageDiffItem { + address, + storage_entries: vec![StorageEntry { key: Felt::from(block_n), value: prev_block_hash }], + }); } // Convert the pending block to a closed block and save to db. From 27ed156a2a55494d309b6cd8f09f363b373bc03c Mon Sep 17 00:00:00 2001 From: mohiiit Date: Fri, 18 Oct 2024 13:12:48 +0530 Subject: [PATCH 07/10] refactor: taking hash of madara binary while caching it --- .github/workflows/build.yml | 9 ++++++++- Cargo.lock | 1 + crates/client/exec/src/blockifier_state_adapter.rs | 1 - .../src/versions/v0_7_1/methods/read/get_storage_at.rs | 9 ++++----- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 07dfd26de..bfccf0141 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,11 +30,18 @@ jobs: - name: Build run: | cargo build --release --bin madara + - name: Generate binary hash + id: binary_hash + run: | + BINARY_PATH=./target/release/madara + HASH=$(sha256sum $BINARY_PATH | awk '{ print $1 }') + echo "hash=$HASH" >> $GITHUB_OUTPUT + echo "Hash of the binary is: $HASH" - name: Cache Madara binary uses: actions/cache@v3 with: path: target/release/madara - key: ${{ runner.os }}-madara-${{ hashFiles('Cargo.lock') }} + key: ${{ runner.os }}-madara-${{ steps.binary_hash.outputs.hash }} - name: Cache Cairo build artifacts uses: actions/cache@v3 with: diff --git a/Cargo.lock b/Cargo.lock index 63b783d50..67b1651d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5607,6 +5607,7 @@ dependencies = [ "bitvec", "blockifier", "env_logger 0.11.3", + "lazy_static", "log", "mc-block-import", "mc-db", diff --git a/crates/client/exec/src/blockifier_state_adapter.rs b/crates/client/exec/src/blockifier_state_adapter.rs index ed7f16503..5a44983b6 100644 --- a/crates/client/exec/src/blockifier_state_adapter.rs +++ b/crates/client/exec/src/blockifier_state_adapter.rs @@ -3,7 +3,6 @@ use blockifier::state::errors::StateError; use blockifier::state::state_api::{StateReader, StateResult}; use mc_db::db_block_id::DbBlockId; use mc_db::MadaraBackend; -use mp_block::BlockId; use mp_class::ClassInfo; use mp_convert::{felt_to_u64, ToFelt}; use starknet_api::core::{ChainId, ClassHash, CompiledClassHash, ContractAddress, Nonce}; diff --git a/crates/client/rpc/src/versions/v0_7_1/methods/read/get_storage_at.rs b/crates/client/rpc/src/versions/v0_7_1/methods/read/get_storage_at.rs index 2f333b703..b2d2f2813 100644 --- a/crates/client/rpc/src/versions/v0_7_1/methods/read/get_storage_at.rs +++ b/crates/client/rpc/src/versions/v0_7_1/methods/read/get_storage_at.rs @@ -47,11 +47,10 @@ pub fn get_storage_at( let block_number = block_id.resolve_db_block_id(&starknet.backend)?; - // Skip contract check if block number > 10 and contract_address is Felt::ONE - let skip_contract_check = match block_number { - Some(DbBlockId::Number(num)) if num >= 10 && contract_address == Felt::ONE => true, - _ => false, - }; + let skip_contract_check = matches!( + block_number, + Some(DbBlockId::Number(num)) if num >= 10 && contract_address == Felt::ONE + ); if !skip_contract_check { starknet From 38e7c7527de5760313db7e0c8db10646e7193216 Mon Sep 17 00:00:00 2001 From: mohiiit Date: Fri, 18 Oct 2024 13:24:05 +0530 Subject: [PATCH 08/10] refactor: js workflow udpated --- .github/workflows/starknet-js-test.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/starknet-js-test.yml b/.github/workflows/starknet-js-test.yml index 1f73acad6..2264647dd 100644 --- a/.github/workflows/starknet-js-test.yml +++ b/.github/workflows/starknet-js-test.yml @@ -9,11 +9,24 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + - name: Generate binary hash + id: binary_hash + run: | + BINARY_PATH=./target/release/madara + if [ -f "$BINARY_PATH" ]; then + HASH=$(sha256sum $BINARY_PATH | awk '{ print $1 }') + echo "hash=$HASH" >> $GITHUB_OUTPUT + echo "Hash of the binary is: $HASH" + else + echo "Binary not found, will attempt to restore from cache" + echo "hash=not_available" >> $GITHUB_OUTPUT + fi - name: Restore Madara binary uses: actions/cache@v3 + id: cache-madara with: path: target/release/madara - key: ${{ runner.os }}-madara-${{ hashFiles('Cargo.lock') }} + key: ${{ runner.os }}-madara-${{ steps.binary_hash.outputs.hash }} fail-on-cache-miss: true - name: Restore Cairo build artifacts uses: actions/cache@v3 From 04353f2384e7ddf76b344097ea5ba041ebaab96d Mon Sep 17 00:00:00 2001 From: mohiiit Date: Fri, 18 Oct 2024 13:40:04 +0530 Subject: [PATCH 09/10] refactor: js workflow updated --- .github/workflows/starknet-js-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/starknet-js-test.yml b/.github/workflows/starknet-js-test.yml index 2264647dd..0ed013bfa 100644 --- a/.github/workflows/starknet-js-test.yml +++ b/.github/workflows/starknet-js-test.yml @@ -12,7 +12,7 @@ jobs: - name: Generate binary hash id: binary_hash run: | - BINARY_PATH=./target/release/madara + BINARY_PATH=target/release/madara if [ -f "$BINARY_PATH" ]; then HASH=$(sha256sum $BINARY_PATH | awk '{ print $1 }') echo "hash=$HASH" >> $GITHUB_OUTPUT From e54670522c5f7b529903b2f18a349c83d03bd684 Mon Sep 17 00:00:00 2001 From: mohiiit Date: Fri, 18 Oct 2024 14:00:11 +0530 Subject: [PATCH 10/10] fix: fixing madara binary cache issue in workflow --- .github/workflows/build.yml | 2 +- .github/workflows/starknet-js-test.yml | 16 +++------------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bfccf0141..f2424d59f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,7 +41,7 @@ jobs: uses: actions/cache@v3 with: path: target/release/madara - key: ${{ runner.os }}-madara-${{ steps.binary_hash.outputs.hash }} + key: ${{ runner.os }}-madara-bin-${{ steps.binary_hash.outputs.hash }} - name: Cache Cairo build artifacts uses: actions/cache@v3 with: diff --git a/.github/workflows/starknet-js-test.yml b/.github/workflows/starknet-js-test.yml index 0ed013bfa..1feb0c4b3 100644 --- a/.github/workflows/starknet-js-test.yml +++ b/.github/workflows/starknet-js-test.yml @@ -9,24 +9,14 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Generate binary hash - id: binary_hash - run: | - BINARY_PATH=target/release/madara - if [ -f "$BINARY_PATH" ]; then - HASH=$(sha256sum $BINARY_PATH | awk '{ print $1 }') - echo "hash=$HASH" >> $GITHUB_OUTPUT - echo "Hash of the binary is: $HASH" - else - echo "Binary not found, will attempt to restore from cache" - echo "hash=not_available" >> $GITHUB_OUTPUT - fi - name: Restore Madara binary uses: actions/cache@v3 id: cache-madara with: path: target/release/madara - key: ${{ runner.os }}-madara-${{ steps.binary_hash.outputs.hash }} + key: ${{ runner.os }}-madara-bin- + restore-keys: | + ${{ runner.os }}-madara-bin- fail-on-cache-miss: true - name: Restore Cairo build artifacts uses: actions/cache@v3