Kaspalytics Learn is under (heavy) construction. Check back regularly!
Updated: Aug 4, 2026

Block Model

The objects a Kaspa block is built from - the header and its twelve fields, the parent lists, the three commitments, and the body the header commits to.

Blocks described what a block does. This one describes what it is made of: two objects, one of which is a fixed list of twelve fields and nothing else.

Two objects, nested

Block
├─ header  →  Header
│   ├─ version
│   ├─ parentsByLevel[][]     →  32-byte block hashes, grouped by level
│   ├─ hashMerkleRoot
│   ├─ acceptedIdMerkleRoot
│   ├─ utxoCommitment
│   ├─ timestamp
│   ├─ bits
│   ├─ nonce
│   ├─ daaScore
│   ├─ blueScore
│   ├─ blueWork
│   └─ pruningPoint
└─ transactions[]
    └─ Transaction            →  the object tree on Transaction Model

The header is a leaf. It holds no nested objects at all - twelve scalars and one array of arrays of hashes. That flatness is what lets the header travel on its own: headers-first sync, pruning proofs, and proof-of-work checking all operate on this object without ever fetching a body.

The header

FieldHoldsWhy it exists
versionu16Selects how the rest is read.
parentsByLevelarray of arrays of 32-byte hashesThe blocks this one builds on. See below.
hashMerkleRoot32 bytesCommits to the transactions in this block’s own body.
acceptedIdMerkleRoot32 bytesCommits to the transaction ids this block accepts.
utxoCommitment32 bytesCommits to the whole UTXO set after those acceptances.
timestampu64Milliseconds since the Unix epoch, as claimed by the miner.
bitsu32The difficulty target, compactly encoded.
nonceu64What the miner varies to search for a hash under the target.
daaScoreu64The blocks in this block’s past that the difficulty window counted.
blueScoreu64How many blue blocks are in this block’s past.
blueWork192-bit integerThe work accumulated across those blue blocks.
pruningPoint32 bytesThe pruning point this block commits to.

Three of those fields are claims, not facts. daaScore, blueScore and blueWork are values the miner writes into the header, and every node recomputes all three from the DAG itself and rejects the block if its own answer differs. They are in the header so that a node holding only headers can still order them - not because anyone is trusted to report them.

Parents are grouped by level

parentsByLevel is an array of arrays. The outer index is the block level, and only the first one is about consensus ordering.

LevelContainsUsed for
0The tips the miner had seen. At most 16.GHOSTDAG ordering, mergeset selection, everything a node does with the DAG normally.
1+Sparser links to blocks that themselves cleared a harder target.Pruning proofs - letting a syncing node verify a long stretch of history without downloading every block in it.

A block’s own level is not a stored field. It falls out of its hash: a block whose proof of work landed far under the required target would also have satisfied a much harder one, so it counts as a block at every level it could have cleared. Lucky blocks become the skeleton of the proof.

Two consensus limits bound what level 0 can do:

LimitValue
Max parents (level 0)16
Mergeset size limit248
GHOSTDAG k124

The three commitments

The header carries three 32-byte hashes, and the difference between them is the difference between what a block holds, what it decides, and what the ledger becomes.

CommitmentCoversAnswers
hashMerkleRootThe transactions in this block’s body“What is this block carrying?”
acceptedIdMerkleRootThe transaction ids this block accepts from its mergeset“What did this block put into the ledger?”
utxoCommitmentThe full UTXO set once those acceptances are applied“What does the ledger look like now?”

The second one is the one without a blockchain analogue. A Kaspa block accepts transactions from blocks mined in parallel with it, not only from its own body, so what a block carries and what it settles are genuinely different sets and each needs its own commitment.

The third is what makes pruning possible. Because every block commits to the resulting UTXO set, a node that discarded old block data can still prove its current state is the one the DAG arrived at - it does not need the history to re-derive it.

The body

FieldHolds
transactionsAn ordered array of Transaction objects

That is the entire body. The ordering is not incidental - the first transaction must be the coinbase, and it is the one transaction in the system with no inputs.

The coinbase’s payload is structured rather than arbitrary:

FieldHolds
blueScoreu64 - the blue score of the block carrying it
subsidyu64 - the per-block subsidy in sompi
scriptPublicKeyThe payout lock this block’s miner nominates
extraDataArbitrary bytes - where pools stamp their own identifiers

The payout lock is the part worth pausing on. It is not used to pay this block. It is the address recorded so that whichever later block merges this one can pay it - the mergeset coinbase mechanics in full.

What is computed rather than stored

ValueWhere it comes from
Block hashA hash over the header. The identity of the block, the proof work was spent, and the commitment to its contents are the same 32 bytes.
Block levelDerived from how far under the target the proof-of-work hash landed.
Selected parentThe level-0 parent with the highest blueWork. GHOSTDAG picks it; no field names it.
MergesetThe blocks in this block’s past that are not in its selected parent’s past.
Block massSummed from the body’s transactions, in three dimensions at once.

The mass totals are what the block-size limits actually apply to:

LimitValue
Max compute mass500,000 grams
Max storage mass500,000 grams
Max transient mass1,000,000 grams - roughly 250 KB of block body, raised from 500,000 at Toccata

There is no separate per-transaction ceiling in consensus. A transaction only has to fit in a block, which is why Fees & Mass is where the pricing story lives rather than here.

See Also: Blocks, Transaction Model

Kaspalytics strives to provide accurate data - our highest level of effort is given to data validation and maintenance. However, we cannot guarantee 100% accuracy. Data is subject to inaccuracies and change.

Contact | © 2026 Kaspalytics