BTC 68,420 ▲ +2.34% ETH 3,542 ▲ +1.08% SOL 168.4 ▼ -0.82% BNB 604.1 ▲ +0.46% USDT 1.000 ▲ +0.01% ARB 0.842 ▼ -1.24% MATIC 0.523 ▲ +3.11% AVAX 34.62 ▼ -0.55% BTC 68,420 ▲ +2.34% ETH 3,542 ▲ +1.08% SOL 168.4 ▼ -0.82% BNB 604.1 ▲ +0.46% USDT 1.000 ▲ +0.01% ARB 0.842 ▼ -1.24% MATIC 0.523 ▲ +3.11% AVAX 34.62 ▼ -0.55%
UTXO比特币以太坊

UTXO 和账户模型有什么区别?两种记账法一次讲清

比特币不记录「这个地址有多少余额」,而是记录一张张还没花掉的输出。以太坊则给每个地址一本余额账。讲清两种记法怎么转账,以及找零、卡交易和手续费差在哪。

编辑部 |

钱包里写着「余额 0.5 BTC」或「余额 1.2 ETH」,看起来是同一种数字。底下的账本却不是同一种记法。比特币把钱记成一张张还没花掉的票据,以太坊给每个地址记一个余额。

这个差别平时可以忽略。等到手续费突然变高、比特币钱包里多出一个你没见过的找零地址、或者以太坊上一笔没确认的转账把后面的交易全堵住,就和它有关。

比特币:花掉的是一整张票据

比特币用的是 UTXO(Unspent Transaction Output,未花费交易输出)。账本上没有一行写着「地址 A 的余额是 0.5」。它记的是许多笔输出:某一笔交易曾经付给地址 A 0.3,另一笔付给它 0.2,这两笔都还没被花掉。钱包把能用私钥控制的那些输出加在一起,显示成余额。

转账时不能划走「其中的 0.1」。你要花一笔输出,就得把整张用掉,再开出新的输出。

用现金来想最清楚。口袋里有一张 10 块和一张 20 块,你要付 7 块,不能把 10 块撕下 7 块。你交出 10 块,对方得到 7 块,你收回 3 块找零。比特币也是这样:

  • 被花掉的那张输出作废,不能再用
  • 收款人得到一张新输出
  • 多出来的部分变成找零,回到你控制的地址,通常是一个新地址

所以「余额」只是钱包的合计,不是账本上的一个格子。合计用掉哪些票据、找零回到哪里,由钱包在后台选。

以太坊:每个地址有一本余额

以太坊用的是账户模型。每个地址在账本上有自己的状态,其中一项就是余额。你转出 0.1 ETH,就是从这个数字里减去 0.1,在对方的数字上加上 0.1。没有「把整张账单花掉再找零」。

账户上还有一个序号,叫 nonce,从 0 开始,每发出一笔交易加 1。网络按这个序号处理你的交易。序号 5 还没被确认,序号 6 就不能先通过。这就是为什么有时一笔卡住的转账,会让同一个地址后面的操作一起等着。

智能合约也是账户,只是由代码控制,而不是由一把私钥直接控制。余额、存储和代码放在同一个账户模型里,合约之间互相调用才比较直接。比特币刻意不做这件事,它的设计中心是把价值从一张输出交到下一张。

用起来会碰到的差别

UTXO(比特币)账户模型(以太坊)
账本上有什么许多张未花费的输出每个地址一个余额
转出一部分花掉整张,再找零直接从余额里减
钱包显示的余额你能控制的输出之和账户上的那个数字
手续费和什么有关这笔交易用了几张输出、体积多大计算有多复杂,也就是 Gas
卡住时某一笔交易没确认,通常不挡住别的输出同一地址按序号排队,前一笔卡住会挡住后面的
代表比特币,以及沿用这套记法的链以太坊,以及大多数兼容它的链

找零地址最容易让人误会。比特币钱包为了不把所有收据都堆在同一个地址上,经常把找零打到一个新地址。那个地址仍然属于你这套私钥,钱没有进陌生人手里。在区块浏览器里看到「转给了一个新地址」,先确认它是不是自己钱包派生出来的找零,再判断是不是转错。

另一边,以太坊的排队是账户模型带来的。加速或取消,针对的是那个还没确认、占着序号的交易,而不是去取消后面已经排上的每一笔。Gas 怎么影响确认速度,见 Gas 费。

