From 98ed1d09ca94aa7f04d2bf0debac9c7c039173c9 Mon Sep 17 00:00:00 2001 From: antiyro <74653697+antiyro@users.noreply.github.com> Date: Sun, 21 Apr 2024 21:16:49 +0200 Subject: [PATCH] Fix/state root (#68) --- CHANGELOG.md | 1 + .../sync/src/commitments/transactions.rs | 31 ++++++++++--- crates/node/src/chain_spec.rs | 8 +++- crates/pallets/starknet/src/genesis_loader.rs | 43 +++++++++++++++++++ .../transactions/src/compute_hash.rs | 19 ++++---- 5 files changed, 86 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e49b81439..5545225aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ git # Deoxys Changelog ## Next release +- fix(root): fixed state commitments broken due to genesis loader - feat(docker): add dockerfile and docker-compose - fix: fix implementation `get_storage_at()` for `BlockifierStateAdapter` - fix(sync): Fix end condition of the l2 sync diff --git a/crates/client/sync/src/commitments/transactions.rs b/crates/client/sync/src/commitments/transactions.rs index 75d748501..f16f4e9bd 100644 --- a/crates/client/sync/src/commitments/transactions.rs +++ b/crates/client/sync/src/commitments/transactions.rs @@ -37,19 +37,40 @@ where let include_signature = block_number >= 61394; let signature_hash = match transaction { - Transaction::Invoke(invoke_tx) if include_signature => { + Transaction::Invoke(invoke_tx) => { // Include signatures for Invoke transactions or for all transactions - // starting from block 61394 let signature = invoke_tx.signature(); H::compute_hash_on_elements( &signature.0.iter().map(|x| Felt252Wrapper::from(*x).into()).collect::>(), ) } - _ => { - // Before block 61394, and for non-Invoke transactions, signatures are not included - H::compute_hash_on_elements(&[]) + Transaction::Declare(declare_tx) => { + // Include signatures for Declare transactions if the block number is greater than 61394 (mainnet) + if include_signature { + let signature = declare_tx.signature(); + + H::compute_hash_on_elements( + &signature.0.iter().map(|x| Felt252Wrapper::from(*x).into()).collect::>(), + ) + } else { + H::compute_hash_on_elements(&[]) + } + } + Transaction::DeployAccount(deploy_account_tx) => { + // Include signatures for DeployAccount transactions if the block number is greater than 61394 + // (mainnet) + if include_signature { + let signature = deploy_account_tx.signature(); + + H::compute_hash_on_elements( + &signature.0.iter().map(|x| Felt252Wrapper::from(*x).into()).collect::>(), + ) + } else { + H::compute_hash_on_elements(&[]) + } } + _ => H::compute_hash_on_elements(&[]), }; H::hash_elements( diff --git a/crates/node/src/chain_spec.rs b/crates/node/src/chain_spec.rs index 648b830af..6ca1df7a3 100644 --- a/crates/node/src/chain_spec.rs +++ b/crates/node/src/chain_spec.rs @@ -58,6 +58,7 @@ pub fn authority_keys_from_seed(s: &str) -> (AuraId, GrandpaId) { pub fn development_config(sealing: SealingMode) -> Result { let wasm_binary = WASM_BINARY.ok_or_else(|| "Development wasm not available".to_string())?; let chain_id = DEV_CHAIN_ID; + let genesis_loader = load_genesis()?; Ok(DevChainSpec::from_genesis( // Name @@ -68,6 +69,7 @@ pub fn development_config(sealing: SealingMode) -> Result move || { DevGenesisExt { genesis_config: testnet_genesis( + genesis_loader.clone(), wasm_binary, // Initial PoA authorities vec![authority_keys_from_seed("Alice")], @@ -92,6 +94,7 @@ pub fn development_config(sealing: SealingMode) -> Result pub fn deoxys_config(sealing: SealingMode, chain_id: &str) -> Result { let wasm_binary = WASM_BINARY.ok_or_else(|| "Development wasm not available".to_string())?; + let genesis_loader = load_genesis()?; Ok(DevChainSpec::from_genesis( // Name @@ -102,6 +105,7 @@ pub fn deoxys_config(sealing: SealingMode, chain_id: &str) -> Result Result { /// Configure initial storage state for FRAME modules. fn testnet_genesis( + genesis_loader: GenesisData, wasm_binary: &[u8], initial_authorities: Vec<(AuraId, GrandpaId)>, _enable_println: bool, ) -> RuntimeGenesisConfig { - // TODO: ensure this defaulted config isnt disturbing the genesis state - let starknet_genesis_config = GenesisConfig::default(); + let starknet_genesis_config = GenesisConfig::from(genesis_loader); RuntimeGenesisConfig { system: SystemConfig { diff --git a/crates/pallets/starknet/src/genesis_loader.rs b/crates/pallets/starknet/src/genesis_loader.rs index 962e1faf1..f4e3c0b65 100644 --- a/crates/pallets/starknet/src/genesis_loader.rs +++ b/crates/pallets/starknet/src/genesis_loader.rs @@ -62,6 +62,49 @@ impl From for GenesisConfig { } } +impl From for GenesisConfig { + fn from(data: GenesisData) -> Self { + let contracts = data + .contracts + .clone() + .into_iter() + .map(|(address, hash)| { + let address = Felt252Wrapper(address.0).into(); + let hash = Felt252Wrapper(hash.0).into(); + (address, hash) + }) + .collect::>(); + let sierra_to_casm_class_hash = data + .sierra_class_hash_to_casm_class_hash + .clone() + .into_iter() + .map(|(sierra_hash, casm_hash)| { + let sierra_hash = Felt252Wrapper(sierra_hash.0).into(); + let casm_hash = Felt252Wrapper(casm_hash.0).into(); + (sierra_hash, casm_hash) + }) + .collect::>(); + let storage = data + .storage + .clone() + .into_iter() + .map(|(contract_address, storage)| { + ( + ContractAddress(PatriciaKey(StarkFelt(contract_address.0.to_bytes_be()))), + storage + .into_iter() + .map(|(key, value)| { + (StorageKey(PatriciaKey(StarkFelt(key.0.to_bytes_be()))), StarkFelt(value.0.to_bytes_be())) + }) + .collect(), + ) + }) + .collect(); + + GenesisConfig { contracts, sierra_to_casm_class_hash, storage, ..Default::default() } + } +} + /// Create a `ContractClass` from a JSON string /// /// This function takes a JSON string (`json_str`) containing the JSON representation of a diff --git a/crates/primitives/transactions/src/compute_hash.rs b/crates/primitives/transactions/src/compute_hash.rs index e8c1f779e..8bc8fbc5a 100644 --- a/crates/primitives/transactions/src/compute_hash.rs +++ b/crates/primitives/transactions/src/compute_hash.rs @@ -15,7 +15,7 @@ use starknet_core::utils::starknet_keccak; use starknet_crypto::FieldElement; use super::SIMULATE_TX_VERSION_OFFSET; -use crate::LEGACY_BLOCK_NUMBER; +use crate::{LEGACY_BLOCK_NUMBER, LEGACY_L1_HANDLER_BLOCK}; const DECLARE_PREFIX: &[u8] = b"declare"; const DEPLOY_ACCOUNT_PREFIX: &[u8] = b"deploy_account"; @@ -495,35 +495,36 @@ impl ComputeTransactionHash for L1HandlerTransaction { let entrypoint_selector = Felt252Wrapper::from(self.entry_point_selector).into(); let calldata_hash = compute_hash_on_elements(&convert_calldata(self.calldata.clone())); let nonce = Felt252Wrapper::from(self.nonce).into(); + let chain_id = chain_id.into(); - if block_number > Some(LEGACY_BLOCK_NUMBER) && block_number.is_some() { - Felt252Wrapper(H::compute_hash_on_elements(&[ + if block_number < Some(LEGACY_L1_HANDLER_BLOCK) && block_number.is_some() { + Felt252Wrapper::from(H::compute_hash_on_elements(&[ invoke_prefix, contract_address, entrypoint_selector, calldata_hash, - chain_id.into(), + chain_id, ])) .into() } else if block_number < Some(LEGACY_BLOCK_NUMBER) && block_number.is_some() { - Felt252Wrapper(H::compute_hash_on_elements(&[ + Felt252Wrapper::from(H::compute_hash_on_elements(&[ prefix, contract_address, entrypoint_selector, calldata_hash, - chain_id.into(), + chain_id, nonce, ])) .into() } else { - Felt252Wrapper(H::compute_hash_on_elements(&[ + Felt252Wrapper::from(H::compute_hash_on_elements(&[ prefix, version, contract_address, entrypoint_selector, calldata_hash, - FieldElement::ZERO, // fees are set to 0 on l1 handlerTx - chain_id.into(), + FieldElement::ZERO, // Fees are set to zero on L1 Handler txs + chain_id, nonce, ])) .into()