diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e3813a5d..5fd511cf0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Next release +- refacor: use db hash - refactor: l2-sync - refactor: remove crate mp-mapping-sync - fix(rpc): get_nonce diff --git a/crates/client/rpc/src/events/mod.rs b/crates/client/rpc/src/events/mod.rs index 8e76166c3..88b339be2 100644 --- a/crates/client/rpc/src/events/mod.rs +++ b/crates/client/rpc/src/events/mod.rs @@ -12,6 +12,7 @@ use starknet_ff::FieldElement; use crate::deoxys_backend_client::get_block_by_block_hash; use crate::errors::StarknetRpcApiError; +use crate::utils::helpers::{block_hash_from_block_n, block_hash_from_id, block_n_from_id, txs_hashes_from_block_hash}; use crate::Starknet; impl Starknet @@ -55,7 +56,7 @@ where let (block_hash, block_number) = if block_id == BlockId::Tag(BlockTag::Pending) { (None, None) } else { - (Some(starknet_block.header().hash::().0), Some(starknet_block.header().block_number)) + (Some(block_hash_from_id(block_id)?), Some(starknet_block.header().block_number)) }; let emitted_events = tx_hash_and_events @@ -73,11 +74,11 @@ where } fn get_block_txs_hashes(&self, starknet_block: &DeoxysBlock) -> Result, StarknetRpcApiError> { - let block_hash = starknet_block.header().hash::(); + let block_number = starknet_block.header().block_number; + let block_hash = block_hash_from_block_n(block_number)?; // get txs hashes from cache or compute them - let block_txs_hashes: Vec<_> = self - .get_block_transaction_hashes(block_hash.into())? + let block_txs_hashes: Vec<_> = txs_hashes_from_block_hash(block_hash)? .into_iter() .map(|h| { Felt252Wrapper::try_from(h) @@ -130,12 +131,10 @@ where fn get_block_by_tag(&self, block_tag: BlockTag) -> Result { if block_tag == BlockTag::Latest { - self.get_block_by_number( - self.substrate_block_number_from_starknet_block(BlockId::Tag(BlockTag::Latest)).map_err(|e| { - log::error!("'{e}'"); - StarknetRpcApiError::BlockNotFound - })?, - ) + self.get_block_by_number(block_n_from_id(BlockId::Tag(BlockTag::Latest)).map_err(|e| { + log::error!("'{e}'"); + StarknetRpcApiError::BlockNotFound + })?) } else { match get_pending_block() { Some(block) => Ok(block), diff --git a/crates/client/rpc/src/lib.rs b/crates/client/rpc/src/lib.rs index 63d50a494..2e425646f 100644 --- a/crates/client/rpc/src/lib.rs +++ b/crates/client/rpc/src/lib.rs @@ -16,9 +16,7 @@ use std::sync::Arc; use errors::StarknetRpcApiError; use jsonrpsee::core::RpcResult; use jsonrpsee::proc_macros::rpc; -use mc_db::DeoxysBackend; use mc_sync::utility; -use methods::trace::utils::block_number_by_id; use mp_felt::Felt252Wrapper; use mp_hashers::HasherT; use mp_types::block::{DBlockT, DHashT, DHeaderT}; @@ -29,7 +27,6 @@ use sp_arithmetic::traits::UniqueSaturatedInto; use sp_blockchain::HeaderBackend; use sp_core::H256; use sp_runtime::traits::Header as HeaderT; -use starknet_api::hash::StarkHash; use starknet_core::serde::unsigned_field_element::UfeHex; use starknet_core::types::{ BlockHashAndNumber, BlockId, BroadcastedDeclareTransaction, BroadcastedDeployAccountTransaction, @@ -39,6 +36,7 @@ use starknet_core::types::{ MaybePendingStateUpdate, MsgFromL1, SimulatedTransaction, SimulationFlag, SimulationFlagForEstimateFee, SyncStatusType, Transaction, TransactionReceiptWithBlockInfo, TransactionStatus, TransactionTraceWithHash, }; +use utils::helpers::block_n_from_id; use crate::deoxys_backend_client::get_block_by_block_hash; use crate::methods::get_block::{ @@ -268,47 +266,11 @@ where if let BlockId::Hash(block_hash) = block_id { deoxys_backend_client::load_hash(self.client.as_ref(), Felt252Wrapper::from(block_hash).into())? } else { - let block_number = block_number_by_id(block_id)?; + let block_number = block_n_from_id(block_id)?; self.client .hash(UniqueSaturatedInto::unique_saturated_into(block_number)) .map_err(|_| StarknetRpcApiError::BlockNotFound)? } .ok_or(StarknetRpcApiError::BlockNotFound) } - - /// Helper function to get the substrate block number from a Starknet block id - /// - /// # Arguments - /// - /// * `block_id` - The Starknet block id - /// - /// # Returns - /// - /// * `u64` - The substrate block number - fn substrate_block_number_from_starknet_block(&self, block_id: BlockId) -> Result { - // Short circuit on block number - if let BlockId::Number(x) = block_id { - return Ok(x); - } - - let substrate_block_hash = self.substrate_block_hash_from_starknet_block(block_id)?; - - let starknet_block = match get_block_by_block_hash(self.client.as_ref(), substrate_block_hash) { - Ok(block) => block, - Err(_) => return Err(StarknetRpcApiError::BlockNotFound), - }; - - Ok(starknet_block.header().block_number) - } - - /// Returns a list of all transaction hashes in the given block. - /// - /// # Arguments - /// - /// * `block_hash` - The hash of the block containing the transactions (starknet block). - fn get_block_transaction_hashes(&self, block_hash: StarkHash) -> Result, StarknetRpcApiError> { - DeoxysBackend::mapping() - .transaction_hashes_from_block_hash(block_hash)? - .ok_or(StarknetRpcApiError::BlockNotFound) - } } diff --git a/crates/client/rpc/src/methods/get_block.rs b/crates/client/rpc/src/methods/get_block.rs index 5d6250a7d..515b28a47 100644 --- a/crates/client/rpc/src/methods/get_block.rs +++ b/crates/client/rpc/src/methods/get_block.rs @@ -15,7 +15,9 @@ use crate::deoxys_backend_client::get_block_by_block_hash; use crate::utils::block::{ l1_da_mode, l1_data_gas_price, l1_gas_price, new_root, parent_hash, sequencer_address, starknet_version, timestamp, }; -use crate::utils::helpers::{status, tx_conv, tx_hash_compute, tx_hash_retrieve}; +use crate::utils::helpers::{ + block_hash_from_block_n, status, tx_conv, tx_hash_compute, tx_hash_retrieve, txs_hashes_from_block_hash, +}; use crate::{Felt, Starknet}; pub(crate) fn get_block_with_tx_hashes_finalized( @@ -28,11 +30,9 @@ where H: HasherT + Send + Sync + 'static, { let starknet_block = get_block_by_block_hash(starknet.client.as_ref(), substrate_block_hash)?; - - let block_hash = starknet_block.header().hash::(); - let block_txs_hashes = tx_hash_retrieve(starknet.get_block_transaction_hashes(block_hash.into())?); - let block_number = starknet_block.header().block_number; + let block_hash = block_hash_from_block_n(block_number)?; + let block_txs_hashes = tx_hash_retrieve(txs_hashes_from_block_hash(block_hash)?); let status = status(block_number); let parent_hash = parent_hash(&starknet_block); let new_root = new_root(&starknet_block); @@ -46,7 +46,7 @@ where let block_with_tx_hashes = BlockWithTxHashes { transactions: block_txs_hashes, status, - block_hash: block_hash.into(), + block_hash, parent_hash, block_number, new_root, @@ -101,12 +101,11 @@ where H: HasherT + Send + Sync + 'static, { let starknet_block = get_block_by_block_hash(starknet.client.as_ref(), substrate_block_hash)?; + let block_number = starknet_block.header().block_number; + let block_hash = block_hash_from_block_n(block_number)?; - let block_hash = starknet_block.header().hash::(); - let block_txs_hashes = tx_hash_retrieve(starknet.get_block_transaction_hashes(block_hash.into())?); + let block_txs_hashes = tx_hash_retrieve(txs_hashes_from_block_hash(block_hash)?); let transactions = tx_conv(starknet_block.transactions(), block_txs_hashes); - - let block_number = starknet_block.header().block_number; let status = status(block_number); let parent_hash = parent_hash(&starknet_block); let new_root = new_root(&starknet_block); @@ -119,7 +118,7 @@ where let block_with_txs = BlockWithTxs { status, - block_hash: block_hash.into(), + block_hash, parent_hash, block_number, new_root, diff --git a/crates/client/rpc/src/methods/read/get_block_with_receipts.rs b/crates/client/rpc/src/methods/read/get_block_with_receipts.rs index 3b2530f1b..521b6a563 100644 --- a/crates/client/rpc/src/methods/read/get_block_with_receipts.rs +++ b/crates/client/rpc/src/methods/read/get_block_with_receipts.rs @@ -1,5 +1,4 @@ use jsonrpsee::core::RpcResult; -use mp_felt::Felt252Wrapper; use mp_hashers::HasherT; use mp_transactions::to_starknet_core_transaction::to_starknet_core_tx; use mp_types::block::DBlockT; @@ -19,7 +18,7 @@ use crate::utils::block::{ l1_da_mode, l1_data_gas_price, l1_gas_price, new_root, parent_hash, sequencer_address, starknet_version, timestamp, }; use crate::utils::execution::{block_context, re_execute_transactions}; -use crate::utils::helpers::{status, tx_hash_retrieve}; +use crate::utils::helpers::{block_hash_from_block_n, status, tx_hash_retrieve, txs_hashes_from_block_hash}; use crate::utils::transaction::blockifier_transactions; use crate::Starknet; @@ -36,11 +35,11 @@ where let block = get_block_by_block_hash(starknet.client.as_ref(), substrate_block_hash)?; let block_header = block.header(); let block_number = block_header.block_number; - let block_hash: Felt252Wrapper = block_header.hash::(); + let block_hash = block_hash_from_block_n(block_number)?; let block_context = block_context(starknet.client.as_ref(), substrate_block_hash)?; - let block_txs_hashes = tx_hash_retrieve(starknet.get_block_transaction_hashes(block_hash.into())?); + let block_txs_hashes = tx_hash_retrieve(txs_hashes_from_block_hash(block_hash)?); // create a vector of transactions with their corresponding hashes without deploy transactions, // blockifier does not support deploy transactions @@ -103,9 +102,9 @@ where } else { let block_with_receipts = BlockWithReceipts { status: status(starknet_block.header().block_number), - block_hash: starknet_block.header().hash::().into(), + block_hash, parent_hash: parent_hash(&starknet_block), - block_number: starknet_block.header().block_number, + block_number, new_root: new_root(&starknet_block), timestamp: timestamp(&starknet_block), sequencer_address: sequencer_address(&starknet_block), diff --git a/crates/client/rpc/src/methods/read/get_class.rs b/crates/client/rpc/src/methods/read/get_class.rs index 1dc9da785..fb64cc76c 100644 --- a/crates/client/rpc/src/methods/read/get_class.rs +++ b/crates/client/rpc/src/methods/read/get_class.rs @@ -5,7 +5,7 @@ use mp_felt::Felt252Wrapper; use starknet_core::types::{BlockId, ContractClass, FieldElement}; use crate::errors::StarknetRpcApiError; -use crate::methods::trace::utils::block_number_by_id; +use crate::utils::helpers::block_n_from_id; /// Get the contract class definition in the given block associated with the given hash. /// @@ -38,7 +38,7 @@ pub fn get_class(block_id: BlockId, class_hash: FieldElement) -> RpcResult= block_number_by_id(block_id)? { + if declared_at_block >= block_n_from_id(block_id)? { return Err(StarknetRpcApiError::ClassHashNotFound.into()); } Ok(ContractClassWrapper { contract: contract_class, abi, sierra_program_length, abi_length } diff --git a/crates/client/rpc/src/methods/read/get_class_at.rs b/crates/client/rpc/src/methods/read/get_class_at.rs index 394075788..5beca66b4 100644 --- a/crates/client/rpc/src/methods/read/get_class_at.rs +++ b/crates/client/rpc/src/methods/read/get_class_at.rs @@ -6,7 +6,7 @@ use starknet_api::hash::StarkFelt; use starknet_core::types::{BlockId, ContractClass, FieldElement}; use crate::errors::StarknetRpcApiError; -use crate::methods::trace::utils::block_number_by_id; +use crate::utils::helpers::block_n_from_id; /// Get the Contract Class Definition at a Given Address in a Specific Block /// @@ -28,7 +28,7 @@ use crate::methods::trace::utils::block_number_by_id; /// * `BLOCK_NOT_FOUND` - If the specified block does not exist in the blockchain. /// * `CONTRACT_NOT_FOUND` - If the specified contract address does not exist. pub fn get_class_at(block_id: BlockId, contract_address: FieldElement) -> RpcResult { - let block_number = block_number_by_id(block_id)?; + let block_number = block_n_from_id(block_id)?; let key = ContractAddress(PatriciaKey(StarkFelt(contract_address.to_bytes_be()))); let class_hash = match storage_handler::contract_class_hash().get_at(&key, block_number) { diff --git a/crates/client/rpc/src/methods/read/get_class_hash_at.rs b/crates/client/rpc/src/methods/read/get_class_hash_at.rs index a32dc9800..4f0440ca6 100644 --- a/crates/client/rpc/src/methods/read/get_class_hash_at.rs +++ b/crates/client/rpc/src/methods/read/get_class_hash_at.rs @@ -6,7 +6,7 @@ use starknet_api::hash::StarkFelt; use starknet_core::types::{BlockId, FieldElement}; use crate::errors::StarknetRpcApiError; -use crate::methods::trace::utils::block_number_by_id; +use crate::utils::helpers::block_n_from_id; use crate::Felt; /// Get the contract class hash in the given block for the contract deployed at the given @@ -22,7 +22,7 @@ use crate::Felt; /// /// * `class_hash` - The class hash of the given contract pub fn get_class_hash_at(block_id: BlockId, contract_address: FieldElement) -> RpcResult { - let block_number = block_number_by_id(block_id)?; + let block_number = block_n_from_id(block_id)?; let key = ContractAddress(PatriciaKey(StarkFelt(contract_address.to_bytes_be()))); match storage_handler::contract_class_hash().get_at(&key, block_number) { diff --git a/crates/client/rpc/src/methods/read/get_events.rs b/crates/client/rpc/src/methods/read/get_events.rs index 3b30a8969..a06af7e4d 100644 --- a/crates/client/rpc/src/methods/read/get_events.rs +++ b/crates/client/rpc/src/methods/read/get_events.rs @@ -11,6 +11,7 @@ use starknet_ff::FieldElement; use crate::constants::{MAX_EVENTS_CHUNK_SIZE, MAX_EVENTS_KEYS}; use crate::errors::StarknetRpcApiError; use crate::types::ContinuationToken; +use crate::utils::helpers::block_n_from_id; use crate::Starknet; /// Returns all events matching the given filter. @@ -52,7 +53,7 @@ where // Get the substrate block numbers for the requested range let (from_block, to_block, latest_block) = - block_range(filter.event_filter.from_block, filter.event_filter.to_block, starknet)?; + block_range(filter.event_filter.from_block, filter.event_filter.to_block)?; let continuation_token = match filter.result_page_request.continuation_token { Some(token) => ContinuationToken::parse(token).map_err(|e| { @@ -116,24 +117,15 @@ fn event_match_filter(event: &EmittedEvent, address: Option, key match_from_address && match_keys } -fn block_range( - from_block: Option, - to_block: Option, - starknet: &Starknet, -) -> Result<(u64, u64, u64), StarknetRpcApiError> -where - BE: Backend + 'static, - C: HeaderBackend + BlockBackend + StorageProvider + 'static, - H: HasherT + Send + Sync + 'static, -{ - let latest = starknet.substrate_block_number_from_starknet_block(BlockId::Tag(BlockTag::Latest)).map_err(|e| { +fn block_range(from_block: Option, to_block: Option) -> Result<(u64, u64, u64), StarknetRpcApiError> { + let latest = block_n_from_id(BlockId::Tag(BlockTag::Latest)).map_err(|e| { log::error!("'{e}'"); StarknetRpcApiError::BlockNotFound })?; let from = if from_block == Some(BlockId::Tag(BlockTag::Pending)) { latest + 1 } else { - starknet.substrate_block_number_from_starknet_block(from_block.unwrap_or(BlockId::Number(0))).map_err(|e| { + block_n_from_id(from_block.unwrap_or(BlockId::Number(0))).map_err(|e| { log::error!("'{e}'"); StarknetRpcApiError::BlockNotFound })? @@ -141,7 +133,7 @@ where let to = if to_block == Some(BlockId::Tag(BlockTag::Pending)) { latest + 1 } else { - starknet.substrate_block_number_from_starknet_block(to_block.unwrap_or(BlockId::Number(0))).map_err(|e| { + block_n_from_id(to_block.unwrap_or(BlockId::Number(0))).map_err(|e| { log::error!("'{e}'"); StarknetRpcApiError::BlockNotFound })? diff --git a/crates/client/rpc/src/methods/read/get_nonce.rs b/crates/client/rpc/src/methods/read/get_nonce.rs index 9d1e3a687..bb98240a0 100644 --- a/crates/client/rpc/src/methods/read/get_nonce.rs +++ b/crates/client/rpc/src/methods/read/get_nonce.rs @@ -6,7 +6,7 @@ use starknet_api::hash::StarkFelt; use starknet_core::types::{BlockId, FieldElement}; use crate::errors::StarknetRpcApiError; -use crate::methods::trace::utils::block_number_by_id; +use crate::utils::helpers::block_n_from_id; use crate::Felt; /// Get the nonce associated with the given address in the given block. @@ -28,7 +28,7 @@ use crate::Felt; pub fn get_nonce(block_id: BlockId, contract_address: FieldElement) -> RpcResult { let key = ContractAddress(PatriciaKey(StarkFelt(contract_address.to_bytes_be()))); - let block_number = block_number_by_id(block_id)?; + let block_number = block_n_from_id(block_id)?; match storage_handler::contract_nonces().get_at(&key, block_number) { Err(e) => { log::error!("Failed to get nonce: {e}"); diff --git a/crates/client/rpc/src/methods/read/get_state_update.rs b/crates/client/rpc/src/methods/read/get_state_update.rs index 0ce855ff2..32af750ab 100644 --- a/crates/client/rpc/src/methods/read/get_state_update.rs +++ b/crates/client/rpc/src/methods/read/get_state_update.rs @@ -12,6 +12,7 @@ use starknet_core::types::{BlockId, BlockTag, FieldElement, MaybePendingStateUpd use crate::deoxys_backend_client::get_block_by_block_hash; use crate::errors::StarknetRpcApiError; +use crate::utils::helpers::block_hash_from_block_n; use crate::Starknet; /// Get the information about the result of executing the requested block. @@ -59,10 +60,8 @@ where let substrate_block_hash = starknet.substrate_block_hash_from_starknet_block(block_id)?; let starknet_block = get_block_by_block_hash(starknet.client.as_ref(), substrate_block_hash)?; - - let block_hash = starknet_block.header().hash::().into(); - let block_number = starknet_block.header().block_number; + let block_hash = block_hash_from_block_n(block_number)?; let new_root = Felt252Wrapper::from(starknet_block.header().global_state_root).into(); diff --git a/crates/client/rpc/src/methods/read/get_storage_at.rs b/crates/client/rpc/src/methods/read/get_storage_at.rs index fa4fdee27..a908848bd 100644 --- a/crates/client/rpc/src/methods/read/get_storage_at.rs +++ b/crates/client/rpc/src/methods/read/get_storage_at.rs @@ -12,6 +12,7 @@ use starknet_api::state::StorageKey; use starknet_core::types::{BlockId, FieldElement}; use crate::errors::StarknetRpcApiError; +use crate::utils::helpers::block_n_from_id; use crate::{Felt, Starknet}; /// Get the value of the storage at the given address and key. @@ -44,7 +45,7 @@ use crate::{Felt, Starknet}; /// * `STORAGE_KEY_NOT_FOUND` - If the specified storage key does not exist within the given /// contract. pub fn get_storage_at( - starknet: &Starknet, + _starknet: &Starknet, contract_address: FieldElement, key: FieldElement, block_id: BlockId, @@ -54,7 +55,7 @@ where C: HeaderBackend + BlockBackend + StorageProvider + 'static, H: HasherT + Send + Sync + 'static, { - let block_number = starknet.substrate_block_number_from_starknet_block(block_id)?; + let block_number = block_n_from_id(block_id)?; let contract_address = ContractAddress(PatriciaKey(StarkFelt(contract_address.to_bytes_be()))); let key = StorageKey(PatriciaKey(StarkFelt(key.to_bytes_be()))); diff --git a/crates/client/rpc/src/methods/read/get_transaction_by_block_id_and_index.rs b/crates/client/rpc/src/methods/read/get_transaction_by_block_id_and_index.rs index bd2eeda03..e73dcbf54 100644 --- a/crates/client/rpc/src/methods/read/get_transaction_by_block_id_and_index.rs +++ b/crates/client/rpc/src/methods/read/get_transaction_by_block_id_and_index.rs @@ -10,6 +10,7 @@ use starknet_core::types::{BlockId, FieldElement, Transaction}; use crate::deoxys_backend_client::get_block_by_block_hash; use crate::errors::StarknetRpcApiError; +use crate::utils::helpers::{block_hash_from_block_n, txs_hashes_from_block_hash}; use crate::Starknet; /// Get the details of a transaction by a given block id and index. @@ -46,11 +47,12 @@ where let substrate_block_hash = starknet.substrate_block_hash_from_starknet_block(block_id)?; let starknet_block = get_block_by_block_hash(starknet.client.as_ref(), substrate_block_hash)?; - let starknet_block_hash = starknet_block.header().hash::(); + let block_number = starknet_block.header().block_number; + let starknet_block_hash = block_hash_from_block_n(block_number)?; let transaction = starknet_block.transactions().get(index).ok_or(StarknetRpcApiError::InvalidTxnIndex)?; - let block_txs_hashes = starknet.get_block_transaction_hashes(starknet_block_hash.into())?; + let block_txs_hashes = txs_hashes_from_block_hash(starknet_block_hash)?; let transaction_hash = block_txs_hashes.get(index).map(|&fe| FieldElement::from(Felt252Wrapper::from(fe))).ok_or( // This should never happen, because the index is checked above when getting the transaction. diff --git a/crates/client/rpc/src/methods/read/get_transaction_by_hash.rs b/crates/client/rpc/src/methods/read/get_transaction_by_hash.rs index c19465a69..c674f86c2 100644 --- a/crates/client/rpc/src/methods/read/get_transaction_by_hash.rs +++ b/crates/client/rpc/src/methods/read/get_transaction_by_hash.rs @@ -11,6 +11,7 @@ use starknet_core::types::{FieldElement, Transaction}; use crate::deoxys_backend_client::get_block_by_block_hash; use crate::errors::StarknetRpcApiError; +use crate::utils::helpers::{block_hash_from_block_n, txs_hashes_from_block_hash}; use crate::Starknet; /// Get the details and status of a submitted transaction. @@ -58,12 +59,12 @@ where .ok_or(StarknetRpcApiError::TxnHashNotFound)?; let starknet_block = get_block_by_block_hash(starknet.client.as_ref(), substrate_block_hash)?; - let starknet_block_hash = starknet_block.header().hash::(); + let block_number = starknet_block.header().block_number; + let starknet_block_hash = block_hash_from_block_n(block_number)?; let transaction_hash = Felt252Wrapper::from(transaction_hash); - let transaction = starknet - .get_block_transaction_hashes(starknet_block_hash.into())? + let transaction = txs_hashes_from_block_hash(starknet_block_hash)? .into_iter() .zip(starknet_block.transactions()) .find(|(tx_hash, _)| *tx_hash == transaction_hash.into()) diff --git a/crates/client/rpc/src/methods/read/get_transaction_receipt.rs b/crates/client/rpc/src/methods/read/get_transaction_receipt.rs index 46a882df5..e7bcf968c 100644 --- a/crates/client/rpc/src/methods/read/get_transaction_receipt.rs +++ b/crates/client/rpc/src/methods/read/get_transaction_receipt.rs @@ -24,7 +24,7 @@ use crate::utils::call_info::{ blockifier_call_info_to_starknet_resources, extract_events_from_call_info, extract_messages_from_call_info, }; use crate::utils::execution::{block_context, re_execute_transactions}; -use crate::utils::helpers::tx_hash_retrieve; +use crate::utils::helpers::{block_hash_from_block_n, tx_hash_retrieve, txs_hashes_from_block_hash}; use crate::utils::transaction::blockifier_transactions; use crate::Starknet; @@ -84,11 +84,11 @@ where let block = get_block_by_block_hash(starknet.client.as_ref(), substrate_block_hash)?; let block_header = block.header(); let block_number = block_header.block_number; - let starknet_block_hash: Felt252Wrapper = block_header.hash::(); + let starknet_block_hash = block_hash_from_block_n(block_number)?; let block_context = block_context(starknet.client.as_ref(), substrate_block_hash)?; - let block_txs_hashes = tx_hash_retrieve(starknet.get_block_transaction_hashes(starknet_block_hash.into())?); + let block_txs_hashes = tx_hash_retrieve(txs_hashes_from_block_hash(starknet_block_hash)?); // retrieve the transaction index in the block with the transaction hash let (tx_index, _) = @@ -118,7 +118,7 @@ where let receipt = receipt(transaction, &execution_infos, transaction_hash, block_number)?; - let block_info = starknet_core::types::ReceiptBlock::Block { block_hash: starknet_block_hash.0, block_number }; + let block_info = starknet_core::types::ReceiptBlock::Block { block_hash: starknet_block_hash, block_number }; Ok(TransactionReceiptWithBlockInfo { receipt, block: block_info }) } diff --git a/crates/client/rpc/src/methods/read/get_transaction_status.rs b/crates/client/rpc/src/methods/read/get_transaction_status.rs index 08641ec45..46d04f002 100644 --- a/crates/client/rpc/src/methods/read/get_transaction_status.rs +++ b/crates/client/rpc/src/methods/read/get_transaction_status.rs @@ -11,6 +11,7 @@ use starknet_core::types::{FieldElement, TransactionStatus}; use crate::deoxys_backend_client::get_block_by_block_hash; use crate::errors::StarknetRpcApiError; +use crate::utils::helpers::{block_hash_from_block_n, txs_hashes_from_block_hash}; use crate::Starknet; /// Gets the Transaction Status, Including Mempool Status and Execution Details @@ -49,10 +50,10 @@ where .ok_or(StarknetRpcApiError::TxnHashNotFound)?; let starknet_block = get_block_by_block_hash(starknet.client.as_ref(), substrate_block_hash)?; - let starknet_block_hash = starknet_block.header().hash::(); + let block_number = starknet_block.header().block_number; + let starknet_block_hash = block_hash_from_block_n(block_number)?; - let _starknet_tx = starknet - .get_block_transaction_hashes(starknet_block_hash.into())? + let _starknet_tx = txs_hashes_from_block_hash(starknet_block_hash)? .into_iter() .zip(starknet_block.transactions()) .find(|(tx_hash, _)| *tx_hash == Felt252Wrapper(transaction_hash).into()) diff --git a/crates/client/rpc/src/methods/trace/simulate_transactions.rs b/crates/client/rpc/src/methods/trace/simulate_transactions.rs index 7aea290e8..51c84b68e 100644 --- a/crates/client/rpc/src/methods/trace/simulate_transactions.rs +++ b/crates/client/rpc/src/methods/trace/simulate_transactions.rs @@ -12,9 +12,10 @@ use starknet_core::types::{ }; use super::lib::ConvertCallInfoToExecuteInvocationError; -use super::utils::{block_number_by_id, tx_execution_infos_to_tx_trace}; +use super::utils::tx_execution_infos_to_tx_trace; use crate::errors::StarknetRpcApiError; use crate::utils::execution::block_context; +use crate::utils::helpers::block_n_from_id; use crate::{utils, Starknet}; pub async fn simulate_transactions( @@ -31,7 +32,7 @@ where let substrate_block_hash = starknet.substrate_block_hash_from_starknet_block(block_id)?; let block_context = block_context(starknet.client.as_ref(), substrate_block_hash)?; - let block_number = block_number_by_id(block_id)?; + let block_number = block_n_from_id(block_id)?; let simulation_flags = SimulationFlags { validate: !simulation_flags.contains(&SimulationFlag::SkipValidate), diff --git a/crates/client/rpc/src/methods/trace/trace_block_transactions.rs b/crates/client/rpc/src/methods/trace/trace_block_transactions.rs index 2a9d4fe09..47ae2f8b7 100644 --- a/crates/client/rpc/src/methods/trace/trace_block_transactions.rs +++ b/crates/client/rpc/src/methods/trace/trace_block_transactions.rs @@ -1,5 +1,4 @@ use jsonrpsee::core::RpcResult; -use mp_felt::Felt252Wrapper; use mp_hashers::HasherT; use mp_transactions::TxType; use mp_types::block::DBlockT; @@ -12,7 +11,7 @@ use super::utils::tx_execution_infos_to_tx_trace; use crate::deoxys_backend_client::get_block_by_block_hash; use crate::errors::StarknetRpcApiError; use crate::utils::execution::{block_context, re_execute_transactions}; -use crate::utils::helpers::tx_hash_retrieve; +use crate::utils::helpers::{block_hash_from_block_n, tx_hash_retrieve, txs_hashes_from_block_hash}; use crate::utils::transaction::blockifier_transactions; use crate::Starknet; @@ -33,10 +32,10 @@ where })?; let block_header = starknet_block.header(); let block_number = block_header.block_number; - let block_hash: Felt252Wrapper = block_header.hash::(); + let block_hash = block_hash_from_block_n(block_number)?; let block_context = block_context(starknet.client.as_ref(), substrate_block_hash)?; - let block_txs_hashes = tx_hash_retrieve(starknet.get_block_transaction_hashes(block_hash.into())?); + let block_txs_hashes = tx_hash_retrieve(txs_hashes_from_block_hash(block_hash)?); // create a vector of transactions with their corresponding hashes without deploy transactions, // blockifier does not support deploy transactions diff --git a/crates/client/rpc/src/methods/trace/trace_transaction.rs b/crates/client/rpc/src/methods/trace/trace_transaction.rs index 6801333b5..7ef7d81d0 100644 --- a/crates/client/rpc/src/methods/trace/trace_transaction.rs +++ b/crates/client/rpc/src/methods/trace/trace_transaction.rs @@ -16,7 +16,7 @@ use super::utils::tx_execution_infos_to_tx_trace; use crate::deoxys_backend_client::get_block_by_block_hash; use crate::errors::StarknetRpcApiError; use crate::utils::execution::block_context; -use crate::utils::helpers::tx_hash_retrieve; +use crate::utils::helpers::{block_hash_from_block_n, tx_hash_retrieve, txs_hashes_from_block_hash}; use crate::utils::transaction::blockifier_transactions; use crate::Starknet; @@ -39,11 +39,11 @@ where let starknet_block = get_block_by_block_hash(starknet.client.as_ref(), substrate_block_hash)?; let block_header = starknet_block.header(); - let block_hash: Felt252Wrapper = block_header.hash::(); let block_number = block_header.block_number; + let block_hash = block_hash_from_block_n(block_number)?; let block_context = block_context(starknet.client.as_ref(), substrate_block_hash)?; - let block_txs_hashes = tx_hash_retrieve(starknet.get_block_transaction_hashes(block_hash.into())?); + let block_txs_hashes = tx_hash_retrieve(txs_hashes_from_block_hash(block_hash)?); // retrieve the transaction index in the block with the transaction hash let (tx_index, _) = diff --git a/crates/client/rpc/src/methods/trace/utils.rs b/crates/client/rpc/src/methods/trace/utils.rs index 89edafb95..d7b36c35f 100644 --- a/crates/client/rpc/src/methods/trace/utils.rs +++ b/crates/client/rpc/src/methods/trace/utils.rs @@ -2,20 +2,18 @@ use std::collections::HashMap; use blockifier::execution::call_info::CallInfo; use blockifier::transaction::objects::TransactionExecutionInfo; -use mc_db::{storage_handler, DeoxysBackend}; +use mc_db::storage_handler; use mp_felt::Felt252Wrapper; use mp_transactions::TxType; use starknet_api::core::ContractAddress; -use starknet_api::hash::StarkFelt; use starknet_core::types::{ - BlockId, BlockTag, ComputationResources, DataAvailabilityResources, DataResources, DeclareTransactionTrace, + ComputationResources, DataAvailabilityResources, DataResources, DeclareTransactionTrace, DeployAccountTransactionTrace, ExecuteInvocation, ExecutionResources, InvokeTransactionTrace, L1HandlerTransactionTrace, RevertedInvocation, TransactionTrace, }; use starknet_ff::FieldElement; use super::lib::*; -use crate::errors::StarknetRpcApiError; pub fn collect_call_info_ordered_messages(call_info: &CallInfo) -> Vec { call_info @@ -242,24 +240,3 @@ pub fn tx_execution_infos_to_tx_trace( Ok(tx_trace) } - -// TODO: move to mod utils -pub fn block_number_by_id(id: BlockId) -> Result { - let (latest_block_hash, latest_block_number) = DeoxysBackend::meta().get_latest_block_hash_and_number()?; - match id { - // Check if the block corresponding to the number is stored in the database - BlockId::Number(number) => match DeoxysBackend::mapping().starknet_block_hash_from_block_number(number)? { - Some(_) => Ok(number), - None => Err(StarknetRpcApiError::BlockNotFound), - }, - BlockId::Hash(block_hash) => { - match DeoxysBackend::mapping().block_number_from_starknet_block_hash(StarkFelt(block_hash.to_bytes_be()))? { - Some(block_number) => Ok(block_number), - None if block_hash == latest_block_hash => Ok(latest_block_number), - None => Err(StarknetRpcApiError::BlockNotFound), - } - } - BlockId::Tag(BlockTag::Latest) => Ok(latest_block_number), - BlockId::Tag(BlockTag::Pending) => Ok(latest_block_number + 1), - } -} diff --git a/crates/client/rpc/src/utils/helpers.rs b/crates/client/rpc/src/utils/helpers.rs index 27303916f..395a766d3 100644 --- a/crates/client/rpc/src/utils/helpers.rs +++ b/crates/client/rpc/src/utils/helpers.rs @@ -1,19 +1,15 @@ use anyhow::Result; +use mc_db::DeoxysBackend; use mc_sync::l1::ETHEREUM_STATE_UPDATE; use mp_block::DeoxysBlock; use mp_hashers::HasherT; use mp_transactions::to_starknet_core_transaction::to_starknet_core_tx; -use mp_types::block::{DBlockT, DHashT}; -use sc_client_api::backend::{Backend, StorageProvider}; -use sc_client_api::BlockBackend; -use sp_blockchain::HeaderBackend; -use starknet_api::hash::StarkFelt; +use starknet_api::hash::{StarkFelt, StarkHash}; use starknet_api::transaction as stx; -use starknet_core::types::{BlockId, BlockStatus, FieldElement}; +use starknet_core::types::{BlockId, BlockStatus, BlockTag, FieldElement}; -use crate::deoxys_backend_client::get_block_by_block_hash; use crate::errors::StarknetRpcApiError; -use crate::{Felt, Starknet}; +use crate::Felt; pub(crate) fn tx_hash_retrieve(tx_hashes: Vec) -> Vec { // safe to unwrap because we know that the StarkFelt is a valid FieldElement @@ -46,27 +42,51 @@ pub(crate) fn status(block_number: u64) -> BlockStatus { } } -#[allow(dead_code)] -pub fn previous_substrate_block_hash( - starknet: &Starknet, - substrate_block_hash: DHashT, -) -> Result -where - BE: Backend + 'static, - C: HeaderBackend + BlockBackend + StorageProvider + 'static, - H: HasherT + Send + Sync + 'static, -{ - let starknet_block = get_block_by_block_hash(starknet.client.as_ref(), substrate_block_hash).map_err(|e| { - log::error!("Failed to get block for block hash {substrate_block_hash}: '{e}'"); - StarknetRpcApiError::InternalServerError - })?; - let block_number = starknet_block.header().block_number; - let previous_block_number = match block_number { - 0 => 0, - _ => block_number - 1, - }; - let substrate_block_hash = - starknet.substrate_block_hash_from_starknet_block(BlockId::Number(previous_block_number))?; +/// Returns a list of all transaction hashes in the given block. +/// +/// # Arguments +/// +/// * `block_hash` - The hash of the block containing the transactions (starknet block). +pub fn txs_hashes_from_block_hash(block_hash: FieldElement) -> Result, StarknetRpcApiError> { + let block_hash = StarkFelt(block_hash.to_bytes_be()); + DeoxysBackend::mapping().transaction_hashes_from_block_hash(block_hash)?.ok_or(StarknetRpcApiError::BlockNotFound) +} + +pub fn block_n_from_id(id: BlockId) -> Result { + let (latest_block_hash, latest_block_number) = DeoxysBackend::meta().get_latest_block_hash_and_number()?; + match id { + // Check if the block corresponding to the number is stored in the database + BlockId::Number(number) => match DeoxysBackend::mapping().starknet_block_hash_from_block_number(number)? { + Some(_) => Ok(number), + None => Err(StarknetRpcApiError::BlockNotFound), + }, + BlockId::Hash(block_hash) => { + match DeoxysBackend::mapping().block_number_from_starknet_block_hash(StarkFelt(block_hash.to_bytes_be()))? { + Some(block_number) => Ok(block_number), + None if block_hash == latest_block_hash => Ok(latest_block_number), + None => Err(StarknetRpcApiError::BlockNotFound), + } + } + BlockId::Tag(BlockTag::Latest) => Ok(latest_block_number), + BlockId::Tag(BlockTag::Pending) => Ok(latest_block_number + 1), + } +} + +pub fn block_hash_from_id(id: BlockId) -> Result { + match id { + BlockId::Number(n) => DeoxysBackend::mapping() + .starknet_block_hash_from_block_number(n)? + .map(|h| FieldElement::from_bytes_be(&h.0).unwrap()) + .ok_or(StarknetRpcApiError::BlockNotFound), + BlockId::Hash(h) => Ok(h), + BlockId::Tag(BlockTag::Latest) => Ok(DeoxysBackend::meta().get_latest_block_hash_and_number()?.0), + BlockId::Tag(BlockTag::Pending) => Err(StarknetRpcApiError::BlockNotFound), + } +} - Ok(substrate_block_hash) +pub fn block_hash_from_block_n(block_number: u64) -> Result { + DeoxysBackend::mapping() + .starknet_block_hash_from_block_number(block_number)? + .map(|h| FieldElement::from_bytes_be(&h.0).unwrap()) + .ok_or(StarknetRpcApiError::BlockNotFound) }