MESSAGE-FORMATTING

FieldValue
NameMessage Formatting
Slug89
Statusraw
CategoryStandards Track
EditorMarcin Pawlowski
ContributorsYoungjoon Lee [email protected], Alexander Mozeika [email protected], Álvaro Castro-Castilla [email protected], Filip Dimitrijevic [email protected]

Timeline

  • 2026-08-315fa8ee4 — docs(blockchain): compress the block proposal with 16-byte transaction reference prefixes (#389)
  • 2026-08-19a2a85cb — RFC Bedrock: Cryptarchia with uncle references (#385)
  • 2026-07-03709cf7f — Bedrock-RFC: Remove Concept of a Session (#365)
  • 2026-05-28d45eed2 — Chore: mirror blochain specs into github/mdbook (#347)

Revision History

VersionChangesDate
1.0.0Initial revision.2026-04-09
1.0.1Corrected Max_Payload_Length to 34577 bytes, so that it again matches the Max_Body_Length of Payload Formatting plus the 3-byte payload header.2026-08-06
1.0.2Expressed Max_Payload_Length as Max_Body_Length + 3 rather than a literal, so that it tracks the payload body size automatically; it is 18195 bytes at the Max_Body_Length that follows from the compressed transaction references of Block Construction, Validation and Execution.2026-08-18

Introduction

This document defines an implementation-friendly specification of the Message Formatting, which is introduced in the Formatting section.

In this document we are reusing notation from Notation.

Overview

The message contains a header and a payload. The header informs the protocol about the version of the protocol and the payload type. The message contains a drop or a non-drop payload. The length of a payload is fixed to prevent adversaries from distinguishing types of messages based on their length.

Construction

Message

The Message is a structure that contains a public_header, private_header and a payload.

class Message:
    public_header: PublicHeader,
    private_header: Private_Header,
    payload: bytes

Public Header

The public_header must be generated as the outcome of the Message Encapsulation Mechanism.

The public_header is defined as follows:

class PublicHeader:
    version: byte,
    public_key: PublicKey,
    proof_of_quota: ProofOfQuota,
    signature: Signature

Where:

  • version=0x01 is version of the protocol.
  • public_key is , a public key from the set as defined in the Message Encapsulation spec.
  • proof_of_quota is , a corresponding proof of quota for the key from the it also contains the key nullifier.
  • signature is , a signature of the concatenation of the -th encapsulation of the payload and the private header , that can be verified by the public key .

Private Header

The private_header must be generated as the outcome of the Message Encapsulation Mechanism.

The private header contains a set of encrypted blending headers .

private_header: list[BlendingHeader]

The size of the set is limited to BlendingHeader entries, as defined in the Global Parameters.

The BlendingHeader () is defined as follows:

class BlendingHeader:
    public_key: PublicKey,
    proof_of_quota: ProofOfQuota,
    signature: Signature,
    proof_of_selection: ProofOfSelection
    is_last: byte

Where:

  • public_key is , a public key from the set .
  • proof_of_quota is , a corresponding proof of quota for the key from the it also contains the key nullifier.
  • signature is , a signature of the concatenation of -th encapsulation of the payload and the private header , that can be verified by public key .
  • proof_of_selection is , a proof of selection of the node index assuming valid proof of quota .
  • is_last is , a flag that indicates that this is the last encapsulation.

Payload

The payload must be formatted according to the Payload Formatting. The formatted payload must be generated as the outcome of the Message Encapsulation Mechanism.

Maximum Payload Length

The Max_Payload_Length parameter defines the maximum length of the payload. It is not an independent parameter: a payload is a 3-byte header followed by a body of exactly Max_Body_Length bytes, so

    Max_Payload_Length = Max_Body_Length + 3

which is 18195 bytes at the Max_Body_Length of 18192 currently set by Payload Formatting. Stating it as a derived value rather than a literal means that a change to the maximum block proposal size — which is what sets Max_Body_Length — reaches this parameter without an edit here. More information about payload formatting can be found in Payload Formatting.