(阿基米德,古希腊哲学家、数学家、物理学家。图片来源于网络)
比特硬币一旦生成,由于区块链的防篡改特性决定了其面值就不能再修改,那么比如说我有一枚面值为0.5 BTC的未花硬币,现在要支付一笔价值0.2 BTC的交易,应该如何做到支付这枚硬币的一部分呢?BTC是比特币的货币符号缩写,当我们把“比特币”当作货币单位使用时通常就会使用BTC而不是其全名“比特币”因此我们还会有mBTC(毫比特),即千分之一比特币,以及sats(聪),即一亿分之一比特币,作为更小的比特币货币单位。
让我们考察一下物理世界的金币。当我们要把一枚重量为5盎司的金币支付出去2盎司的时候,我们会选择把原来的金币熔融,然后重新铸造为两枚新的金币,一枚2盎司,另一枚3盎司。把2盎司的金币支付出去,而把3盎司的金币留在自己手里。
如果我们自己没有熔融和重铸金币的工具,那么我们可以请金匠代为操作。为此,我们可能需要从中扣除一笔手续费作为金匠的酬劳,比如0.05盎司,即5盎司的百分之一。这样,原本5盎司的金币会变成一枚2盎司的金币、一枚2.98盎司的金币、以及一小块0.05盎司的碎金子。
由于反复熔融重铸会造成损耗,以及金匠手续费的成本,人们便预先铸出标准规格的、可组合使用的几种金币,比如1、2、5、10、20、50、100这样的标准重量就可以组合出各种所需的数字。但是这样的处理方法也带来了一个问题,就是金币的可分割性被人为限制了,于是便在经济繁荣时出现货币短缺的所谓“通缩”现象。
还有就是金匠熔融重铸的过程中掺假,混合入其他贱金属,做出成色不足的金币投入再流通,对于普通人而言,缺乏专业的知识和检验仪器,难以及时辨别假币。**甚至可能会导致出现格雷欣法则所讲的所谓“劣币驱逐良币”的效应,也就是人们会把成色好的金币贮藏起来不用,而把成色不足的劣等金币出手使用。
古希腊哲学家、数学家、物理学家阿基米德(Archimedes, 公元前287年-公元前212年)相传在洗澡时发现了测量黄金密度、检验黄金成色的浮力定律。但是直到21世纪的今天,各种形形**、令人瞠目结舌的假黄金案仍然频频在各地出现。
以上黄金和金币的这些问题在比特币身上都得到了堪称完美的解决。
首先,比特币的手续费是支付给从事区块链记账的矿工,而不是金匠,重点是,手续费是按照记账数据量收取的,而不是按转账金额收取的。也就是说,一笔支付0.1 BTC的普通转账,和一笔转移10000 BTC的普通转账,其手续费是几乎相同的。
其次,比特币在流通中完全没有“磨损”,熔融、重铸都不会有损耗,所以也就不需要规定面值,而是可以任意细分(目前最小单位是“聪”,一亿分之一BTC)。比如,某枚硬币的面值为0.00012458 BTC。这样就完全不会因为总量限定2100万BTC而导致货币“不够用”的情况发生。
第三,比特币的任何一笔交易都可以有多个硬币作为输入,也可以有多个硬币作为输出。但是不管有多少输入,或者多少输出,每一笔交易(币基交易除外)都要求输入的硬币总面值(总输入)和输出的硬币总面值(总输出)恒相等。
有些像会计记账的复式记账法所要求的,有借必有贷,借贷必相等。
这样一来就严格保证了,在链上通过交易进行流转的比特硬币其总面值即不会增加也不会减少,也就是,链上交易既不能增发比特币,也不能减少比特币,只能保持比特币的总量不变。这样一来,就有效杜绝了造假掺假的问题。而区块链的公开、透明,使得任何人都可以审计任何一枚硬币的真实性。
在2008年比特币白皮书的第9节“组合和拆分价值”中,中本聪阐述了比特币交易的多输入和多输出的设计:
“尽管可以对硬币分开处理,但要对转账中的每一分钱都生成单独的一笔交易是很笨重的。为了允许价值被分割和合并,交易包含多个输入和输出。通常情况下,要么是来自较大笔交易的单笔输入,要么是合并了金额较小的多笔输入,多数有两个输出:一个用于支付,一个用于把找零(如果有的话)退还给付款人。”(刘教链注:“多数”一处中本聪原文用的是at most“至多”而非most“多数”,疑似中本聪笔误)
于是,本文开始的问题可以通过如下这样的一笔交易轻松解决:
输入:(1) 硬币1(0.5 BTC) 来自地址1(属于付款人)
输出:(1) 硬币2(0.2 BTC) 发到地址2(属于收款人)
(2) 硬币3(0.2998 BTC)(找零) 发到地址3(属于付款人)
(3) 隐含矿工手续费 0.5 – 0.2 – 0.2998 = 0.0002 BTC
其中,地址3是属于付款人的另外一个地址3,因为它用在这里接收所谓“找零”(change),也就是没花完剩下的比特币,所以也叫做“找零地址”(change address)。而支付给矿工的手续费是隐含的,由比特币网络自动根据输入和输出的差额计算出这一笔交易将给矿工带来多少BTC的手续费收入。这一费用的大小是由付款人自由设定的,但是矿工则有权决定优先处理高手续费的交易,而导致手续费高的交易到账确认速度更快。
如果付款人没有一枚面值0.5 BTC的硬币,而是有两枚面值分别为0.1 BTC和0.15 BTC的硬币,那么交易就可能会变成如下的样子:
输入:(1) 硬币1(0.1 BTC) 来自地址1(属于付款人)
(2) 硬币2(0.15 BTC) 来自地址2(属于付款人)
输出:(1) 硬币3(0.2 BTC) 发到地址3(属于收款人)
(2) 硬币4(0.0498 BTC)(找零) 发到地址4(属于付款人)
(3) 隐含矿工手续费 0.1 + 0.15 – 0.2 – 0.0498 = 0.0002 BTC