eth/eth/messages.hpp¶
Namespaces¶
| Name |
|---|
| eth |
| eth::protocol |
Types¶
| Name | |
|---|---|
| using std::vector< uint8_t > | ByteBuffer |
| using rlp::EncodingResult< ByteBuffer > | EncodeResult |
| template <typename T > using rlp::Result< T > |
DecodeResult |
| using rlp::outcome::result< void, eth::StatusValidationError, rlp::outcome::policy::all_narrow > | ValidationResult Result type for Status validation (void on success, error on mismatch). Uses boost::outcome with StatusValidationError — mirrors go-ethereum's readStatus() return values from eth/protocols/eth/handshake.go. |
Functions¶
| Name | |
|---|---|
| ValidationResult | validate_status(const eth::StatusMessage & msg, uint64_t expected_network_id, const eth::Hash256 & expected_genesis) Validate a decoded StatusMessage against our expected chain parameters. |
| EncodeResult | encode_status(const StatusMessage & msg) |
| DecodeResult< StatusMessage > | decode_status(rlp::ByteView rlp_data) |
| DecodeResult< StatusMessage > | decode_status(rlp::ByteView rlp_data, const std::vector< eth::EthMessageSchema > & schemas) |
| EncodeResult | encode_new_block_hashes(const NewBlockHashesMessage & msg) |
| DecodeResult< NewBlockHashesMessage > | decode_new_block_hashes(rlp::ByteView rlp_data) |
| EncodeResult | encode_new_pooled_tx_hashes(const NewPooledTransactionHashesMessage & msg) |
| DecodeResult< NewPooledTransactionHashesMessage > | decode_new_pooled_tx_hashes(rlp::ByteView rlp_data) |
| EncodeResult | encode_block_range_update(const BlockRangeUpdateMessage & msg) |
| DecodeResult< BlockRangeUpdateMessage > | decode_block_range_update(rlp::ByteView rlp_data) |
| EncodeResult | encode_upgrade_status(const UpgradeStatusMessage & msg) |
| DecodeResult< UpgradeStatusMessage > | decode_upgrade_status(rlp::ByteView rlp_data) |
| EncodeResult | encode_get_block_headers(const GetBlockHeadersMessage & msg) |
| DecodeResult< GetBlockHeadersMessage > | decode_get_block_headers(rlp::ByteView rlp_data) |
| EncodeResult | encode_block_headers(const BlockHeadersMessage & msg) |
| DecodeResult< BlockHeadersMessage > | decode_block_headers(rlp::ByteView rlp_data) |
| EncodeResult | encode_get_block_bodies(const GetBlockBodiesMessage & msg) |
| DecodeResult< GetBlockBodiesMessage > | decode_get_block_bodies(rlp::ByteView rlp_data) |
| EncodeResult | encode_block_bodies(const BlockBodiesMessage & msg) |
| DecodeResult< BlockBodiesMessage > | decode_block_bodies(rlp::ByteView rlp_data) |
| DecodeResult< BlockBodiesMessage > | decode_block_bodies(rlp::ByteView rlp_data, const std::vector< eth::EthMessageSchema > & schemas) |
| EncodeResult | encode_new_block(const NewBlockMessage & msg) |
| DecodeResult< NewBlockMessage > | decode_new_block(rlp::ByteView rlp_data) |
| DecodeResult< NewBlockMessage > | decode_new_block(rlp::ByteView rlp_data, const std::vector< eth::EthMessageSchema > & schemas) |
| EncodeResult | encode_get_receipts(const GetReceiptsMessage & msg) |
| DecodeResult< GetReceiptsMessage > | decode_get_receipts(rlp::ByteView rlp_data) |
| DecodeResult< GetReceiptsMessage > | decode_get_receipts(rlp::ByteView rlp_data, const std::vector< eth::EthMessageSchema > & schemas) |
| EncodeResult | encode_receipts(const ReceiptsMessage & msg) |
| DecodeResult< ReceiptsMessage > | decode_receipts(rlp::ByteView rlp_data) |
| DecodeResult< ReceiptsMessage > | decode_receipts(rlp::ByteView rlp_data, const std::vector< eth::EthMessageSchema > & schemas) |
| EncodeResult | encode_get_pooled_transactions(const GetPooledTransactionsMessage & msg) |
| DecodeResult< GetPooledTransactionsMessage > | decode_get_pooled_transactions(rlp::ByteView rlp_data) |
| EncodeResult | encode_pooled_transactions(const PooledTransactionsMessage & msg) |
| DecodeResult< PooledTransactionsMessage > | decode_pooled_transactions(rlp::ByteView rlp_data) |
Attributes¶
| Name | |
|---|---|
| uint8_t | kStatusMessageId |
| std::chrono::seconds | kStatusHandshakeTimeout Maximum time to wait for a peer's ETH Status after sending ours. Matches go-ethereum's handshakeTimeout (eth/protocols/eth/handshake.go). If the peer does not reply within this window it is dropped as malicious or mismatched (e.g. a Polygon bor node on the Ethereum P2P network). |
| uint8_t | kNewBlockHashesMessageId |
| uint8_t | kTransactionsMessageId |
| uint8_t | kGetBlockHeadersMessageId |
| uint8_t | kBlockHeadersMessageId |
| uint8_t | kGetBlockBodiesMessageId |
| uint8_t | kBlockBodiesMessageId |
| uint8_t | kNewBlockMessageId |
| uint8_t | kNewPooledTransactionHashesMessageId |
| uint8_t | kGetPooledTransactionsMessageId |
| uint8_t | kPooledTransactionsMessageId |
| uint8_t | kUpgradeStatusMessageId |
| uint8_t | kGetReceiptsMessageId |
| uint8_t | kReceiptsMessageId |
| uint8_t | kBlockRangeUpdateMessageId |
Types Documentation¶
using ByteBuffer¶
using EncodeResult¶
using DecodeResult¶
using ValidationResult¶
using eth::protocol::ValidationResult = rlp::outcome::result<void, eth::StatusValidationError,
rlp::outcome::policy::all_narrow>;
Result type for Status validation (void on success, error on mismatch). Uses boost::outcome with StatusValidationError — mirrors go-ethereum's readStatus() return values from eth/protocols/eth/handshake.go.
Functions Documentation¶
function validate_status¶
ValidationResult validate_status(
const eth::StatusMessage & msg,
uint64_t expected_network_id,
const eth::Hash256 & expected_genesis
)
Validate a decoded StatusMessage against our expected chain parameters.
Parameters:
- msg The decoded peer Status message (variant).
- expected_network_id Our chain's network ID.
- expected_genesis Our chain's genesis block hash.
Return: Success, or the first validation error encountered.
Mirrors go-ethereum's readStatus() checks (handshake.go):
- NetworkID must match
expected_network_id - Genesis must match
expected_genesis - For ETH/69: EarliestBlock must be <= LatestBlock (when LatestBlock != 0)
function encode_status¶
function decode_status¶
function decode_status¶
DecodeResult< StatusMessage > decode_status(
rlp::ByteView rlp_data,
const std::vector< eth::EthMessageSchema > & schemas
)
function encode_new_block_hashes¶
function decode_new_block_hashes¶
function encode_new_pooled_tx_hashes¶
function decode_new_pooled_tx_hashes¶
DecodeResult< NewPooledTransactionHashesMessage > decode_new_pooled_tx_hashes(
rlp::ByteView rlp_data
)
function encode_block_range_update¶
function decode_block_range_update¶
function encode_upgrade_status¶
function decode_upgrade_status¶
function encode_get_block_headers¶
function decode_get_block_headers¶
function encode_block_headers¶
function decode_block_headers¶
function encode_get_block_bodies¶
function decode_get_block_bodies¶
function encode_block_bodies¶
function decode_block_bodies¶
function decode_block_bodies¶
DecodeResult< BlockBodiesMessage > decode_block_bodies(
rlp::ByteView rlp_data,
const std::vector< eth::EthMessageSchema > & schemas
)
function encode_new_block¶
function decode_new_block¶
function decode_new_block¶
DecodeResult< NewBlockMessage > decode_new_block(
rlp::ByteView rlp_data,
const std::vector< eth::EthMessageSchema > & schemas
)
function encode_get_receipts¶
function decode_get_receipts¶
function decode_get_receipts¶
DecodeResult< GetReceiptsMessage > decode_get_receipts(
rlp::ByteView rlp_data,
const std::vector< eth::EthMessageSchema > & schemas
)
function encode_receipts¶
function decode_receipts¶
function decode_receipts¶
DecodeResult< ReceiptsMessage > decode_receipts(
rlp::ByteView rlp_data,
const std::vector< eth::EthMessageSchema > & schemas
)
function encode_get_pooled_transactions¶
function decode_get_pooled_transactions¶
DecodeResult< GetPooledTransactionsMessage > decode_get_pooled_transactions(
rlp::ByteView rlp_data
)
function encode_pooled_transactions¶
function decode_pooled_transactions¶
Attributes Documentation¶
variable kStatusMessageId¶
variable kStatusHandshakeTimeout¶
Maximum time to wait for a peer's ETH Status after sending ours. Matches go-ethereum's handshakeTimeout (eth/protocols/eth/handshake.go). If the peer does not reply within this window it is dropped as malicious or mismatched (e.g. a Polygon bor node on the Ethereum P2P network).
variable kNewBlockHashesMessageId¶
variable kTransactionsMessageId¶
variable kGetBlockHeadersMessageId¶
variable kBlockHeadersMessageId¶
variable kGetBlockBodiesMessageId¶
variable kBlockBodiesMessageId¶
variable kNewBlockMessageId¶
variable kNewPooledTransactionHashesMessageId¶
variable kGetPooledTransactionsMessageId¶
variable kPooledTransactionsMessageId¶
variable kUpgradeStatusMessageId¶
variable kGetReceiptsMessageId¶
variable kReceiptsMessageId¶
variable kBlockRangeUpdateMessageId¶
Source code¶
// Copyright 2026 Genius Ventures, Inc.
// SPDX-License-Identifier: MIT
#ifndef EVMRELAY_INCLUDE_ETH_MESSAGES_HPP
#define EVMRELAY_INCLUDE_ETH_MESSAGES_HPP
#include "eth_types.hpp"
#include <rlp/rlp_encoder.hpp>
#include <rlp/rlp_decoder.hpp>
#include <chrono>
#include <vector>
namespace eth::protocol {
inline constexpr uint8_t kStatusMessageId = 0x00;
inline constexpr std::chrono::seconds kStatusHandshakeTimeout{5};
inline constexpr uint8_t kNewBlockHashesMessageId = 0x01;
inline constexpr uint8_t kTransactionsMessageId = 0x02;
inline constexpr uint8_t kGetBlockHeadersMessageId = 0x03;
inline constexpr uint8_t kBlockHeadersMessageId = 0x04;
inline constexpr uint8_t kGetBlockBodiesMessageId = 0x05;
inline constexpr uint8_t kBlockBodiesMessageId = 0x06;
inline constexpr uint8_t kNewBlockMessageId = 0x07;
inline constexpr uint8_t kNewPooledTransactionHashesMessageId = 0x08;
inline constexpr uint8_t kGetPooledTransactionsMessageId = 0x09;
inline constexpr uint8_t kPooledTransactionsMessageId = 0x0a;
inline constexpr uint8_t kUpgradeStatusMessageId = 0x0b;
inline constexpr uint8_t kGetReceiptsMessageId = 0x0f;
inline constexpr uint8_t kReceiptsMessageId = 0x10;
inline constexpr uint8_t kBlockRangeUpdateMessageId = 0x11;
using ByteBuffer = std::vector<uint8_t>;
using EncodeResult = rlp::EncodingResult<ByteBuffer>;
template <typename T>
using DecodeResult = rlp::Result<T>;
using ValidationResult = rlp::outcome::result<void, eth::StatusValidationError,
rlp::outcome::policy::all_narrow>;
[[nodiscard]] ValidationResult validate_status(
const eth::StatusMessage& msg,
uint64_t expected_network_id,
const eth::Hash256& expected_genesis) noexcept;
// STATUS
[[nodiscard]] EncodeResult encode_status(const StatusMessage& msg) noexcept;
[[nodiscard]] DecodeResult<StatusMessage> decode_status(rlp::ByteView rlp_data) noexcept;
[[nodiscard]] DecodeResult<StatusMessage> decode_status(
rlp::ByteView rlp_data,
const std::vector<eth::EthMessageSchema>& schemas) noexcept;
// NEW_BLOCK_HASHES
[[nodiscard]] EncodeResult encode_new_block_hashes(const NewBlockHashesMessage& msg) noexcept;
[[nodiscard]] DecodeResult<NewBlockHashesMessage> decode_new_block_hashes(rlp::ByteView rlp_data) noexcept;
// NEW_POOLED_TRANSACTION_HASHES
[[nodiscard]] EncodeResult encode_new_pooled_tx_hashes(const NewPooledTransactionHashesMessage& msg) noexcept;
[[nodiscard]] DecodeResult<NewPooledTransactionHashesMessage> decode_new_pooled_tx_hashes(rlp::ByteView rlp_data) noexcept;
// BLOCK_RANGE_UPDATE
[[nodiscard]] EncodeResult encode_block_range_update(const BlockRangeUpdateMessage& msg) noexcept;
[[nodiscard]] DecodeResult<BlockRangeUpdateMessage> decode_block_range_update(rlp::ByteView rlp_data) noexcept;
// UPGRADE_STATUS
[[nodiscard]] EncodeResult encode_upgrade_status(const UpgradeStatusMessage& msg) noexcept;
[[nodiscard]] DecodeResult<UpgradeStatusMessage> decode_upgrade_status(rlp::ByteView rlp_data) noexcept;
// GET_BLOCK_HEADERS
[[nodiscard]] EncodeResult encode_get_block_headers(const GetBlockHeadersMessage& msg) noexcept;
[[nodiscard]] DecodeResult<GetBlockHeadersMessage> decode_get_block_headers(rlp::ByteView rlp_data) noexcept;
// BLOCK_HEADERS
[[nodiscard]] EncodeResult encode_block_headers(const BlockHeadersMessage& msg) noexcept;
[[nodiscard]] DecodeResult<BlockHeadersMessage> decode_block_headers(rlp::ByteView rlp_data) noexcept;
// GET_BLOCK_BODIES
[[nodiscard]] EncodeResult encode_get_block_bodies(const GetBlockBodiesMessage& msg) noexcept;
[[nodiscard]] DecodeResult<GetBlockBodiesMessage> decode_get_block_bodies(rlp::ByteView rlp_data) noexcept;
// BLOCK_BODIES
[[nodiscard]] EncodeResult encode_block_bodies(const BlockBodiesMessage& msg) noexcept;
[[nodiscard]] DecodeResult<BlockBodiesMessage> decode_block_bodies(rlp::ByteView rlp_data) noexcept;
[[nodiscard]] DecodeResult<BlockBodiesMessage> decode_block_bodies(
rlp::ByteView rlp_data,
const std::vector<eth::EthMessageSchema>& schemas) noexcept;
// NEW_BLOCK
[[nodiscard]] EncodeResult encode_new_block(const NewBlockMessage& msg) noexcept;
[[nodiscard]] DecodeResult<NewBlockMessage> decode_new_block(rlp::ByteView rlp_data) noexcept;
[[nodiscard]] DecodeResult<NewBlockMessage> decode_new_block(
rlp::ByteView rlp_data,
const std::vector<eth::EthMessageSchema>& schemas) noexcept;
// GET_RECEIPTS
[[nodiscard]] EncodeResult encode_get_receipts(const GetReceiptsMessage& msg) noexcept;
[[nodiscard]] DecodeResult<GetReceiptsMessage> decode_get_receipts(rlp::ByteView rlp_data) noexcept;
[[nodiscard]] DecodeResult<GetReceiptsMessage> decode_get_receipts(
rlp::ByteView rlp_data,
const std::vector<eth::EthMessageSchema>& schemas) noexcept;
// RECEIPTS
[[nodiscard]] EncodeResult encode_receipts(const ReceiptsMessage& msg) noexcept;
[[nodiscard]] DecodeResult<ReceiptsMessage> decode_receipts(rlp::ByteView rlp_data) noexcept;
[[nodiscard]] DecodeResult<ReceiptsMessage> decode_receipts(
rlp::ByteView rlp_data,
const std::vector<eth::EthMessageSchema>& schemas) noexcept;
// GET_POOLED_TRANSACTIONS
[[nodiscard]] EncodeResult encode_get_pooled_transactions(const GetPooledTransactionsMessage& msg) noexcept;
[[nodiscard]] DecodeResult<GetPooledTransactionsMessage> decode_get_pooled_transactions(rlp::ByteView rlp_data) noexcept;
// POOLED_TRANSACTIONS
[[nodiscard]] EncodeResult encode_pooled_transactions(const PooledTransactionsMessage& msg) noexcept;
[[nodiscard]] DecodeResult<PooledTransactionsMessage> decode_pooled_transactions(rlp::ByteView rlp_data) noexcept;
} // namespace eth::protocol
#endif // EVMRELAY_INCLUDE_ETH_MESSAGES_HPP
Updated on 2026-06-05 at 17:22:19 -0700