Blocks
Block and block-header structure, serialization, and validity
A block is an 80-byte header followed by an ordered list of transactions. The header commits to the block's transactions through the Merkle root and to the previous block through its hash, linking blocks into a chain. This page specifies the exact serialization and the consensus rules that make a block's structural fields valid.
Ground truth. The layouts below derive from CBlockHeader/CBlock in src/primitives/block.h, Merkle construction from src/consensus/merkle.cpp, and proof-of-work from src/pow.cpp. All citations are pinned to release v1.2.2 (commit 879fc8b).
Block header (80 bytes)
The header is a fixed 80 bytes: six fields, in this exact order (CBlockHeader::SerializationOp, block.h L36–L46):
1
nVersion
int32
4
little-endian, signed
Block version. Must be ≥ 2 at/after the BIP34 activation height (see Coinbase height).
2
hashPrevBlock
hash
32
internal byte order
Double-SHA-256 of the previous block's 80-byte header.
4
nTime
uint32
4
little-endian
Block timestamp (Unix epoch seconds).
6
nNonce
uint32
4
little-endian
Nonce varied during mining.
The block hash is the double-SHA-256 of these 80 bytes, displayed as big-endian hex. Only the header is hashed for proof of work; the transactions are bound to it through hashMerkleRoot.
Block body
A full block is the header followed by its transactions (CBlock::SerializationOp, block.h L97–L102):
1
header
CBlockHeader
80
see above
The 80-byte header.
2
transaction count
CompactSize
1–9
little-endian
Number of transactions that follow.
3
vtx
CTransaction[]
variable
—
The transactions, back to back (see Transactions). The first transaction must be the coinbase.
The CompactSize count uses the same encoding as elsewhere in the protocol (1, 3, 5, or 9 bytes; see Transactions).
Merkle root construction
hashMerkleRoot commits to every transaction. It is built bottom-up (ComputeMerkleRoot / BlockMerkleRoot, merkle.cpp L150–L184):
The leaves are the transaction IDs (TxIDs), in block order.
At each level, adjacent nodes are paired and each pair is hashed with double-SHA-256 of the two 32-byte values concatenated.
If a level has an odd number of nodes, the last node is paired with itself.
This repeats until a single 32-byte root remains. A block with one transaction has that transaction's TxID as the root.
Mutation guard (CVE-2012-2459). Because the odd-node rule duplicates the last hash, an attacker could once craft two different transaction lists producing the same root. The builder detects any duplicated adjacent subtree hash and sets a mutated flag (mutated |= (inner[level] == h), merkle.cpp L89); a block whose Merkle computation is flagged mutated is treated as having an invalid Merkle root and is rejected. The calculator is limited to 2³² leaves.
Coinbase height (BIP34)
At and after the BIP34 activation height, the coinbase transaction's scriptSig must begin with the block height, serialized as a Script number push. The node builds the expected prefix as CScript() << nHeight and requires the coinbase scriptSig to start with exactly those bytes (validation.cpp L6039–L6048); a mismatch is rejected as bad-cb-height. From the same height, blocks with nVersion < 2 are rejected.
Proof of work
A block header is valid under proof of work when its hash meets the target encoded in nBits (CheckProofOfWork, pow.cpp L150–L171):
Decode
nBitsfrom its compact form to a 256-bit target.Reject if the target is negative, zero, overflows, or exceeds the chain's
powLimit(the maximum/easiest allowed target).Require
blockHash ≤ target(both interpreted as 256-bit big integers).
nBits itself must equal the value required by the difficulty-adjustment algorithm for that height (GetNextWorkRequired, pow.cpp L95). BSV's history here is: the original retarget, then the Emergency Difficulty Adjustment (EDA) introduced at the UAHF fork, replaced by the current Difficulty Adjustment Algorithm (DAA) at the daaHeight (mainnet 504,031), which retargets each block from a 144-block window. Target block spacing is 10 minutes. The details of how the next target is computed are consensus (they determine whether a block's nBits is valid); the mining machinery that searches for a nonce is not part of the protocol.
Block size by era
Maximum block size
LEGACY_MAX_BLOCK_SIZE = 1,000,000 bytes (1 MB), consensus (consensus.h L31)
raised, miner-configurable consensus cap
miner-configurable consensus cap (no fixed protocol maximum)
From the UAHF onward the block-size limit became a value miners set rather than a single hard-coded constant. There is a consensus limit at any moment (a block exceeding the active cap is invalid); the specific number a node uses is an operator-chosen policy value (e.g. MAIN_DEFAULT_MAX_BLOCK_SIZE) and is not itself part of the validity contract. See Protocol Upgrade History for the activation timeline.
Last updated
