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::{snap::SnapProtocolError, EthMessageID, 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(transparent)]
30 InvalidSnapMessage(#[from] SnapProtocolError),
31 #[error("message size ({0}) exceeds max length (10MB)")]
32 MessageTooBig(usize),
34 #[error(
35 "TransactionHashes invalid len of fields: hashes_len={hashes_len} types_len={types_len} sizes_len={sizes_len}"
36 )]
37 TransactionHashesInvalidLenOfFields {
39 hashes_len: usize,
41 types_len: usize,
43 sizes_len: usize,
45 },
46 #[error("never received data from remote peer")]
48 StreamTimeout,
49 #[error("Received unknown ETH message ID: 0x{message_id:X}")]
51 UnsupportedMessage {
52 message_id: u8,
54 },
55 #[error("received unsolicited {message_id:?} response with request id {request_id}")]
59 UnsolicitedResponse {
60 message_id: EthMessageID,
62 request_id: u64,
64 },
65 #[error(
69 "{message_id:?} response with request id {request_id} exceeds the {max_items} requested items"
70 )]
71 ResponseExceedsRequest {
72 message_id: EthMessageID,
74 request_id: u64,
76 max_items: usize,
78 },
79}
80
81impl EthStreamError {
84 pub const fn as_disconnected(&self) -> Option<DisconnectReason> {
86 if let Self::P2PStreamError(err) = self {
87 err.as_disconnected()
88 } else {
89 None
90 }
91 }
92
93 pub const fn is_protocol_breach(&self) -> bool {
98 matches!(
99 self,
100 Self::InvalidMessage(_) |
101 Self::InvalidSnapMessage(_) |
102 Self::MessageTooBig(_) |
103 Self::TransactionHashesInvalidLenOfFields { .. } |
104 Self::UnsupportedMessage { .. } |
105 Self::UnsolicitedResponse { .. } |
106 Self::ResponseExceedsRequest { .. } |
107 Self::P2PStreamError(
108 P2PStreamError::Rlp(_) |
109 P2PStreamError::Snap(_) |
110 P2PStreamError::MessageTooBig { .. } |
111 P2PStreamError::UnknownReservedMessageId(_) |
112 P2PStreamError::UnknownSubprotocolMessageId(_) |
113 P2PStreamError::EmptyProtocolMessage |
114 P2PStreamError::InvalidPingPongPayload(_) |
115 P2PStreamError::TooManyPings |
116 P2PStreamError::UnknownDisconnectReason(_)
117 )
118 )
119 }
120
121 pub const fn as_io(&self) -> Option<&io::Error> {
123 if let Self::P2PStreamError(P2PStreamError::Io(io)) = self {
124 return Some(io)
125 }
126 None
127 }
128}
129
130impl From<io::Error> for EthStreamError {
131 fn from(err: io::Error) -> Self {
132 P2PStreamError::from(err).into()
133 }
134}
135
136#[derive(thiserror::Error, Debug)]
138pub enum EthHandshakeError {
139 #[error("status message can only be recv/sent in handshake")]
141 StatusNotInHandshake,
142 #[error("received non-status message when trying to handshake")]
144 NonStatusMessageInHandshake,
145 #[error("no response received when sending out handshake")]
146 NoResponse,
148 #[error(transparent)]
149 InvalidFork(#[from] ValidationError),
151 #[error("mismatched genesis in status message: {0}")]
152 MismatchedGenesis(GotExpectedBoxed<B256>),
154 #[error("mismatched protocol version in status message: {0}")]
155 MismatchedProtocolVersion(GotExpected<EthVersion>),
157 #[error("mismatched chain in status message: {0}")]
158 MismatchedChain(GotExpected<Chain>),
160 #[error("total difficulty bitlen is too large: got {got}, maximum {maximum}")]
161 TotalDifficultyBitLenTooLarge {
163 got: usize,
165 maximum: usize,
167 },
168 #[error("earliest block > latest block: got {got}, latest {latest}")]
169 EarliestBlockGreaterThanLatestBlock {
171 got: u64,
173 latest: u64,
175 },
176 #[error("blockhash is zero")]
177 BlockhashZero,
179}