reth_eth_wire/errors/
eth.rs1use crate::{
4 errors::P2PStreamError, message::MessageError, version::ParseVersionError, DisconnectReason,
5};
6use alloy_chains::Chain;
7use alloy_primitives::B256;
8use reth_eth_wire_types::EthVersion;
9use reth_ethereum_forks::ValidationError;
10use reth_primitives_traits::{GotExpected, GotExpectedBoxed};
11use std::io;
12
13#[derive(thiserror::Error, Debug)]
15pub enum EthStreamError {
16 #[error(transparent)]
17 P2PStreamError(#[from] P2PStreamError),
19 #[error(transparent)]
20 ParseVersionError(#[from] ParseVersionError),
22 #[error(transparent)]
23 EthHandshakeError(#[from] EthHandshakeError),
25 #[error(transparent)]
27 InvalidMessage(#[from] MessageError),
28 #[error("message size ({0}) exceeds max length (10MB)")]
29 MessageTooBig(usize),
31 #[error("TransactionHashes invalid len of fields: hashes_len={hashes_len} types_len={types_len} sizes_len={sizes_len}")]
32 TransactionHashesInvalidLenOfFields {
34 hashes_len: usize,
36 types_len: usize,
38 sizes_len: usize,
40 },
41 #[error("never received data from remote peer")]
43 StreamTimeout,
44}
45
46impl EthStreamError {
49 pub const fn as_disconnected(&self) -> Option<DisconnectReason> {
51 if let Self::P2PStreamError(err) = self {
52 err.as_disconnected()
53 } else {
54 None
55 }
56 }
57
58 pub const fn as_io(&self) -> Option<&io::Error> {
60 if let Self::P2PStreamError(P2PStreamError::Io(io)) = self {
61 return Some(io)
62 }
63 None
64 }
65}
66
67impl From<io::Error> for EthStreamError {
68 fn from(err: io::Error) -> Self {
69 P2PStreamError::from(err).into()
70 }
71}
72
73#[derive(thiserror::Error, Debug)]
75pub enum EthHandshakeError {
76 #[error("status message can only be recv/sent in handshake")]
78 StatusNotInHandshake,
79 #[error("received non-status message when trying to handshake")]
81 NonStatusMessageInHandshake,
82 #[error("no response received when sending out handshake")]
83 NoResponse,
85 #[error(transparent)]
86 InvalidFork(#[from] ValidationError),
88 #[error("mismatched genesis in status message: {0}")]
89 MismatchedGenesis(GotExpectedBoxed<B256>),
91 #[error("mismatched protocol version in status message: {0}")]
92 MismatchedProtocolVersion(GotExpected<EthVersion>),
94 #[error("mismatched chain in status message: {0}")]
95 MismatchedChain(GotExpected<Chain>),
97 #[error("total difficulty bitlen is too large: got {got}, maximum {maximum}")]
98 TotalDifficultyBitLenTooLarge {
100 got: usize,
102 maximum: usize,
104 },
105}