Blocks and headers
An accepted block is an atomic pair:
{canonical block bytes, matching HistoryStep terminal}
The block contains a fixed header and up to 256 fixed transaction bodies. The terminal proves the nonce-independent semantic header and complete State transition.
Block contents
Transaction position zero is the mandatory primary reward. A scheduled
development payout, when present, follows it. User PagedSpend pages occupy
the remaining positions in canonical group order.
| Limit | Value |
|---|---|
| Total fixed bodies, including system records | 256 |
| User page positions without scheduled payout | 255 |
| User page positions with scheduled payout | 254 |
| Live user inputs | 1,020 |
| Live user outputs | 510 |
| Live user actions | 1,530 |
| Distinct State segments touched | 256 |
The decoder rejects oversize counts before allocating or decoding their payload.
Transaction root
Every body occupies one leaf in a universal 256-leaf transaction tree. Unused positions have one canonical empty value. The tree is wrapped with the exact body count under the transaction-root domain, so appending or deleting empty- looking leaves cannot produce an equivalent block.
Receipts use an eight-level inclusion path into this tree. A logical
PagedSpend may occupy several consecutive leaves; the receipt binds its
logical position and page count.
Canonical header
The header has a fixed 212-byte little-endian encoding:
| Field | Size | Meaning |
|---|---|---|
prev_block_hash |
32 | Nonce-bearing parent block ID |
state_root |
32 | Exact post-State UTXO root |
tx_root |
32 | Count-bound transaction root |
timestamp |
8 | Unix time in seconds |
height |
8 | Child height |
miner_address |
32 | Primary reward recipient |
nonce |
16 | Poseidon2b PoW nonce |
difficulty_target |
32 | Exact little-endian ASERT target |
log_slots |
4 | Slot-domain exponent |
active_slot_count |
8 | Post-State live UTXO count |
alloc_counter |
8 | Post-State allocation counter |
Field order is consensus-locked. Future formats cannot reorder existing fields.
Two header identifiers
The nonce-bearing block ID hashes every field under the BLOCKHDR domain. It
is used for parent links, transaction epoch anchors and canonical block
identity.
The semantic header ID hashes the same fields in the same order but skips the
nonce and uses the SEMHDR__ domain. HistoryStep binds this projection so a
miner can vary the nonce without rebuilding the transition proof.
An accepting node requires the terminal and the native nonce-bearing header to refer to one identical set of non-nonce fields.
Primary reward
There is exactly one live primary reward output. Its creation_id uses a
disjoint height-tagged namespace:
2^63 | block_height
Ordinary output allocation remains below 2^63, so a reward record can never
collide with a user allocation identifier.
The primary reward may claim only the current miner subsidy and miner-claimable fees. It cannot reclaim the burned State-growth component.
Accepted bundle
The terminal includes metadata binding its version, height, semantic-header hash and proof class. Bundle decoding checks lengths before allocating and rejects trailing bytes, mismatched metadata or a terminal for another header.
Complete bundles are retained for 18 blocks. Headers are permanent.
See Proof of work for nonce validation and Receipts for durable transaction inclusion.