Updated: 7/28/2026
UTXO Model
Notes on UTXO accounting - how Kaspa tracks coins, and why the model fits a blockDAG.Two accounting models
Cryptocurrencies track ownership one of two ways:
- Account model (Ethereum and most smart contract chains): a global ledger of balances. A transaction mutates balances in place.
- UTXO model (Bitcoin, Kaspa): no balances stored anywhere. The ledger is a set of unspent transaction outputs - discrete coins, each locked to a script. A ābalanceā is just the sum of the UTXOs an address can spend.
Kaspa uses UTXO accounting, inherited from Bitcoin.
How it works
- Every transaction consumes existing UTXOs as inputs and creates new UTXOs as outputs.
- An input spends a UTXO entirely - there is no partial spend. Paying 0.2 KAS from a 10 KAS UTXO means creating two outputs: 0.2 to the recipient and ~9.8 back to a change address.
- The fee is implicit:
sum(inputs) - sum(outputs). - A UTXO is spendable by whoever can satisfy its locking script - usually a signature matching the address, or a P2SH redeem script.
- Validation is local: whether a UTXO is spendable depends only on the current UTXO set, not on the history that produced it.
Why UTXO fits a blockDAG
Kaspaās parallel blocks make UTXO accounting a structural fit, not just an inheritance:
- Conflicts are explicit. A double spend is two transactions consuming the same outpoint (transaction ID + output index). Once GHOSTDAG orders the blocks, the first spend is accepted and the second is rejected mechanically - no ambiguity about āaccount stateā in between.
- Duplicates are harmless. Parallel blocks routinely include the same transaction. Under UTXO accounting it can only apply once (its inputs are gone after the first application); it is accepted once and counted as one unique transaction.
- Independent transactions commute. Transactions spending disjoint UTXOs can be applied in any order with the same result, so merging blocks from across the DAG is mostly conflict-free.
The UTXO set as durable state
The UTXO set is what a node actually keeps. Old block data is pruned after ~30 hours; the UTXO set persists as the complete spendable state of the network. Blocks are the broadcast medium; UTXOs are the ledger.
Note wallet balance displays follow directly from this: a wallet scans/subscribes to UTXOs for its addresses (requires a node with --utxoindex), and ābalanceā is a sum over them. See the getUtxosByAddresses flow in Build a Transaction.
See Also: Transaction Structure, Pruning, BlockDAG Basics