Avalanche Network Protocol
Overview
Avalanche network defines the core communication format between Avalanche nodes. It uses the primitive serialization format for payload packing.
"Containers" are mentioned extensively in the description. A Container is simply a generic term for blocks.
This document describes the protocol for peer-to-peer communication using Protocol Buffers (proto3). The protocol defines a set of messages exchanged between peers in a peer-to-peer network. Each message is represented by the Message proto message, which can encapsulate various types of messages, including network messages, state-sync messages, bootstrapping messages, consensus messages, and application messages.
Message
The Message proto message is the main container for all peer-to-peer communication. It uses the oneof construct to represent different message types. The supported compression algorithms include Gzip and Zstd.
Compression
The compressed_gzip and compressed_zstd fields are used for Gzip and Zstd compression, respectively, of the encapsulated message. These fields are set only if the message type supports compression.
Network Messages
Ping
The Ping message reports a peer's perceived uptime percentage.
uptime: Uptime percentage on the primary network [0, 100].subnet_uptimes: Uptime percentages on Avalanche L1s.
Pong
The Pong message is sent in response to a Ping with the perceived uptime of the peer.
Version
The Version message is the first outbound message sent to a peer during the p2p handshake.
network_id: Network identifier (e.g., local, testnet, Mainnet).my_time: Unix timestamp when theVersionmessage was created.ip_addr: IP address of the peer.ip_port: IP port of the peer.my_version: Avalanche client version.my_version_time: Timestamp of the IP.sig: Signature of the peer IP port pair at a provided timestamp.tracked_subnets: Avalanche L1s the peer is tracking.
PeerList
The PeerList message contains network-level metadata for a set of validators.
claimed_ip_ports: List of claimed IP and port pairs.
PeerListAck
The PeerListAck message is sent in response to PeerList to acknowledge the subset of peers that the peer will attempt to connect to.
peer_acks: List of acknowledged peers.
State-Sync Messages
GetStateSummaryFrontier
The GetStateSummaryFrontier message requests a peer's most recently accepted state summary.
chain_id: Chain being requested from.request_id: Unique identifier for this request.deadline: Timeout (ns) for this request.
StateSummaryFrontier
The StateSummaryFrontier message is sent in response to a GetStateSummaryFrontier request.
chain_id: Chain being responded from.request_id: Request ID of the originalGetStateSummaryFrontierrequest.summary: The requested state summary.
GetAcceptedStateSummary
The GetAcceptedStateSummary message requests a set of state summaries at specified block heights.
chain_id: Chain being requested from.request_id: Unique identifier for this request.deadline: Timeout (ns) for this request.heights: Heights being requested.
AcceptedStateSummary
The AcceptedStateSummary message is sent in response to GetAcceptedStateSummary.
chain_id: Chain being responded from.request_id: Request ID of the originalGetAcceptedStateSummaryrequest.summary_ids: State summary IDs.
Bootstrapping Messages
GetAcceptedFrontier
The GetAcceptedFrontier message requests the accepted frontier from a peer.
chain_id: Chain being requested from.request_id: Unique identifier for this request.deadline: Timeout (ns) for this request.engine_type: Consensus type the remote peer should use to handle this message.
AcceptedFrontier
The AcceptedFrontier message contains the remote peer's last accepted frontier.
chain_id: Chain being responded from.request_id: Request ID of the originalGetAcceptedFrontierrequest.container_id: The ID of the last accepted frontier.
GetAccepted
The GetAccepted message sends a request with the sender's accepted frontier to a remote peer.
chain_id: Chain being requested from.request_id: Unique identifier for this message.deadline: Timeout (ns) for this request.container_ids: The
sender's accepted frontier.
engine_type: Consensus type to handle this message.
Accepted
The Accepted message is sent in response to GetAccepted.
chain_id: Chain being responded from.request_id: Request ID of the originalGetAcceptedrequest.container_ids: Subset of container IDs from theGetAcceptedrequest that the sender has accepted.
GetAncestors
The GetAncestors message requests the ancestors for a given container.
chain_id: Chain being requested from.request_id: Unique identifier for this request.deadline: Timeout (ns) for this request.container_id: Container for which ancestors are being requested.engine_type: Consensus type to handle this message.
Ancestors
The Ancestors message is sent in response to GetAncestors.
chain_id: Chain being responded from.request_id: Request ID of the originalGetAncestorsrequest.containers: Ancestry for the requested container.
Consensus Messages
Get
The Get message requests a container from a remote peer.
chain_id: Chain being requested from.request_id: Unique identifier for this request.deadline: Timeout (ns) for this request.container_id: Container being requested.engine_type: Consensus type to handle this message.
Put
The Put message is sent in response to Get with the requested block.
chain_id: Chain being responded from.request_id: Request ID of the originalGetrequest.container: Requested container.engine_type: Consensus type to handle this message.
PushQuery
The PushQuery message requests the preferences of a remote peer given a container.
chain_id: Chain being requested from.request_id: Unique identifier for this request.deadline: Timeout (ns) for this request.container: Container being gossiped.engine_type: Consensus type to handle this message.requested_height: Requesting peer's last accepted height.
PullQuery
The PullQuery message requests the preferences of a remote peer given a container id.
chain_id: Chain being requested from.request_id: Unique identifier for this request.deadline: Timeout (ns) for this request.container_id: Container id being gossiped.engine_type: Consensus type to handle this message.requested_height: Requesting peer's last accepted height.
Chits
The Chits message contains the preferences of a peer in response to a PushQuery or PullQuery message.
chain_id: Chain being responded from.request_id: Request ID of the originalPushQuery/PullQueryrequest.preferred_id: Currently preferred block.accepted_id: Last accepted block.preferred_id_at_height: Currently preferred block at the requested height.
Application Messages
AppRequest
The AppRequest message is a VM-defined request.
chain_id: Chain being requested from.request_id: Unique identifier for this request.deadline: Timeout (ns) for this request.app_bytes: Request body.
AppResponse
The AppResponse message is a VM-defined response sent in response to AppRequest.
chain_id: Chain being responded from.request_id: Request ID of the originalAppRequest.app_bytes: Response body.
AppGossip
The AppGossip message is a VM-defined message.
chain_id: Chain the message is for.app_bytes: Message body.
Last updated on