Message Blocks
What is a Message Block?
A message block is a special block type that stores signed data blobs instead of executing transactions. It contains:
Messages — Array of signed payloads
Messages Root — Merkle root for consensus verification
No Transactions — Empty transaction list
Minimal State Change — Only PMQ fee deductions
Message Structure
Every message contains these fields:
sender
20 bytes
Who signed the message
payload
Variable (max 8 KB)
Your data (opaque bytes)
timestamp
8 bytes
When included in block
signature
65 bytes
ECDSA proof of authorship
nonce
8 bytes
Replay protection (same-chain)
chainId
8 bytes
Replay protection (cross-chain)
bid
Variable
Priority fee in wei (0 for standard)
Payload Content
The payload field is opaque bytes. The protocol doesn't interpret it. Your application decides the format:
Plain text
JSON
Protocol Buffers
Encrypted data
Any binary format
Maximum size: 8 KB per message (configurable per network).
Block Structure
Block Capacity
Each message block has reserved slots for each queue type:
Key Property: Slots are independent. If PMQ only fills 2 MB, the unused 3 MB is not given to SMQ. This guarantees block space for both message types.
Capacity Numbers
Max block size
10 MB
Priority slot
5 MB
Standard slot
5 MB
Max message size
8 KB
Max messages/block
~1,280
Messages per slot
~640 each
Block Assembly
When it's time to build a message block:
Verification Layers
Messages are verified at multiple points:
RPC
Signature, chainId, nonce format, payload size
Queue
Duplicate detection, bid validation
Block Build
Final signature verification
P2P
Signature before gossip
Consensus
messages_root matches content
If any check fails, the message is rejected.
State Changes
Message blocks are unique: they're mostly stateless, but PMQ bids do affect state:
Standard messages (bid = 0) cause no state changes.
Next: Dual-Lane Queues — Understanding PMQ and SMQ
Last updated