为什么比特币不用余额

余额账看起来更简单,比特币却从一开始就用票据。这样记有几个直接后果:

  • 验证可以只看相关的票据。 确认一笔钱能不能花,是去查那几张输出还在不在,不必先信任「这个账户的余额数字从始至终没被改错过」
  • 所有权表达得很具体。 一张输出上写着谁能花它。花掉之后,权利转移到新输出上,旧的作废
  • 隐私和找零绑在一起。 每次找零都可以用新地址,外人较难把「这人的全部余额」看成一个数字。代价是钱包必须帮你管好多张票据,备份仍然是那一套助记词,不是每一个地址单独记一份

以太坊选择余额,是因为它要跑程序。合约需要一个稳定的账户去存放状态:余额、授权额度、抵押品。如果每一步都要把整张票据拆开重开,程序会非常难写。两条链的定位不同,记账法就不同。这和它们后来一个继续用工作量证明、一个改成权益证明是同一类选择,见 PoW 与 PoS。

对普通转账意味着什么

你不需要自己挑票据。钱包会选。值得记住的是这些现象背后的原因:

  • 比特币里很多很碎的收款,转出时手续费会变高。 因为一笔交易要引用很多张输出,体积变大。不是余额数字本身变贵了
  • 刚收到的找零,有时要等确认才能再花。 它是一张新输出,和任何一笔新收款一样
  • 以太坊上不要连续发出多笔、又把手续费设得很低。 第一笔不确认,后面的会排在它后面。它们还停在内存池里,并不是已经丢了
  • 两条链的「余额」不能直接比较操作。 把比特币当以太坊那样理解成一个可以任意划走的数字,遇到找零地址会以为钱丢了

转错地址、转错链,两种记法都撤回不了。事故怎么判断还有没有救,见转账事故。

常见问题

Q:UTXO 是一种代币吗? 不是。它是比特币记录「还有哪些钱没被花掉」的方式。你钱包里的余额,是这些未花费输出的合计。

Q:找零地址上的比特币还是我的吗? 如果那个地址由你的钱包从同一套助记词派生出来,就是你的。不要把找零地址单独复制给别人当收款地址来回用,让钱包自己管理。也不要从交易记录里随便抄一个「看起来像」的地址,那是另一类风险。

Q:为什么比特币不能像以太坊一样给合约记账? 不是完全不能扩展,而是这套票据模型不是为「一个账户里放着程序状态」设计的。以太坊用账户模型,就是为了让合约有一个固定的地方存放余额和数据。

Q:同一笔以太坊交易卡住,换一个钱包登录能绕过吗? 不能。序号记在账户上,不记在某一个 App 里。换钱包看到的是同一笔还没确认的交易。要处理的是这笔交易的手续费,而不是再开一个软件。

Q:其他链用的是哪一种? 莱特币等从比特币分出来的链,多用 UTXO。以太坊以及和它兼容的链,多用账户模型。一条新链叫什么名字不重要,钱包如果按「余额加减」来展示,多半是账户模型;如果经常出现找零,多半是 UTXO。

小结

比特币把钱记成一张张未花费的输出,花的时候整张用掉、多的部分找零。以太坊给每个地址一个余额,转账是两边数字一减一加,并用序号把同一地址的交易排成队。钱包把两边都显示成「余额」,所以平时像一回事。遇到找零地址、碎收款让手续费变高、或者一笔未确认转账堵住后面的操作,就是这两种记账法露出来的时候。

Related // 延伸阅读
比特币转账

比特币地址为什么长得不一样?1、3 和 bc1 一次分清

比特币地址有 1 开头、3 开头和 bc1 开头几种。讲清它们对应哪套格式、手续费和兼容性差在哪,以及转账时为什么不能只看「像不像比特币地址」。

Layer2以太坊

乐观汇总和零知识汇总有什么区别?两种 Rollup 一次讲清

两种 Layer 2 都把计算拿到以太坊外面做,再把结果交回主网。乐观汇总先默认交易有效,并留出挑战期;零知识汇总提交数学证明,让主网直接核验。

再质押以太坊

再质押是什么?同一笔质押,多一份收益也多一份罚没

再质押把已经质押的 ETH 或质押凭证,再拿去为其他服务做担保。讲清额外收益从哪来、罚没为什么会叠在一起,以及凭证再押一层时多出来的脱锚风险。