你查看银行账户,余额是 $1000。这个数字存在银行的数据库里。

你查看 Bitcoin 钱包,余额是 1 BTC。但 Bitcoin 的区块链上并没有这个”余额”字段。

那 1 BTC 从哪来的?

没有账户,只有硬币

想象你去买咖啡,付了 100 元纸币,老板找你 20 元。你的钱包里现在有 20 元。

你不会说”我的余额增加了 20 元”。你会说”我有一张 20 元的纸币”。

Bitcoin 就是这样工作的。区块链不记录”Alice 有 1 BTC”。它记录的是:

UTXO #12345: 0.5 BTC,Alice 可以花
UTXO #12346: 0.3 BTC,Alice 可以花  
UTXO #12347: 0.2 BTC,Alice 可以花

这些 UTXO (Unspent Transaction Output 未花费的交易输出) 就像是 Alice 钱包里的”硬币”。她的”余额”是所有硬币的总和:1 BTC。

找零

Alice 要给 Bob 转 0.6 BTC。

她的钱包会选择足够的 UTXO 作为输入。比如选 0.5 BTC 和 0.3 BTC 这两个,总共 0.8 BTC。

但她只需要转 0.6 BTC。怎么办?

就像用 100 元买 60 元的东西,需要找零一样。Bitcoin 交易会创建两个新的输出:

输出 1: 0.6 BTC 给 Bob
输出 2: 0.19 BTC 给 Alice(找零)

剩下的 0.01 BTC 去哪了?给矿工当手续费。

这笔交易执行后,原来的两个 UTXO (#12345 和 #12346) 被标记为”已花费”,从 UTXO 集合中删除。同时创建了两个新的 UTXO。

为什么不用账户模型

Ethereum 用账户模型。简单直接:Alice 账户减 0.6 ETH,Bob 账户加 0.6 ETH。

Bitcoin 为什么要搞这么复杂?

隐私。每次交易,你可以用新的地址接收找零。外界很难追踪你到底有多少币。

并行验证。Alice 花 UTXO #1,Bob 花 UTXO #2,这两笔交易完全独立,可以同时验证。账户模型需要按顺序处理(Alice 先转给 Bob,Bob 再转给 Carol),不然会出现”余额不足”的问题。

防止双花更直接。每个 UTXO 只能花一次。你不能用同一个 UTXO 同时给两个人转账。区块链一旦确认 UTXO 被花掉,就永久标记为”已花费”。

代价

UTXO 模型不直观。钱包软件需要管理一堆 UTXO,自动选择合适的组合来构建交易。

而且,随着交易增多,UTXO 集合会不断膨胀。每个全节点都需要存储所有未花费的 UTXO。2024 年,Bitcoin 的 UTXO 集合有 1.5 亿个条目,占用超过 5GB 空间。

但这是 Satoshi 的选择。他设计 Bitcoin 时,优先考虑的是安全和去中心化,而不是易用性。

UTXO 模型更接近物理现金的运作方式。你不需要一个中心化的银行来告诉你”余额是多少”。你只需要知道”你手里有哪些硬币”。

这就是 Bitcoin 的哲学:做数字化的现金,而不是数字化的银行账户。