From 7c9b212b4a60838ce35c3db272788bd05d2eeec0 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Fri, 17 Feb 2023 14:40:20 +0100 Subject: [PATCH] chore: relax Arc requirement for provider (#1429) --- bin/reth/src/node/mod.rs | 6 +-- crates/net/network/src/builder.rs | 3 +- crates/net/network/src/config.rs | 13 +++--- crates/net/network/src/eth_requests.rs | 7 ++- crates/net/network/src/lib.rs | 8 ++-- crates/net/network/src/manager.rs | 7 ++- crates/net/network/src/state.rs | 6 +-- crates/net/network/src/swarm.rs | 2 +- crates/net/network/src/test_utils/testnet.rs | 39 ++++++++--------- crates/net/network/src/transactions.rs | 4 +- crates/net/network/tests/it/connect.rs | 43 +++++++++---------- crates/net/network/tests/it/session.rs | 3 +- crates/storage/provider/src/traits/block.rs | 4 +- .../storage/provider/src/traits/block_hash.rs | 2 +- crates/storage/provider/src/traits/header.rs | 2 +- 15 files changed, 70 insertions(+), 79 deletions(-) diff --git a/bin/reth/src/node/mod.rs b/bin/reth/src/node/mod.rs index 9a75f38289..831219e799 100644 --- a/bin/reth/src/node/mod.rs +++ b/bin/reth/src/node/mod.rs @@ -271,7 +271,7 @@ impl Command { _pool: (), ) -> Result where - C: BlockProvider + HeaderProvider + 'static, + C: BlockProvider + HeaderProvider + Clone + Unpin + 'static, { let client = config.client.clone(); let (handle, network, _txpool, eth) = @@ -324,7 +324,7 @@ impl Command { .network_config(config, self.chain.clone()) .with_task_executor(Box::new(executor)) .set_head(head) - .build(Arc::new(ShareableDatabase::new(db, self.chain.clone()))) + .build(ShareableDatabase::new(db, self.chain.clone())) } async fn build_pipeline( @@ -378,7 +378,7 @@ async fn run_network_until_shutdown( network: NetworkManager, persistent_peers_file: Option, ) where - C: BlockProvider + HeaderProvider + 'static, + C: BlockProvider + HeaderProvider + Clone + Unpin + 'static, { pin_mut!(network, shutdown); diff --git a/crates/net/network/src/builder.rs b/crates/net/network/src/builder.rs index 2c89888b33..94b7f45499 100644 --- a/crates/net/network/src/builder.rs +++ b/crates/net/network/src/builder.rs @@ -5,7 +5,6 @@ use crate::{ NetworkManager, }; use reth_transaction_pool::TransactionPool; -use std::sync::Arc; use tokio::sync::mpsc; /// A builder that can configure all components of the network. @@ -47,7 +46,7 @@ impl NetworkBuilder { /// Creates a new [`EthRequestHandler`] and wires it to the network. pub fn request_handler( self, - client: Arc, + client: Client, ) -> NetworkBuilder> { let NetworkBuilder { mut network, transactions, .. } = self; let (tx, rx) = mpsc::unbounded_channel(); diff --git a/crates/net/network/src/config.rs b/crates/net/network/src/config.rs index b31e53f2ea..add23de286 100644 --- a/crates/net/network/src/config.rs +++ b/crates/net/network/src/config.rs @@ -15,7 +15,6 @@ use secp256k1::{SecretKey, SECP256K1}; use std::{ collections::HashSet, net::{Ipv4Addr, SocketAddr, SocketAddrV4}, - sync::Arc, }; /// reexports for convenience @@ -37,7 +36,7 @@ pub fn rng_secret_key() -> SecretKey { /// All network related initialization settings. pub struct NetworkConfig { /// The client type that can interact with the chain. - pub client: Arc, + pub client: C, /// The node's secret key, from which the node's identity is derived. pub secret_key: SecretKey, /// All boot nodes to start network discovery with. @@ -79,7 +78,7 @@ pub struct NetworkConfig { impl NetworkConfig { /// Create a new instance with all mandatory fields set, rest is field with defaults. - pub fn new(client: Arc, secret_key: SecretKey) -> Self { + pub fn new(client: C, secret_key: SecretKey) -> Self { Self::builder(secret_key).build(client) } @@ -103,7 +102,7 @@ impl NetworkConfig { impl NetworkConfig where - C: BlockProvider + HeaderProvider + 'static, + C: BlockProvider + HeaderProvider + Clone + Unpin + 'static, { /// Starts the networking stack given a [NetworkConfig] and returns a handle to the network. pub async fn start_network(self) -> Result { @@ -288,7 +287,7 @@ impl NetworkConfigBuilder { /// Consumes the type and creates the actual [`NetworkConfig`] /// for the given client type that can interact with the chain. - pub fn build(self, client: Arc) -> NetworkConfig { + pub fn build(self, client: C) -> NetworkConfig { let peer_id = self.get_peer_id(); let Self { secret_key, @@ -402,7 +401,7 @@ mod tests { #[test] fn test_network_dns_defaults() { - let config = builder().build(Arc::new(NoopProvider::default())); + let config = builder().build(NoopProvider::default()); let dns = config.dns_discovery_config.unwrap(); let bootstrap_nodes = dns.bootstrap_dns_networks.unwrap(); @@ -423,7 +422,7 @@ mod tests { let genesis_fork_hash = ForkHash::from(chain_spec.genesis_hash()); // enforce that the fork_id set in the status is consistent with the generated fork filter - let config = builder().chain_spec(chain_spec).build(Arc::new(NoopProvider::default())); + let config = builder().chain_spec(chain_spec).build(NoopProvider::default()); let status = config.status; let fork_filter = config.fork_filter; diff --git a/crates/net/network/src/eth_requests.rs b/crates/net/network/src/eth_requests.rs index 837a818cef..f1f38b3305 100644 --- a/crates/net/network/src/eth_requests.rs +++ b/crates/net/network/src/eth_requests.rs @@ -14,7 +14,6 @@ use std::{ future::Future, hash::Hash, pin::Pin, - sync::Arc, task::{Context, Poll}, }; use tokio::sync::{mpsc::UnboundedReceiver, oneshot}; @@ -49,7 +48,7 @@ const APPROX_HEADER_SIZE: usize = 500; #[must_use = "Manager does nothing unless polled."] pub struct EthRequestHandler { /// The client type that can interact with the chain. - client: Arc, + client: C, /// Used for reporting peers. #[allow(unused)] // TODO use to report spammers @@ -62,7 +61,7 @@ pub struct EthRequestHandler { impl EthRequestHandler { /// Create a new instance pub fn new( - client: Arc, + client: C, peers: PeersHandle, incoming: UnboundedReceiver, ) -> Self { @@ -195,7 +194,7 @@ where /// This should be spawned or used as part of `tokio::select!`. impl Future for EthRequestHandler where - C: BlockProvider + HeaderProvider, + C: BlockProvider + HeaderProvider + Unpin, { type Output = (); diff --git a/crates/net/network/src/lib.rs b/crates/net/network/src/lib.rs index aa15ded5cb..1bc7ff986a 100644 --- a/crates/net/network/src/lib.rs +++ b/crates/net/network/src/lib.rs @@ -55,13 +55,12 @@ //! //! ``` //! # async fn launch() { -//! use std::sync::Arc; //! use reth_network::config::{rng_secret_key, mainnet_nodes}; //! use reth_network::{NetworkConfig, NetworkManager}; //! use reth_provider::test_utils::NoopProvider; //! //! // This block provider implementation is used for testing purposes. -//! let client = Arc::new(NoopProvider::default()); +//! let client = NoopProvider::default(); //! //! // The key that's used for encrypting sessions and to identify our node. //! let local_key = rng_secret_key(); @@ -85,19 +84,18 @@ //! ``` //! use reth_provider::test_utils::NoopProvider; //! use reth_transaction_pool::TransactionPool; -//! use std::sync::Arc; //! use reth_discv4::bootnodes::mainnet_nodes; //! use reth_network::config::rng_secret_key; //! use reth_network::{NetworkConfig, NetworkManager}; //! async fn launch(pool: Pool) { //! // This block provider implementation is used for testing purposes. -//! let client = Arc::new(NoopProvider::default()); +//! let client = NoopProvider::default(); //! //! // The key that's used for encrypting sessions and to identify our node. //! let local_key = rng_secret_key(); //! //! let config = -//! NetworkConfig::::builder(local_key).boot_nodes(mainnet_nodes()).build(Arc::clone(&client)); +//! NetworkConfig::::builder(local_key).boot_nodes(mainnet_nodes()).build(client.clone()); //! //! // create the network instance //! let (handle, network, transactions, request_handler) = NetworkManager::builder(config) diff --git a/crates/net/network/src/manager.rs b/crates/net/network/src/manager.rs index eca9e5210b..e1c57ee4d0 100644 --- a/crates/net/network/src/manager.rs +++ b/crates/net/network/src/manager.rs @@ -240,19 +240,18 @@ where /// ``` /// use reth_provider::test_utils::NoopProvider; /// use reth_transaction_pool::TransactionPool; - /// use std::sync::Arc; /// use reth_discv4::bootnodes::mainnet_nodes; /// use reth_network::config::rng_secret_key; /// use reth_network::{NetworkConfig, NetworkManager}; /// async fn launch(pool: Pool) { /// // This block provider implementation is used for testing purposes. - /// let client = Arc::new(NoopProvider::default()); + /// let client = NoopProvider::default(); /// /// // The key that's used for encrypting sessions and to identify our node. /// let local_key = rng_secret_key(); /// /// let config = - /// NetworkConfig::::builder(local_key).boot_nodes(mainnet_nodes()).build(Arc::clone(&client)); + /// NetworkConfig::::builder(local_key).boot_nodes(mainnet_nodes()).build(client.clone()); /// /// // create the network instance /// let (handle, network, transactions, request_handler) = NetworkManager::builder(config) @@ -555,7 +554,7 @@ where impl Future for NetworkManager where - C: BlockProvider, + C: BlockProvider + Unpin, { type Output = (); diff --git a/crates/net/network/src/state.rs b/crates/net/network/src/state.rs index 54a93c2339..995b06be30 100644 --- a/crates/net/network/src/state.rs +++ b/crates/net/network/src/state.rs @@ -51,7 +51,7 @@ pub struct NetworkState { /// Buffered messages until polled. queued_messages: VecDeque, /// The client type that can interact with the chain. - client: Arc, + client: C, /// Network discovery. discovery: Discovery, /// The genesis hash of the network we're on @@ -69,7 +69,7 @@ where { /// Create a new state instance with the given params pub(crate) fn new( - client: Arc, + client: C, discovery: Discovery, peers_manager: PeersManager, genesis_hash: H256, @@ -531,7 +531,7 @@ mod tests { active_peers: Default::default(), peers_manager: Default::default(), queued_messages: Default::default(), - client: Arc::new(NoopProvider::default()), + client: NoopProvider::default(), discovery: Discovery::noop(), genesis_hash: Default::default(), state_fetcher: StateFetcher::new(handle, Default::default()), diff --git a/crates/net/network/src/swarm.rs b/crates/net/network/src/swarm.rs index 4091c7fbe1..39c82718ba 100644 --- a/crates/net/network/src/swarm.rs +++ b/crates/net/network/src/swarm.rs @@ -286,7 +286,7 @@ where impl Stream for Swarm where - C: BlockProvider, + C: BlockProvider + Unpin, { type Item = SwarmEvent; diff --git a/crates/net/network/src/test_utils/testnet.rs b/crates/net/network/src/test_utils/testnet.rs index 4cacd393f2..b31e4bb32e 100644 --- a/crates/net/network/src/test_utils/testnet.rs +++ b/crates/net/network/src/test_utils/testnet.rs @@ -15,7 +15,6 @@ use std::{ future::Future, net::{Ipv4Addr, SocketAddr, SocketAddrV4}, pin::Pin, - sync::Arc, task::{Context, Poll}, }; use tokio::{ @@ -35,18 +34,18 @@ pub struct Testnet { impl Testnet where - C: BlockProvider + HeaderProvider, + C: BlockProvider + HeaderProvider + Clone, { /// Same as [`Self::try_create_with`] but panics on error - pub async fn create_with(num_peers: usize, provider: Arc) -> Self { + pub async fn create_with(num_peers: usize, provider: C) -> Self { Self::try_create_with(num_peers, provider).await.unwrap() } /// Creates a new [`Testnet`] with the given number of peers and the provider. - pub async fn try_create_with(num_peers: usize, provider: Arc) -> Result { + pub async fn try_create_with(num_peers: usize, provider: C) -> Result { let mut this = Self { peers: Vec::with_capacity(num_peers) }; for _ in 0..num_peers { - let config = PeerConfig::new(Arc::clone(&provider)); + let config = PeerConfig::new(provider.clone()); this.add_peer_with_config(config).await?; } Ok(this) @@ -123,7 +122,7 @@ where impl Testnet where - C: BlockProvider + HeaderProvider + 'static, + C: BlockProvider + HeaderProvider + Unpin + 'static, { /// Spawns the testnet to a separate task pub fn spawn(self) -> TestnetHandle { @@ -177,7 +176,7 @@ impl fmt::Debug for Testnet { impl Future for Testnet where - C: BlockProvider + HeaderProvider, + C: BlockProvider + HeaderProvider + Unpin, { type Output = (); @@ -213,7 +212,7 @@ pub struct Peer { network: NetworkManager, #[pin] request_handler: Option>, - client: Arc, + client: C, secret_key: SecretKey, } @@ -221,7 +220,7 @@ pub struct Peer { impl Peer where - C: BlockProvider + HeaderProvider, + C: BlockProvider + HeaderProvider + Clone, { /// Returns the number of connected peers. pub fn num_peers(&self) -> usize { @@ -243,14 +242,14 @@ where let (tx, rx) = unbounded_channel(); self.network.set_eth_request_handler(tx); let peers = self.network.peers_handle(); - let request_handler = EthRequestHandler::new(Arc::clone(&self.client), peers, rx); + let request_handler = EthRequestHandler::new(self.client.clone(), peers, rx); self.request_handler = Some(request_handler); } } impl Future for Peer where - C: BlockProvider + HeaderProvider, + C: BlockProvider + HeaderProvider + Unpin, { type Output = (); @@ -268,7 +267,7 @@ where /// A helper config for setting up the reth networking stack. pub struct PeerConfig { config: NetworkConfig, - client: Arc, + client: C, secret_key: SecretKey, } @@ -276,7 +275,7 @@ pub struct PeerConfig { impl PeerConfig where - C: BlockProvider + HeaderProvider, + C: BlockProvider + HeaderProvider + Clone, { /// Launches the network and returns the [Peer] that manages it pub async fn launch(self) -> Result, NetworkError> { @@ -288,27 +287,27 @@ where /// Initialize the network with a random secret key, allowing the devp2p and discovery to bind /// to any available IP and port. - pub fn new(client: Arc) -> Self { + pub fn new(client: C) -> Self { let secret_key = SecretKey::new(&mut rand::thread_rng()); - let config = Self::network_config_builder(secret_key).build(Arc::clone(&client)); + let config = Self::network_config_builder(secret_key).build(client.clone()); Self { config, client, secret_key } } /// Initialize the network with a given secret key, allowing devp2p and discovery to bind any /// available IP and port. - pub fn with_secret_key(client: Arc, secret_key: SecretKey) -> Self { - let config = Self::network_config_builder(secret_key).build(Arc::clone(&client)); + pub fn with_secret_key(client: C, secret_key: SecretKey) -> Self { + let config = Self::network_config_builder(secret_key).build(client.clone()); Self { config, client, secret_key } } /// Initialize the network with a given capabilities. - pub fn with_capabilities(client: Arc, capabilities: Vec) -> Self { + pub fn with_capabilities(client: C, capabilities: Vec) -> Self { let secret_key = SecretKey::new(&mut rand::thread_rng()); let builder = Self::network_config_builder(secret_key); let hello_message = HelloBuilder::new(builder.get_peer_id()).capabilities(capabilities).build(); - let config = builder.hello_message(hello_message).build(Arc::clone(&client)); + let config = builder.hello_message(hello_message).build(client.clone()); Self { config, client, secret_key } } @@ -324,7 +323,7 @@ where impl Default for PeerConfig { fn default() -> Self { - Self::new(Arc::new(NoopProvider::default())) + Self::new(NoopProvider::default()) } } diff --git a/crates/net/network/src/transactions.rs b/crates/net/network/src/transactions.rs index db2eead9d1..fc31517d8d 100644 --- a/crates/net/network/src/transactions.rs +++ b/crates/net/network/src/transactions.rs @@ -570,9 +570,9 @@ mod tests { let secret_key = SecretKey::new(&mut rand::thread_rng()); - let client = Arc::new(NoopProvider::default()); + let client = NoopProvider::default(); let pool = testing_pool(); - let config = NetworkConfigBuilder::new(secret_key).build(Arc::clone(&client)); + let config = NetworkConfigBuilder::new(secret_key).build(client); let (handle, network, mut transactions, _) = NetworkManager::new(config) .await .unwrap() diff --git a/crates/net/network/tests/it/connect.rs b/crates/net/network/tests/it/connect.rs index f799dee689..a631908ec2 100644 --- a/crates/net/network/tests/it/connect.rs +++ b/crates/net/network/tests/it/connect.rs @@ -21,7 +21,7 @@ use reth_primitives::{HeadersDirection, NodeRecord, PeerId}; use reth_provider::test_utils::NoopProvider; use reth_transaction_pool::test_utils::testing_pool; use secp256k1::SecretKey; -use std::{collections::HashSet, net::SocketAddr, sync::Arc, time::Duration}; +use std::{collections::HashSet, net::SocketAddr, time::Duration}; use tokio::task; #[tokio::test(flavor = "multi_thread")] @@ -90,12 +90,12 @@ async fn test_already_connected() { let mut net = Testnet::default(); let secret_key = SecretKey::new(&mut rand::thread_rng()); - let client = Arc::new(NoopProvider::default()); + let client = NoopProvider::default(); let p1 = PeerConfig::default(); // initialize two peers with the same identifier - let p2 = PeerConfig::with_secret_key(Arc::clone(&client), secret_key); - let p3 = PeerConfig::with_secret_key(Arc::clone(&client), secret_key); + let p2 = PeerConfig::with_secret_key(client, secret_key); + let p3 = PeerConfig::with_secret_key(client, secret_key); net.extend_peer_with_config(vec![p1, p2, p3]).await.unwrap(); @@ -135,11 +135,11 @@ async fn test_get_peer() { let mut net = Testnet::default(); let secret_key = SecretKey::new(&mut rand::thread_rng()); let secret_key_1 = SecretKey::new(&mut rand::thread_rng()); - let client = Arc::new(NoopProvider::default()); + let client = NoopProvider::default(); let p1 = PeerConfig::default(); - let p2 = PeerConfig::with_secret_key(Arc::clone(&client), secret_key); - let p3 = PeerConfig::with_secret_key(Arc::clone(&client), secret_key_1); + let p2 = PeerConfig::with_secret_key(client, secret_key); + let p3 = PeerConfig::with_secret_key(client, secret_key_1); net.extend_peer_with_config(vec![p1, p2, p3]).await.unwrap(); let mut handles = net.handles(); @@ -169,10 +169,10 @@ async fn test_get_peer_by_id() { let secret_key = SecretKey::new(&mut rand::thread_rng()); let secret_key_1 = SecretKey::new(&mut rand::thread_rng()); - let client = Arc::new(NoopProvider::default()); + let client = NoopProvider::default(); let p1 = PeerConfig::default(); - let p2 = PeerConfig::with_secret_key(Arc::clone(&client), secret_key); - let p3 = PeerConfig::with_secret_key(Arc::clone(&client), secret_key_1); + let p2 = PeerConfig::with_secret_key(client, secret_key); + let p3 = PeerConfig::with_secret_key(client, secret_key_1); net.extend_peer_with_config(vec![p1, p2, p3]).await.unwrap(); @@ -204,9 +204,8 @@ async fn test_connect_with_boot_nodes() { let mut discv4 = Discv4Config::builder(); discv4.add_boot_nodes(mainnet_nodes()); - let config = NetworkConfigBuilder::new(secret_key) - .discovery(discv4) - .build(Arc::new(NoopProvider::default())); + let config = + NetworkConfigBuilder::new(secret_key).discovery(discv4).build(NoopProvider::default()); let network = NetworkManager::new(config).await.unwrap(); let handle = network.handle().clone(); @@ -226,8 +225,8 @@ async fn test_connect_with_builder() { let mut discv4 = Discv4Config::builder(); discv4.add_boot_nodes(mainnet_nodes()); - let client = Arc::new(NoopProvider::default()); - let config = NetworkConfigBuilder::new(secret_key).discovery(discv4).build(Arc::clone(&client)); + let client = NoopProvider::default(); + let config = NetworkConfigBuilder::new(secret_key).discovery(discv4).build(client); let (handle, network, _, requests) = NetworkManager::new(config) .await .unwrap() @@ -262,8 +261,8 @@ async fn test_connect_to_trusted_peer() { let secret_key = SecretKey::new(&mut rand::thread_rng()); let discv4 = Discv4Config::builder(); - let client = Arc::new(NoopProvider::default()); - let config = NetworkConfigBuilder::new(secret_key).discovery(discv4).build(Arc::clone(&client)); + let client = NoopProvider::default(); + let config = NetworkConfigBuilder::new(secret_key).discovery(discv4).build(client); let (handle, network, transactions, requests) = NetworkManager::new(config) .await .unwrap() @@ -332,7 +331,7 @@ async fn test_incoming_node_id_blacklist() { .listener_addr(reth_p2p) .discovery_addr(reth_disc) .peer_config(peer_config) - .build(Arc::new(NoopProvider::default())); + .build(NoopProvider::default()); let network = NetworkManager::new(config).await.unwrap(); @@ -380,7 +379,7 @@ async fn test_incoming_connect_with_single_geth() { let config = NetworkConfigBuilder::new(secret_key) .listener_addr(reth_p2p) .discovery_addr(reth_disc) - .build(Arc::new(NoopProvider::default())); + .build(NoopProvider::default()); let network = NetworkManager::new(config).await.unwrap(); @@ -414,7 +413,7 @@ async fn test_outgoing_connect_with_single_geth() { let config = NetworkConfigBuilder::new(secret_key) .listener_addr(reth_p2p) .discovery_addr(reth_disc) - .build(Arc::new(NoopProvider::default())); + .build(NoopProvider::default()); let network = NetworkManager::new(config).await.unwrap(); let handle = network.handle().clone(); @@ -459,7 +458,7 @@ async fn test_geth_disconnect() { let config = NetworkConfigBuilder::new(secret_key) .listener_addr(reth_p2p) .discovery_addr(reth_disc) - .build(Arc::new(NoopProvider::default())); + .build(NoopProvider::default()); let network = NetworkManager::new(config).await.unwrap(); let handle = network.handle().clone(); @@ -563,7 +562,7 @@ async fn test_disconnect_incoming_when_exceeded_incoming_connections() { .listener_addr(reth_p2p) .discovery_addr(reth_disc) .peer_config(peers_config) - .build(Arc::new(NoopProvider::default())); + .build(NoopProvider::default()); let network = NetworkManager::new(config).await.unwrap(); let other_peer_handle = net.handles().next().unwrap(); diff --git a/crates/net/network/tests/it/session.rs b/crates/net/network/tests/it/session.rs index dbfb53cd1a..a02fef311d 100644 --- a/crates/net/network/tests/it/session.rs +++ b/crates/net/network/tests/it/session.rs @@ -8,7 +8,6 @@ use reth_network::{ }; use reth_network_api::{NetworkInfo, Peers}; use reth_provider::test_utils::NoopProvider; -use std::sync::Arc; #[tokio::test(flavor = "multi_thread")] async fn test_session_established_with_highest_version() { @@ -51,7 +50,7 @@ async fn test_session_established_with_different_capability() { let mut net = Testnet::create(1).await; let capabilities = vec![Capability::new("eth".into(), EthVersion::Eth66 as usize)]; - let p1 = PeerConfig::with_capabilities(Arc::new(NoopProvider::default()), capabilities); + let p1 = PeerConfig::with_capabilities(NoopProvider::default(), capabilities); net.add_peer_with_config(p1).await.unwrap(); net.for_each(|peer| assert_eq!(0, peer.num_peers())); diff --git a/crates/storage/provider/src/traits/block.rs b/crates/storage/provider/src/traits/block.rs index 13c62bc29b..ece9c377b2 100644 --- a/crates/storage/provider/src/traits/block.rs +++ b/crates/storage/provider/src/traits/block.rs @@ -1,6 +1,5 @@ -use crate::HeaderProvider; - use super::BlockHashProvider; +use crate::HeaderProvider; use reth_interfaces::Result; use reth_primitives::{ rpc::{BlockId, BlockNumber}, @@ -8,6 +7,7 @@ use reth_primitives::{ }; /// Api trait for fetching `Block` related data. +#[auto_impl::auto_impl(&, Arc)] pub trait BlockProvider: BlockHashProvider + HeaderProvider + Send + Sync { /// Returns the current info for the chain. fn chain_info(&self) -> Result; diff --git a/crates/storage/provider/src/traits/block_hash.rs b/crates/storage/provider/src/traits/block_hash.rs index 0c35569130..6d4b99d524 100644 --- a/crates/storage/provider/src/traits/block_hash.rs +++ b/crates/storage/provider/src/traits/block_hash.rs @@ -3,7 +3,7 @@ use reth_interfaces::Result; use reth_primitives::{H256, U256}; /// Client trait for fetching block hashes by number. -#[auto_impl(&)] +#[auto_impl(&, Arc)] pub trait BlockHashProvider: Send + Sync { /// Get the hash of the block with the given number. Returns `None` if no block with this number /// exists. diff --git a/crates/storage/provider/src/traits/header.rs b/crates/storage/provider/src/traits/header.rs index 7c678924c1..347c9713a6 100644 --- a/crates/storage/provider/src/traits/header.rs +++ b/crates/storage/provider/src/traits/header.rs @@ -4,7 +4,7 @@ use reth_primitives::{BlockHash, BlockHashOrNumber, BlockNumber, Header, U256}; use std::ops::RangeBounds; /// Client trait for fetching `Header` related data. -#[auto_impl(&)] +#[auto_impl(&, Arc)] pub trait HeaderProvider: Send + Sync { /// Check if block is known fn is_known(&self, block_hash: &BlockHash) -> Result {