PAYLOAD-FORMATTING

FieldValue
NamePayload Formatting
Slug97
Statusraw
CategoryStandards Track
EditorMarcin Pawlowski [email protected]
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.1.0Updated Max_Body_Length to 34574 bytes, the maximum block proposal size once a proposal carries the signed headers of the uncles it references (see Block Construction, Validation and Execution).2026-08-06
1.1.1Updated Max_Body_Length to 18192 bytes, following the compression of transaction references to 16-byte prefixes and their encoding as a variable-length list (see Block Construction, Validation and Execution).2026-08-18

Introduction

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

Overview

The payload contains a header and a body. The header informs the protocol about the way the body must be handled. The body contains a raw message (data/proposal or cover message). The payload must be of a fixed length to prevent adversaries from distinguishing types of messages based on their length. Therefore, shorter messages must be padded with random data.

Construction

Payload

The Payload is a structure that contains a header and a body.

class Payload:
    header: Header,
    body: bytes

The header is a structure that contains a body_type and a body_length.

class Header:
    body_type: byte,
    body_length: uint16

Type

We define the following values of the body_type:

  • body_type=0x00, informs that the body contains a cover message.
  • body_type=0x01, informs that the body contains a data message.

Any other value of type means that the message was not decapsulated correctly and must be discarded.

Length

We define the body_length as uint16 (encoded as little-endian). Therefore, the theoretical limit of the length of the body is 65535 bytes. The body_length must be set to the length of the body of the payload message (body_length=len(raw_message)).

Body

The Max_Body_Length parameter defines the maximum length of the body. The maximal length of a raw data message is the maximum size of a Block Proposal — 18192 bytes, reached when the proposal carries MAX_UNCLES signed uncle headers and references MAX_BLOCK_TXS transactions — so the Max_Body_Length=18192. Because the padding below fixes every body to this length, the variable size of a proposal (which depends on the number of referenced uncles and transactions) is not observable on the wire, which is what preserves the indistinguishability of proposals required by the Blend Protocol.

The body length is fixed to Max_Body_Length bytes. Therefore, if the length of the raw message is shorter than the Max_Body_Length, then it must be padded with random data.

If the body length is less than the Max_Body_Length, then the last Max_Body_Length - len(Raw_Message) bytes must be filled with random data.