chore: extract p2p types from interfaces (#8382)

This commit is contained in:
Matthias Seitz
2024-05-24 10:34:09 +02:00
committed by GitHub
parent d7172b6605
commit df7c9ee310
31 changed files with 124 additions and 77 deletions

29
Cargo.lock generated
View File

@ -7030,20 +7030,13 @@ name = "reth-interfaces"
version = "0.2.0-beta.7" version = "0.2.0-beta.7"
dependencies = [ dependencies = [
"auto_impl", "auto_impl",
"futures",
"parking_lot 0.12.2",
"rand 0.8.5",
"reth-consensus", "reth-consensus",
"reth-eth-wire-types",
"reth-fs-util", "reth-fs-util",
"reth-network-api", "reth-network-api",
"reth-network-types", "reth-network-p2p",
"reth-primitives", "reth-primitives",
"reth-storage-errors", "reth-storage-errors",
"secp256k1 0.28.2",
"thiserror", "thiserror",
"tokio",
"tracing",
] ]
[[package]] [[package]]
@ -7218,6 +7211,26 @@ dependencies = [
"tokio", "tokio",
] ]
[[package]]
name = "reth-network-p2p"
version = "0.2.0-beta.7"
dependencies = [
"auto_impl",
"futures",
"parking_lot 0.12.2",
"rand 0.8.5",
"reth-consensus",
"reth-eth-wire-types",
"reth-network-api",
"reth-network-types",
"reth-primitives",
"reth-storage-errors",
"secp256k1 0.28.2",
"thiserror",
"tokio",
"tracing",
]
[[package]] [[package]]
name = "reth-network-types" name = "reth-network-types"
version = "0.2.0-beta.7" version = "0.2.0-beta.7"

View File

