impl Resource Unavailable RPC error (#2072)

## Issue Addressed

Related to #1891, The error is not in the spec yet (see ethereum/eth2.0-specs#2131)

## Proposed Changes

Implement the proposed error, banning peers that send it

## Additional Info

NA
This commit is contained in:
divma 2020-12-15 00:17:32 +00:00
parent 701843aaa0
commit 11c299cbf6
3 changed files with 12 additions and 0 deletions

View File

@ -412,6 +412,12 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
} }
RPCError::ErrorResponse(code, _) => match code { RPCError::ErrorResponse(code, _) => match code {
RPCResponseErrorCode::Unknown => PeerAction::HighToleranceError, RPCResponseErrorCode::Unknown => PeerAction::HighToleranceError,
RPCResponseErrorCode::ResourceUnavailable => {
// NOTE: This error only makes sense for the `BlocksByRange` and `BlocksByRoot`
// protocols. For the time being, there is no reason why a peer should send
// this error.
PeerAction::Fatal
}
RPCResponseErrorCode::ServerError => PeerAction::MidToleranceError, RPCResponseErrorCode::ServerError => PeerAction::MidToleranceError,
RPCResponseErrorCode::InvalidRequest => PeerAction::LowToleranceError, RPCResponseErrorCode::InvalidRequest => PeerAction::LowToleranceError,
RPCResponseErrorCode::RateLimited => match protocol { RPCResponseErrorCode::RateLimited => match protocol {

View File

@ -262,6 +262,8 @@ pub enum RPCResponseErrorCode {
RateLimited, RateLimited,
InvalidRequest, InvalidRequest,
ServerError, ServerError,
/// Error spec'd to indicate that a peer does not have blocks on a requested range.
ResourceUnavailable,
Unknown, Unknown,
} }
@ -285,6 +287,7 @@ impl<T: EthSpec> RPCCodedResponse<T> {
let code = match response_code { let code = match response_code {
1 => RPCResponseErrorCode::InvalidRequest, 1 => RPCResponseErrorCode::InvalidRequest,
2 => RPCResponseErrorCode::ServerError, 2 => RPCResponseErrorCode::ServerError,
3 => RPCResponseErrorCode::ResourceUnavailable,
139 => RPCResponseErrorCode::RateLimited, 139 => RPCResponseErrorCode::RateLimited,
_ => RPCResponseErrorCode::Unknown, _ => RPCResponseErrorCode::Unknown,
}; };
@ -318,6 +321,7 @@ impl RPCResponseErrorCode {
match self { match self {
RPCResponseErrorCode::InvalidRequest => 1, RPCResponseErrorCode::InvalidRequest => 1,
RPCResponseErrorCode::ServerError => 2, RPCResponseErrorCode::ServerError => 2,
RPCResponseErrorCode::ResourceUnavailable => 3,
RPCResponseErrorCode::Unknown => 255, RPCResponseErrorCode::Unknown => 255,
RPCResponseErrorCode::RateLimited => 139, RPCResponseErrorCode::RateLimited => 139,
} }
@ -328,6 +332,7 @@ impl std::fmt::Display for RPCResponseErrorCode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let repr = match self { let repr = match self {
RPCResponseErrorCode::InvalidRequest => "The request was invalid", RPCResponseErrorCode::InvalidRequest => "The request was invalid",
RPCResponseErrorCode::ResourceUnavailable => "Resource unavailable",
RPCResponseErrorCode::ServerError => "Server error occurred", RPCResponseErrorCode::ServerError => "Server error occurred",
RPCResponseErrorCode::Unknown => "Unknown error occurred", RPCResponseErrorCode::Unknown => "Unknown error occurred",
RPCResponseErrorCode::RateLimited => "Rate limited", RPCResponseErrorCode::RateLimited => "Rate limited",

View File

@ -577,6 +577,7 @@ impl RPCError {
RPCResponseErrorCode::RateLimited => "rate_limited", RPCResponseErrorCode::RateLimited => "rate_limited",
RPCResponseErrorCode::InvalidRequest => "invalid_request", RPCResponseErrorCode::InvalidRequest => "invalid_request",
RPCResponseErrorCode::ServerError => "server_error", RPCResponseErrorCode::ServerError => "server_error",
RPCResponseErrorCode::ResourceUnavailable => "resource_unavailable",
RPCResponseErrorCode::Unknown => "unknown_response_code", RPCResponseErrorCode::Unknown => "unknown_response_code",
}, },
RPCError::StreamTimeout => "stream_timeout", RPCError::StreamTimeout => "stream_timeout",