From 1026be0b6495d3d7ff46bc2efa81d1acff71e990 Mon Sep 17 00:00:00 2001 From: chirag-bgh <76247491+chirag-bgh@users.noreply.github.com> Date: Sun, 23 Apr 2023 16:25:29 +0530 Subject: [PATCH] feat: use caching layer when fetching blocks for logs (#2350) Co-authored-by: Matthias Seitz --- crates/rpc/rpc-builder/src/auth.rs | 4 ++-- crates/rpc/rpc-builder/src/lib.rs | 2 +- crates/rpc/rpc/src/eth/filter.rs | 10 +++++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/crates/rpc/rpc-builder/src/auth.rs b/crates/rpc/rpc-builder/src/auth.rs index 13cd2f794b..80f880a4f8 100644 --- a/crates/rpc/rpc-builder/src/auth.rs +++ b/crates/rpc/rpc-builder/src/auth.rs @@ -48,8 +48,8 @@ where { // spawn a new cache task let eth_cache = EthStateCache::spawn_with(client.clone(), Default::default(), executor); - let eth_api = EthApi::new(client.clone(), pool.clone(), network, eth_cache); - let eth_filter = EthFilter::new(client, pool); + let eth_api = EthApi::new(client.clone(), pool.clone(), network, eth_cache.clone()); + let eth_filter = EthFilter::new(client, pool, eth_cache.clone()); launch_with_eth_api(eth_api, eth_filter, engine_api, socket_addr, secret).await } diff --git a/crates/rpc/rpc-builder/src/lib.rs b/crates/rpc/rpc-builder/src/lib.rs index ca6c6151ef..7a98c0b053 100644 --- a/crates/rpc/rpc-builder/src/lib.rs +++ b/crates/rpc/rpc-builder/src/lib.rs @@ -754,7 +754,7 @@ where self.network.clone(), cache.clone(), ); - let filter = EthFilter::new(self.client.clone(), self.pool.clone()); + let filter = EthFilter::new(self.client.clone(), self.pool.clone(), cache.clone()); let pubsub = EthPubSub::new( self.client.clone(), diff --git a/crates/rpc/rpc/src/eth/filter.rs b/crates/rpc/rpc/src/eth/filter.rs index 1fa530b537..840b8785ed 100644 --- a/crates/rpc/rpc/src/eth/filter.rs +++ b/crates/rpc/rpc/src/eth/filter.rs @@ -1,3 +1,4 @@ +use super::cache::EthStateCache; use crate::{ eth::{error::EthApiError, logs_utils}, result::{internal_rpc_err, rpc_error_with_code, ToRpcResult}, @@ -26,13 +27,14 @@ pub struct EthFilter { impl EthFilter { /// Creates a new, shareable instance. - pub fn new(client: Client, pool: Pool) -> Self { + pub fn new(client: Client, pool: Pool, eth_cache: EthStateCache) -> Self { let inner = EthFilterInner { client, active_filters: Default::default(), pool, id_provider: Arc::new(EthSubscriptionIdProvider::default()), max_logs_in_response: DEFAULT_MAX_LOGS_IN_RESPONSE, + eth_cache, }; Self { inner: Arc::new(inner) } } @@ -172,6 +174,8 @@ struct EthFilterInner { id_provider: Arc, /// Maximum number of logs that can be returned in a response max_logs_in_response: usize, + /// The async cache frontend for eth related data + eth_cache: EthStateCache, } impl EthFilterInner @@ -185,10 +189,10 @@ where FilterBlockOption::AtBlockHash(block_hash) => { let mut all_logs = Vec::new(); // all matching logs in the block, if it exists - if let Some(block) = self.client.block(block_hash.into()).to_rpc_result()? { + if let Some(block) = self.eth_cache.get_block(block_hash).await.to_rpc_result()? { // get receipts for the block if let Some(receipts) = - self.client.receipts_by_block(block.number.into()).to_rpc_result()? + self.eth_cache.get_receipts(block_hash).await.to_rpc_result()? { let filter = FilteredParams::new(Some(filter)); logs_utils::append_matching_block_logs(