UTXO vs Account Based

All coins and tokens exist on their blockchains as either unspent transaction output (UTXO) or account-based assets. The 2 protocols handle digital assets differently, and therefore have different integration requirements. The most common examples of the two are bitcoin, which is UTXO, and ethereum, which is account based.

UTXO

The UTXO model is stateless. When transacting on a UTXO blockchain, each bit of data is a uniquely identifiable chunk. Similar to transacting with cash, UTXO payments usually involve paying with more currency than the transaction specifies, as having exact change is uncommon. Upon payment though, you receive the difference in change, or in the case of cryptocurrency - UTXO. Your wallet is therefore a collection of UTXO and the balance is the combined UTXO.

UTXO has certain characteristics that often aren't noticeable to end users interacting through an app. However, when developing an app, you must decide how you handle UTXO management and allocation. For example, when displaying a wallet balance, most end users likely don't care to see their individual UTXO - they probably just want to see what their total balance is. In addition, the more UTXO a transaction has, the more complex it is, so you must account for UTXO allocations within transactions. Conceptually, this isn't too different than deciding what bills and coins to use in a transaction when paying with cash.

Account Based

The account-based model is stateful, so transactions don't uniquely reference individual coins and tokens. Rather, the account-based model simply assigns a total balance to a wallet. This is similar to how your bank account is the balance of the total funds available to you, but isn't referencing unique bills and coins to arrive at this balance.

The stateful nature of account-based assets enable them to better engage with smart contracts used in DeFi. Account-based assets also have integration considerations that differ from UTXO assets. For example, transactions require an incrementing nonce to prevent unintended duplicate transactions. Furthermore, since transactions don't explicitly reference specific inputs, you must take precautions when engaging in parallel transactions or simply execute transactions sequentially.