JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

比特币的设计与 UTXO 账本

2008 年,一篇九页的论文描述了一种中间没有银行的电子现金。本文讲清这套设计的核心:一本账本不是由余额构成,而是由未花费的币构成——它们被消耗,又被重新铸出。

开启一切的九页论文

2008 年 10 月,一位署名 中本聪(Satoshi Nakamoto) 的人发布了一篇简短的论文,题为《比特币:一种点对点的电子现金系统》。它的目标近乎固执地简单:让两个人在网上直接互相付款,中间没有银行或支付公司来批准这笔交易。几十年来,这件事看似不可能——一旦去掉可信的中间人,又是什么能阻止有人把同一枚币花两次?

比特币的答案,是让所有人都持有同一份公开记录。这里没有某家银行的私有账本,而是一段共享的历史:成千上万台计算机各持一份副本,并通过工作量证明达成一致。一笔付款一旦被足够多的后续区块压在底下,要想改写它,所耗费的能量将超过任何人理智范围内愿意付出的代价。其结果,就是一种无人拥有、也无人能悄悄改动的电子现金。

这本账本里没有余额

意外之处就在这里。如果你打开比特币真正的数据库,你找不到任何一行写着「这个地址拥有 2.5 BTC」。任何地方都没有账户,也没有存着的余额。网络真正保存的,是一大堆已经被创建、但还没被花掉的币——每一枚都是一份离散的价值,被锁定在某个特定的所有者名下。这一堆东西,就叫做 UTXO 集合,是 Unspent Transaction Outputs(未花费交易输出)的简称。

现金的类比在这里精确得很。把一个 UTXO 想成你钱包里的一张实体钞票——一个固定面额,你要么整张花掉,要么完全不动。你的「余额」并不是存在某处的一个数字,而仅仅是你的密钥能解锁的、每一张未花费钞票的总和。你的钱包应用替你把它们加在一起,但链本身只知道一张张单独的钞票。

一笔交易如何重塑这个集合

一笔比特币交易,不过是一份配方:它销毁一些旧钞票,再印出一些新钞票。它点名一批现有的 UTXO 作为输入——也就是被花掉的那些钞票;又定义一批全新的 UTXO 作为输出——也就是被创建出来的钞票。交易一经确认,输入就从 UTXO 集合里被永久删除,输出则取而代之被加进去。

由于钞票不能撕成两半,你通常会多付一点,再把差额还给自己。假设你要付 0.7 BTC,但你能用的最小钞票是 0.5 和 0.4,那你就把两张都花掉(共 0.9),其中 0.7 给收款人,另外铸出一张略小于 0.2 的全新钞票,付回你自己的地址——这就是著名的*找零*输出。你留下的那一小片,就成了矿工的手续费。每一笔输入都必须用所有者密钥的一个有效数字签名来解锁,正是它证明了你有权花掉那几张特定的钞票。

TRANSACTION  (Alice pays Bob 0.7 BTC)

  INPUTS  (old UTXOs, now destroyed)
    utxo_A : 0.5 BTC   <- unlocked by Alice's signature
    utxo_B : 0.4 BTC   <- unlocked by Alice's signature
                          total in  = 0.900

  OUTPUTS (new UTXOs, now created)
    -> Bob   : 0.700 BTC
    -> Alice : 0.199 BTC   (change)
                          total out = 0.899

  fee to miner = in - out = 0.001 BTC  (never written down; it's the gap)

Rule: sum(inputs) >= sum(outputs).  The leftover is the miner fee.
一笔交易:两张钞票作为输入被消耗,两张全新钞票作为输出被创建。

最初的那些币从何而来

如果每张钞票都必须能追溯到更早的钞票,那就有个显而易见的难题:*最初*的那些钞票又是从哪来的?比特币用每个区块里一笔特殊的例外解决了它——铸币交易(coinbase transaction)。它是唯一允许完全没有输入的交易。它不消耗任何旧的 UTXO,而是径直凭空铸出新币,付给构建了这个区块的矿工。

这笔铸币输出就是区块奖励——正是它这份激励,让工作量证明变得值得去做。它打包了两样东西:一笔固定数量的新创币(大约每四年减半一次),加上那个区块里其他所有交易的手续费总和。所以,世上存在的每一枚比特币,都是作为某个矿工的奖励而诞生的,此后再通过一笔笔寻常的交易,一张钞票接一张钞票地向外流转。

COINBASE TRANSACTION  (one per block, no inputs)

  INPUTS
    (none)              <- the special exception

  OUTPUTS
    -> Miner : block_subsidy + sum(all fees in block)

  e.g.  3.125 newly minted BTC  +  0.18 BTC collected in fees
        = 3.305 BTC paid to the block's miner
铸币交易铸出区块奖励:新创的币,加上其余所有交易的手续费。

小结

中本聪 2008 年的设计,以惊人的简省彼此咬合。金钱是一个未花费钞票的集合,而非一张余额表。一笔交易把整张整张的钞票作为输入消耗掉,再印出新的钞票作为输出(找零也在其中),由签名证明所有权,由「不能凭空生钱」的规则保证诚实。而新币进入这个世界的唯一途径,是铸币交易——它奖励那个用工作量证明守护了区块的矿工。

记住一个画面,其余的便会随之而来:比特币是一沓钞票,而不是一个银行账户。 每一次付款,都在撕掉旧钞票、印出分毫不差的替代品。接下来,我们将放大去看这些钞票是如何被*锁上与解锁*的——那门小巧的、基于栈的语言,比特币脚本(Bitcoin Script),正是它决定了花掉一枚币究竟需要满足什么条件。