



简单来说,一笔交易是告知全网这部分比特币的持有者已授权把它转给新的持有者。新的持有者可以通过创造新的交易花掉所收到的比特币,因而再次将比特币授权给下一个持有者,以此类推,形成一连串的所有权转移链。
交易就像复式记账法账簿中的账目条目。每笔交易包括一个或多个输入,就像借项。在交易的另一方,有一个或多个输出,就像贷项。输入和输出的总额(借款额和贷款额)并不一定持平。通常,输出的总额要略小于输入总额,二者之间的差额代表了一种隐含的交易手续费。这笔小额费用由矿工收取,矿工负责将这笔交易记录在账簿里。图2-2展示了账簿中的一笔比特币交易。
图2-2:复式记账法式交易
该交易还包含了每笔正在使用的比特币(输入)的所有权证明。所有权证明是来自所有者的数字签名,任何人都可以独立验证。用比特币的术语来说,花钱就是签署一个交易,将既有交易中的价值转移给比特币地址所标识的新所有者。
Alice给Bob的商店支付时使用了前一次交易的输出作为其输入。在第1章中,Alice从她朋友Joe那里用现金换回了比特币。我们在图2-3中将其标记为交易1(Tx1)。
图2-3:交易链,一个交易的输出成为下一个交易的输入
Tx1向一个由Alice的私钥锁定的输出发送了0.001比特币(100000聪)。她与Bob的商店的新交易(Tx2)引用了前一个交易输出作为输入。在插图中,我们使用箭头来显示这种引用,并且将输入标记为“Tx1:0”。在一个真实的交易中,引用是接收到Joe付款的那笔交易的32字节交易标识符(txid)。这里的“:0”表示Alice接收的输出在输出列表中的位置,在这个例子中是第一个(索引0)。
如图2-3所示,实际的比特币交易的输入并不包含具体的金额。为了确定输入的金额,程序需要使用输入的引用来检索正要被使用的前一个交易的输出。
Alice的Tx2包含两个新输出,一个支付75000聪订阅播客,另一个是支付20000聪作为找零返还给Alice。
比特币交易序列化(软件用于发送交易的数据格式)使用链上货币最小定义单位的整数来表示要传输的值。当比特币首次诞生时,这个单位并没有名字,一些开发者将它简称为“基本单位”。后来,很多用户开始将这个单位称为中本聪(sat),以纪念比特币的创造者。在图2-3以及本书的其他一些插图中,我们使用了“聪”作为基础单位,这也是协议本身所使用的。
在比特币交易中,除了一个或多个支付给接收者的输出外,很多交易也会包括一个支付给付款者的输出,即找零输出。这是因为交易的输入就像纸币一样,不一定刚好花完。例如你在商店购买一件5美元的商品,但用一张20美元的钞票支付,你期望收到15美元的找零。比特币交易输入同样遵循这个概念。如果你购买了一个价格为5比特币的商品,但只有一个价值20比特币的输入可以使用,那么你可以发送一个5比特币输出给店主,还有一个15比特币作为找零的输出返回给自己(不包括你的交易手续费)。
在比特币协议层面,找零输出(和它支付的地址,称为找零地址)与支付输出之间没有区别。
重要的是,找零地址不必与输入地址相同,而出于隐私考虑,找零地址通常是所有者钱包中的新地址。在理想情况下,两种不同用途的输出都使用新地址,并且看起来无法区分,以防止任何第三方推断哪些输出是找零,哪些是付款。然而,为了方便读者理解,在图2-3中我们对找零输出进行了底色标注。
并非每笔交易都有找零输出。那些没有找零输出的交易被称为无找零交易,它们只能有一个输出。只有支付金额大致等于交易输入中的可用金额减去预期的交易手续费时,无找零交易才是一个实用的选项。在图2-3中,我们看到Bob创建了Tx3,这是一个无找零交易,它花费了在Tx2中收到的输出。
不同的钱包在付款时会使用不同的输入选择策略,这就是所谓的组合支付。
比特币钱包可能会合并多个小额输入,或者使用一个等于或大于支付金额的输入。除非钱包能够以一种方式精确合并输入,恰好匹配支付金额加上交易手续费,否则钱包会生成一些零钱。这与人们处理现金的方式非常相似。如果你总是用口袋里面最大面额的钞票,那么最终钱包里会塞满零钱。如果你只使用零钱支付,那么你通常只会剩下大面额的钞票。人们下意识地在这两个极端之间寻求一种平衡,而比特币钱包开发者也在努力实现这种平衡。
一种常见的交易形式是简单支付。这类交易有一个输入和两个输出,如图2-4所示。
图2-4:一种常见的交易形式
另一种常见的交易形式是归集交易,它将多个输入合并为单一输出(见图2-5)。这相当于现实世界中用一堆硬币和纸币兑换一张面额更大的钞票。这类交易有时由钱包和商业目的生成,用以合并大量的小额资金。
图2-5:资金归集交易
最后一种区块链上常见的交易形式是批量支付,它向多个收款方生成多个支付输出(见图2-6)。这种类型的交易有时被商业实体用来分配资金,例如向多名员工支付工资。
图2-6:批量支付分配资金