diff --git a/CHANGELOG.md b/CHANGELOG.md index 83819f89e..1bc4893b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Next release +- perf: improved perfs with parallelized iteration over tx hashes cache - fix: graceful shutdown of rocksdb on ctrl+c - fix: better error handling around l1 and l2 sync - perf: compile with target_cpu=skylake by default diff --git a/Cargo.lock b/Cargo.lock index 97e100b92..8e40a2d41 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6163,6 +6163,7 @@ dependencies = [ "mp-types", "num-traits 0.2.18", "pallet-starknet-runtime-api", + "rayon", "sc-client-api", "sp-api", "sp-blockchain", diff --git a/crates/client/mapping-sync/Cargo.toml b/crates/client/mapping-sync/Cargo.toml index 72e2e7923..eafa3e654 100644 --- a/crates/client/mapping-sync/Cargo.toml +++ b/crates/client/mapping-sync/Cargo.toml @@ -29,6 +29,7 @@ mp-types = { workspace = true } num-traits = { workspace = true } pallet-starknet-runtime-api = { workspace = true } prometheus-endpoint = { workspace = true } +rayon = { workspace = true } sc-client-api = { workspace = true } sp-api = { workspace = true } sp-blockchain = { workspace = true } diff --git a/crates/client/mapping-sync/src/sync_blocks.rs b/crates/client/mapping-sync/src/sync_blocks.rs index d949eb55e..7d7912eb2 100644 --- a/crates/client/mapping-sync/src/sync_blocks.rs +++ b/crates/client/mapping-sync/src/sync_blocks.rs @@ -11,6 +11,7 @@ use mp_types::block::{DBlockT, DHashT, DHeaderT}; use num_traits::FromPrimitive; use pallet_starknet_runtime_api::StarknetRuntimeApi; use prometheus_endpoint::prometheus::core::Number; +use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use sc_client_api::backend::{Backend, StorageProvider}; use sp_api::ProvideRuntimeApi; use sp_blockchain::{Backend as _, HeaderBackend}; @@ -38,8 +39,10 @@ where let opt_storage_starknet_block = get_block_by_block_hash(client, substrate_block_hash); match opt_storage_starknet_block { Ok(storage_starknet_block) => { - let digest_starknet_block_hash = digest_starknet_block.header().hash::(); - let storage_starknet_block_hash = storage_starknet_block.header().hash::(); + let (digest_starknet_block_hash, storage_starknet_block_hash) = rayon::join( + || digest_starknet_block.header().hash::(), + || storage_starknet_block.header().hash::(), + ); // Ensure the two blocks sources (chain storage and block digest) agree on the block content if digest_starknet_block_hash != storage_starknet_block_hash { Err(anyhow::anyhow!( @@ -48,24 +51,25 @@ where )) } else { let chain_id = client.runtime_api().chain_id(substrate_block_hash)?; + let tx_hashes = digest_starknet_block + .transactions() + .par_iter() + .map(|tx| { + Felt252Wrapper::from(tx.compute_hash::( + chain_id, + false, + Some(digest_starknet_block.header().block_number), + )) + .into() + }) + .collect(); // Success, we write the Starknet to Substate hashes mapping to db let mapping_commitment = mc_db::MappingCommitment { block_number: digest_starknet_block.header().block_number, block_hash: substrate_block_hash, starknet_block_hash: digest_starknet_block_hash.into(), - starknet_transaction_hashes: digest_starknet_block - .transactions() - .iter() - .map(|tx| { - Felt252Wrapper::from(tx.compute_hash::( - chain_id, - false, - Some(digest_starknet_block.header().block_number), - )) - .into() - }) - .collect(), + starknet_transaction_hashes: tx_hashes, }; if let Some(block_metrics) = block_metrics { diff --git a/crates/tui/substrate/ok.flag b/crates/tui/substrate/ok.flag new file mode 100644 index 000000000..e69de29bb