@ -32,6 +32,7 @@ members = [
"crates/net/nat/", "crates/net/nat/",
"crates/net/network-api/", "crates/net/network-api/",
"crates/net/network/", "crates/net/network/",
"crates/net/p2p/",
"crates/net/types/", "crates/net/types/",
"crates/node-core/", "crates/node-core/",
"crates/node/api/", "crates/node/api/",
@ -249,6 +250,7 @@ reth-net-nat = { path = "crates/net/nat" }
reth-network = { path = "crates/net/network" } reth-network = { path = "crates/net/network" }
reth-network-api = { path = "crates/net/network-api" } reth-network-api = { path = "crates/net/network-api" }
reth-network-types = { path = "crates/net/types" } reth-network-types = { path = "crates/net/types" }
reth-network-p2p = { path = "crates/net/p2p" }
reth-nippy-jar = { path = "crates/storage/nippy-jar" } reth-nippy-jar = { path = "crates/storage/nippy-jar" }
reth-node-api = { path = "crates/node/api" } reth-node-api = { path = "crates/node/api" }
reth-node-builder = { path = "crates/node/builder" } reth-node-builder = { path = "crates/node/builder" }

View File

@ -134,7 +134,6 @@ min-trace-logs = ["tracing/release_max_level_trace"]
optimism = [ optimism = [
"reth-primitives/optimism", "reth-primitives/optimism",
"reth-interfaces/optimism",
"reth-rpc/optimism", "reth-rpc/optimism",
"reth-provider/optimism", "reth-provider/optimism",
"reth-beacon-consensus/optimism", "reth-beacon-consensus/optimism",

View File

@ -50,4 +50,4 @@ assert_matches.workspace = true
[features] [features]
test-utils = [] test-utils = []
optimism = ["reth-primitives/optimism", "reth-interfaces/optimism", "reth-provider/optimism"] optimism = ["reth-primitives/optimism", "reth-provider/optimism"]

View File

@ -67,7 +67,6 @@ assert_matches.workspace = true
[features] [features]
optimism = [ optimism = [
"reth-primitives/optimism", "reth-primitives/optimism",
"reth-interfaces/optimism",
"reth-provider/optimism", "reth-provider/optimism",
"reth-blockchain-tree/optimism", "reth-blockchain-tree/optimism",
"reth-ethereum-consensus/optimism", "reth-ethereum-consensus/optimism",

View File

@ -14,36 +14,15 @@ workspace = true
reth-primitives.workspace = true reth-primitives.workspace = true
reth-fs-util.workspace = true reth-fs-util.workspace = true
reth-network-api.workspace = true reth-network-api.workspace = true
reth-eth-wire-types.workspace = true
reth-consensus.workspace = true reth-consensus.workspace = true
reth-network-types.workspace = true
reth-storage-errors.workspace = true reth-storage-errors.workspace = true
reth-network-p2p.workspace = true
# async
futures.workspace = true
tokio = { workspace = true, features = ["sync"] }
# misc # misc
auto_impl.workspace = true auto_impl.workspace = true
thiserror.workspace = true thiserror.workspace = true
tracing.workspace = true
secp256k1 = { workspace = true, default-features = false, features = [
"alloc",
"recovery",
"rand",
], optional = true }
parking_lot = { workspace = true, optional = true }
rand = { workspace = true, optional = true }
[dev-dependencies]
reth-consensus = { workspace = true, features = ["test-utils"] }
parking_lot.workspace = true
rand.workspace = true
tokio = { workspace = true, features = ["full"] }
secp256k1 = { workspace = true, features = ["alloc", "recovery", "rand"] }
[features] [features]
test-utils = ["reth-consensus/test-utils", "secp256k1", "rand", "parking_lot"] test-utils = ["reth-consensus/test-utils", "reth-network-p2p/test-utils"]
clap = ["reth-storage-errors/clap"] clap = ["reth-storage-errors/clap"]
optimism = ["reth-eth-wire-types/optimism"]

View File

@ -23,7 +23,7 @@ mod error;
pub use error::{RethError, RethResult}; pub use error::{RethError, RethResult};
/// P2P traits. /// P2P traits.
pub mod p2p; pub use reth_network_p2p as p2p;
/// Trie error /// Trie error
pub mod trie; pub mod trie;
@ -34,6 +34,6 @@ pub mod sync;
/// BlockchainTree related traits. /// BlockchainTree related traits.
pub mod blockchain_tree; pub mod blockchain_tree;
#[cfg(any(test, feature = "test-utils"))]
/// Common test helpers for mocking out Consensus, Downloaders and Header Clients. /// Common test helpers for mocking out Consensus, Downloaders and Header Clients.
pub mod test_utils; #[cfg(feature = "test-utils")]
pub use reth_network_p2p::test_utils;

View File

@ -1,4 +1,4 @@
//! Reth network interface definitions. //! Reth interface definitions and commonly used types for the reth-network crate.
//! //!
//! Provides abstractions for the reth-network crate. //! Provides abstractions for the reth-network crate.
//! //!

48
crates/net/p2p/Cargo.toml Normal file
View File

@ -0,0 +1,48 @@
[package]
name = "reth-network-p2p"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
homepage.workspace = true
repository.workspace = true
description = "traits and commonly used types for p2p and network communication"
[lints]
workspace = true
[dependencies]
reth-primitives.workspace = true
reth-network-api.workspace = true
reth-eth-wire-types.workspace = true
reth-consensus.workspace = true
reth-network-types.workspace = true
reth-storage-errors.workspace = true
# async
futures.workspace = true
tokio = { workspace = true, features = ["sync"] }
# misc
auto_impl.workspace = true
thiserror.workspace = true
tracing.workspace = true
secp256k1 = { workspace = true, default-features = false, features = [
"alloc",
"recovery",
"rand",
], optional = true }
parking_lot = { workspace = true, optional = true }
rand = { workspace = true, optional = true }
[dev-dependencies]
reth-consensus = { workspace = true, features = ["test-utils"] }
parking_lot.workspace = true
rand.workspace = true
tokio = { workspace = true, features = ["full"] }
secp256k1 = { workspace = true, features = ["alloc", "recovery", "rand"] }
[features]
test-utils = ["reth-consensus/test-utils", "secp256k1", "rand", "parking_lot"]

View File

@ -3,7 +3,7 @@ use std::{
task::{ready, Context, Poll}, task::{ready, Context, Poll},
}; };
use crate::p2p::{download::DownloadClient, error::PeerRequestResult, priority::Priority}; use crate::{download::DownloadClient, error::PeerRequestResult, priority::Priority};
use futures::{Future, FutureExt}; use futures::{Future, FutureExt};
use reth_primitives::{BlockBody, B256}; use reth_primitives::{BlockBody, B256};

View File

@ -1,5 +1,5 @@
use super::response::BlockResponse; use super::response::BlockResponse;
use crate::p2p::error::DownloadResult; use crate::error::DownloadResult;
use futures::Stream; use futures::Stream;
use reth_primitives::BlockNumber; use reth_primitives::BlockNumber;
use std::ops::RangeInclusive; use std::ops::RangeInclusive;
@ -10,7 +10,7 @@ pub type BodyDownloaderResult = DownloadResult<Vec<BlockResponse>>;
/// A downloader capable of fetching and yielding block bodies from block headers. /// A downloader capable of fetching and yielding block bodies from block headers.
/// ///
/// A downloader represents a distinct strategy for submitting requests to download block bodies, /// A downloader represents a distinct strategy for submitting requests to download block bodies,
/// while a [BodiesClient][crate::p2p::bodies::client::BodiesClient] represents a client capable of /// while a [BodiesClient][crate::bodies::client::BodiesClient] represents a client capable of
/// fulfilling these requests. /// fulfilling these requests.
pub trait BodyDownloader: Send + Sync + Stream<Item = BodyDownloaderResult> + Unpin { pub trait BodyDownloader: Send + Sync + Stream<Item = BodyDownloaderResult> + Unpin {
/// Method for setting the download range. /// Method for setting the download range.

View File

@ -1,6 +1,6 @@
//! Support for different download types. //! Support for different download types.
use crate::p2p::{ use crate::{
bodies::client::BodiesClient, bodies::client::BodiesClient,
download::DownloadClient, download::DownloadClient,
headers::client::{HeadersClient, HeadersRequest}, headers::client::{HeadersClient, HeadersRequest},

View File

@ -1,11 +1,11 @@
use super::headers::client::HeadersRequest; use super::headers::client::HeadersRequest;
use crate::{db::DatabaseError, provider::ProviderError};
use reth_consensus::ConsensusError; use reth_consensus::ConsensusError;
use reth_network_api::ReputationChangeKind; use reth_network_api::ReputationChangeKind;
use reth_network_types::WithPeerId; use reth_network_types::WithPeerId;
use reth_primitives::{ use reth_primitives::{
BlockHashOrNumber, BlockNumber, GotExpected, GotExpectedBoxed, Header, B256, BlockHashOrNumber, BlockNumber, GotExpected, GotExpectedBoxed, Header, B256,
}; };
use reth_storage_errors::{db::DatabaseError, provider::ProviderError};
use std::ops::RangeInclusive; use std::ops::RangeInclusive;
use thiserror::Error; use thiserror::Error;
use tokio::sync::{mpsc, oneshot}; use tokio::sync::{mpsc, oneshot};

View File

@ -1,5 +1,5 @@
use super::headers::client::HeadersRequest; use super::headers::client::HeadersRequest;
use crate::p2p::{ use crate::{
bodies::client::{BodiesClient, SingleBodyRequest}, bodies::client::{BodiesClient, SingleBodyRequest},
error::PeerRequestResult, error::PeerRequestResult,
headers::client::{HeadersClient, SingleHeaderRequest}, headers::client::{HeadersClient, SingleHeaderRequest},
@ -727,11 +727,10 @@ enum RangeResponseResult {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::ops::Range;
use super::*; use super::*;
use crate::test_utils::TestFullBlockClient; use crate::test_utils::TestFullBlockClient;
use futures::StreamExt; use futures::StreamExt;
use std::ops::Range;
#[tokio::test] #[tokio::test]
async fn download_single_full_block() { async fn download_single_full_block() {

View File

@ -1,4 +1,4 @@
use crate::p2p::{download::DownloadClient, error::PeerRequestResult, priority::Priority}; use crate::{download::DownloadClient, error::PeerRequestResult, priority::Priority};
use futures::{Future, FutureExt}; use futures::{Future, FutureExt};
pub use reth_eth_wire_types::BlockHeaders; pub use reth_eth_wire_types::BlockHeaders;
use reth_primitives::{BlockHashOrNumber, Header, HeadersDirection}; use reth_primitives::{BlockHashOrNumber, Header, HeadersDirection};

View File

@ -1,12 +1,12 @@
use super::error::HeadersDownloaderResult; use super::error::HeadersDownloaderResult;
use crate::p2p::error::{DownloadError, DownloadResult}; use crate::error::{DownloadError, DownloadResult};
use futures::Stream; use futures::Stream;
use reth_consensus::Consensus; use reth_consensus::Consensus;
use reth_primitives::{BlockHashOrNumber, SealedHeader, B256}; use reth_primitives::{BlockHashOrNumber, SealedHeader, B256};
/// A downloader capable of fetching and yielding block headers. /// A downloader capable of fetching and yielding block headers.
/// ///
/// A downloader represents a distinct strategy for submitting requests to download block headers, /// A downloader represents a distinct strategy for submitting requests to download block headers,
/// while a [HeadersClient][crate::p2p::headers::client::HeadersClient] represents a client capable /// while a [HeadersClient][crate::headers::client::HeadersClient] represents a client capable
/// of fulfilling these requests. /// of fulfilling these requests.
/// ///
/// A [HeaderDownloader] is a [Stream] that returns batches of headers. /// A [HeaderDownloader] is a [Stream] that returns batches of headers.

View File

@ -1,3 +1,16 @@
//! Provides abstractions and commonly used types for p2p.
//!
//! ## Feature Flags
//!
//! - `test-utils`: Export utilities for testing
#![doc(
html_logo_url = "https://raw.githubusercontent.com/paradigmxyz/reth/main/assets/reth-docs.png",
html_favicon_url = "https://avatars0.githubusercontent.com/u/97369466?s=256",
issue_tracker_base_url = "https://github.com/paradigmxyz/reth/issues/"
)]
#![cfg_attr(not(test), warn(unused_crate_dependencies))]
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
/// Shared abstractions for downloader implementations. /// Shared abstractions for downloader implementations.
pub mod download; pub mod download;
@ -15,7 +28,7 @@ pub mod full_block;
/// [`HeadersClient`]. /// [`HeadersClient`].
/// ///
/// [`Consensus`]: reth_consensus::Consensus /// [`Consensus`]: reth_consensus::Consensus
/// [`HeadersClient`]: crate::p2p::headers::client::HeadersClient /// [`HeadersClient`]: crate::headers::client::HeadersClient
pub mod headers; pub mod headers;
/// Error types broadly used by p2p interfaces for any operation which may produce an error when /// Error types broadly used by p2p interfaces for any operation which may produce an error when
@ -24,3 +37,7 @@ pub mod error;
/// Priority enum for BlockHeader and BlockBody requests /// Priority enum for BlockHeader and BlockBody requests
pub mod priority; pub mod priority;
/// Common test helpers for mocking out Consensus, Downloaders and Header Clients.
#[cfg(any(test, feature = "test-utils"))]
pub mod test_utils;

View File

@ -1,4 +1,4 @@
use crate::p2p::{ use crate::{
bodies::client::{BodiesClient, BodiesFut}, bodies::client::{BodiesClient, BodiesFut},
download::DownloadClient, download::DownloadClient,
error::PeerRequestResult, error::PeerRequestResult,

View File

@ -1,4 +1,4 @@
use crate::p2p::{ use crate::{
bodies::client::BodiesClient, bodies::client::BodiesClient,
download::DownloadClient, download::DownloadClient,
error::PeerRequestResult, error::PeerRequestResult,

View File

@ -14,9 +14,6 @@ use std::{
ops::{Range, RangeInclusive}, ops::{Range, RangeInclusive},
}; };
// TODO(onbjerg): Maybe we should split this off to its own crate, or move the helpers to the
// relevant crates?
/// Returns a random number generator that can be seeded using the `SEED` environment variable. /// Returns a random number generator that can be seeded using the `SEED` environment variable.
/// ///
/// If `SEED` is not set, a random seed is used. /// If `SEED` is not set, a random seed is used.
@ -353,6 +350,7 @@ pub fn random_receipt<R: Rng>(
) -> Receipt { ) -> Receipt {
let success = rng.gen::<bool>(); let success = rng.gen::<bool>();
let logs_count = logs_count.unwrap_or_else(|| rng.gen::<u8>()); let logs_count = logs_count.unwrap_or_else(|| rng.gen::<u8>());
#[allow(clippy::needless_update)] // side-effect of optimism fields
Receipt { Receipt {
tx_type: transaction.tx_type(), tx_type: transaction.tx_type(),
success, success,
@ -362,10 +360,7 @@ pub fn random_receipt<R: Rng>(
} else { } else {
vec![] vec![]
}, },
#[cfg(feature = "optimism")] ..Default::default()
deposit_nonce: None,
#[cfg(feature = "optimism")]
deposit_receipt_version: None,
} }
} }

View File

@ -1,19 +1,6 @@
//! Testing support for headers related interfaces. //! Testing support for headers related interfaces.
use std::{ use crate::{
fmt,
pin::Pin,
sync::{
atomic::{AtomicU64, Ordering},
Arc,
},
task::{ready, Context, Poll},
};
use futures::{Future, FutureExt, Stream, StreamExt};
use tokio::sync::Mutex;
use crate::p2p::{
download::DownloadClient, download::DownloadClient,
error::{DownloadError, DownloadResult, PeerRequestResult, RequestError}, error::{DownloadError, DownloadResult, PeerRequestResult, RequestError},
headers::{ headers::{
@ -23,9 +10,20 @@ use crate::p2p::{
}, },
priority::Priority, priority::Priority,
}; };
use futures::{Future, FutureExt, Stream, StreamExt};
use reth_consensus::{test_utils::TestConsensus, Consensus}; use reth_consensus::{test_utils::TestConsensus, Consensus};
use reth_network_types::{PeerId, WithPeerId}; use reth_network_types::{PeerId, WithPeerId};
use reth_primitives::{Header, HeadersDirection, SealedHeader}; use reth_primitives::{Header, HeadersDirection, SealedHeader};
use std::{
fmt,
pin::Pin,
sync::{
atomic::{AtomicU64, Ordering},
Arc,
},
task::{ready, Context, Poll},
};
use tokio::sync::Mutex;
/// A test downloader which just returns the values that have been pushed to it. /// A test downloader which just returns the values that have been pushed to it.
#[derive(Debug)] #[derive(Debug)]

View File

@ -104,7 +104,6 @@ assert_matches.workspace = true
[features] [features]
optimism = [ optimism = [
"reth-primitives/optimism", "reth-primitives/optimism",
"reth-interfaces/optimism",
"reth-rpc/optimism", "reth-rpc/optimism",
"reth-rpc-engine-api/optimism", "reth-rpc-engine-api/optimism",
"reth-provider/optimism", "reth-provider/optimism",

View File

@ -37,7 +37,6 @@ reth-revm = { workspace = true, features = ["test-utils"] }
optimism = [ optimism = [
"reth-primitives/optimism", "reth-primitives/optimism",
"reth-provider/optimism", "reth-provider/optimism",
"reth-interfaces/optimism",
"revm-primitives/optimism", "revm-primitives/optimism",
"reth-optimism-consensus/optimism", "reth-optimism-consensus/optimism",
] ]

View File

@ -65,4 +65,4 @@ rand.workspace = true
[features] [features]
test-utils = ["alloy-rlp", "reth-db/test-utils", "reth-nippy-jar/test-utils"] test-utils = ["alloy-rlp", "reth-db/test-utils", "reth-nippy-jar/test-utils"]
optimism = ["reth-primitives/optimism", "reth-interfaces/optimism"] optimism = ["reth-primitives/optimism"]