正本清源比特币之二:零确认交易

前言:比特币诞生至今已经近十年,但当被问及比特币是什么时,依然很少有人能够准确地解释清楚。《正本清源比特币》系列,将追寻中本聪的足迹,向读者展示比特币创造者对比特币的构想及背后蕴含的寓意,以纠正一些人对比特币的误解。

本文要纠正的,是大家对比特币安全模式的认知:零确认交易。

什么是零确认交易?

与物理世界的资产不同,在数字世界里面,数据是可以复制的。这使得去中心化电子支付在很长的一段时间内无法实现,因为需要有一个中间媒介,来裁定一笔钱是不是已经被花掉,否则可能会出现一笔钱既转给了 A,又转给了 B 的情况。这就是大家说的双花(Double Spent)问题。

double-spent-problem

中本聪设计的 PoW 方式,创造性地解决了这个问题:节点通过进行大量 SHA256 计算一个找到符合当前难度下的 hash 值,才能获得区块链的一次写入权,其它节点在接收到这个区块后将在当前最长链下继续相同的操作,使得区块链能不断扩展。如果想要双花这笔交易,则需要花费更多的计算以生成一条更长的链让其它节点接受。一笔交易所在的区块的高度与当前最新区块高度的差值即这笔交易的确认数,确认数越多,意味着要篡改这笔交易所需要的工作量也越大,即这笔交易被更改的可能性将随着时间的流逝而越来越小。

比特币平均十分钟出一个区块,这使得交易信息在被打包入区块链前处于一个待确认的状态:一笔比特币交易广播到节点后,会进入该节点的内存池中,并向全网广播这笔交易。这笔还没有被打包的交易则称为零确认交易。

零确认交易并不是什么新技术,是否接受它、让零确认交易能得以足够广泛的应用,取决于商家,以及大众的认知。

零确认交易的设想

接受零确认交易意味着可以更快地结束用户的支付请求。毕竟与几乎即时完成的支付体验相比,要求用户在发送交易后至少需要等待一个确认才交付在大多数的场景下是不现实的。

中本聪在 2010 年回复 BM 质疑比特币十分钟确认太慢的时候,曾提出了 Payment Processor 的说法,用于快速交易支付:

Quote from: bytemaster on July 28, 2010, 08:59:42 PM
Besides, 10 minutes is too long to verify that payment is good. It needs to be as fast as swiping a credit card is today.

See the snack machine thread, I outline how a payment processor could verify payments well enough, actually really well (much lower fraud rate than credit cards), in something like 10 seconds or less. If you don’t believe me or don’t get it, I don’t have time to try to convince you, sorry.

source: http://bitcointalk.org/index.php?topic=423.msg3819#msg3819

由于这时候零确认只存在节点的内存池中,并没有被打包上链,有可能会被双花的风险,中本聪将零确认交易称为“二等居民”,并在 Snack Machine 一帖中,给出了他的解决方案:

I believe it’ll be possible for a payment processing company to provide as a service the rapid distribution of transactions with good-enough checking in something like 10 seconds or less.
The network nodes only accept the first version of a transaction they receive to incorporate into the block they’re trying to generate. When you broadcast a transaction, if someone else broadcasts a double-spend at the same time, it’s a race to propagate to the most nodes first. If one has a slight head start, it’ll geometrically spread through the network faster and get most of the nodes.

简单地说,中本聪在设计比特币的时候,认为零确认交易是可行的,其方法是节点将交易信息加到自己的内存池,如果发现有相同的 UTXO 则拒绝。由于试图双花的交易发出的时间将晚于发给商家的交易,商家只需要稍等片刻,待交易信息传递到绝大多数节点即可。

商家为何接受/不接受零确认支付?

商家要接受现金之外的其它的支付方式,是需要考虑利弊的。一方面商家希望用户能够方便快捷地支付,以便能有更多的时间去服务更多的用户;另一方面,商家也需要考虑该支付手段是否足够安全,以免商品被购买后即无法收款。信用卡就是一个很好的例子,尽管不时出现信用卡盗刷导致坏单的情况,以及信用卡结算周期长(通常是一个月)并且还要收手续费(一般 VISA 以及 MasterCard 收取商家 2% 的手续费),但因为使用的人群广泛,在对于商家来说带来的客流量的收益大于可能的损失的情况下,店家乐于支持也是合情合理的事情。

对于很多商家(尤其是线下商家)来说,支付过程需要的时间过长几乎是不可容忍的,这客观上有着接受零确认的需求。因此,在讨论支持比特币支付的时候,我们更需要关注的是支持比特币支付能否做得比信用卡更好。这就转变成一个得失比的问题了:比如说,假设某商家因支持零确认支付而营业额可能将增加 20000 元,如果一个用户要求用比特币购买一杯 10 元的咖啡,商家接受到交易后确信这笔交易有 99% 的概率将进入下一个区块,那么它是否值得为了那 1% 的损失 10 元的可能性,而让用户在一边等上十分钟?

比特币支付目前还处于用户和商家互相促进的过程,更多的比特币用户的存在会让更多的商家愿意支持比特币支付,而更好的支付体验、更低廉的手续成本、更低的坏单率,会让更多商家让利于用户从而更多的培养更多的比特币用户。由于比特币去中心化的原因,商家无法像在信用卡盗刷后向相关机构投诉那样挽回损失,为了自身利益在接受零确认交易上自然容易对其安全性稍存疑惑。这是行业发展早期知识普及缺乏的结果。

因此,尽管像 Bitpay 这样的支付处理商很早就提供了接受零确认交易的选项,普及推广培养用户习惯也着实需要时间。而这随着比特币链上交易增多开始拥堵后情况变得更加糟糕:矿工在无法一次性打包完内存池的全部交易时会优先打包高手续的交易,为了缓解交易长时间没法确认的情况,BTC 引入了替换手续费 Replace-by-fee 的功能,允许用户将交易标记为 replaceable 并在这笔交易未确认前增加手续费来替换掉。这破坏了零确认交易的根基,加深了大众认为零确认交易不安全的印象,尽管商家可以选择设置成不接受 RBF 的交易。BCH 在分叉时除了修改了区块上限的大小之外,另外一个改动是移除了 RBF 的功能,这也是为其“现金”的定位恢复推动接受零确认交易打下基础。

接受零确认交易安全吗?

零确认交易至今还没能得到广泛使用,很大原因是人们认为交易没有被确认的话是不安全的。客观地说,零确认交易被双花的可能性的确要比已经被打包的交易要大一些,但要注意的是,安全是一个相对的概念,脱离具体金额谈论零确认交易的安全性,似乎和“抛开剂量谈毒性是耍流氓”有异曲同工之处。本质上,零确认交易是否足够安全,是一个经济问题而非单纯的技术问题。

零确认交易是否安全,取决于成功双花这笔交易的概率是否足够低。而要双花一笔交易,需要矿工的参与。矿工愿意(配合用户)去双花的可能性如何呢?如果你看过前一篇文章《正本清源比特币之一:小世界网络》,理解节点是紧密连接并且互相竞争出块的话,将会对中本聪的零确认模型有更深刻的理解。

在比特币这个小世界网络中,信息的传递通常不超过两跳,这意味着,交易信息的传递非常迅速(现在只需要两秒即可几乎传遍全网)。在这样的网络里面,同个 UTXO 的两笔交易,先发出来的交易在传播时占了时机的优势,后发出来的交易(即使只差 0.01 秒)将难以在落后的情况下后来居上抢先传递到 51% 以上的节点的内存池里。

因此,要想成功双花,会有用户试图构建超低手续费的交易、利用节点设置的传递规则的差异以达到延缓那笔交易传播。事实上,绝太多数的双花企图都是这样做的,这可以在 DoubleSpend.cash 上查看到。商家在应对这样的交易时是可以做出风险评估的,毕竟目前主动构建低于目前正常手续费 1sat/byte 的交易本身就比较有嫌疑,支付提供商可以给予商家提示,让顾客等一个确认后再处于,或者多向几个不同的节点请求确认这笔交易是否存在,毕竟超低手续费的交易可能根本就没传递下去。类似的,Payment Processor 在接收到交易信息后也应该尽快地随机向多个节点发送收到的交易信息,以便交易信息能迅速传递到各个结点。

另一个可能是矿工为了双花一笔交易,刻意将一笔用于双花的交易 A 隐藏而不向全网传播,待用于与商家支付的那笔交易 B 被商家承认后再试图将双花的交易 A 打包进区块链。此时该矿工出块的概率和所占的全网算力比相同,低于 51% 的情况下并没有较高的胜算(当然,高于 51% 的算力则是另外一个问题了)。而如果矿工成功出块将交易 A 打包而造成交易 B 失败,这就意味着该矿工对整个网络不诚实,没有将收到的交易信息及时广播,其它的矿工在发现后会因为自己的利益受损而对该矿工进行惩罚,将其暂时列入黑名单暂时切断连接甚至认为这是恶意双花而拒绝该区块。毕竟矿工们是竞争关系,维持与其它矿工的连接需要成本。这将使得该矿工接收其它节点的信息速度变慢,导致孤块率上升,最终出块的利润减少,长期来看也是得不偿失的事情。

能够想明白这个矿工之间的博弈,就会对 PoW 有了更深刻的了解:比特币本身是一个竞争的激励系统,它不只是单纯算力的堆积,更需要对整个网络维护的投入。矿工之间比拼的不是谁先找到块,而是谁能更快地将找到的块更快地传递给所有参与者。商家和用户并不需要信赖于具体的矿工,他们只需要将交易随机发到网络上,让矿工们争先恐后为其打包即可。

因此,虽然零确认交易存在着被双花的可能性,我们至少可以认为,在一笔交易的数额小于区块奖励并在区块浏览器上可看到的情况下,我们可以认为零确认接受这笔交易是几乎安全无误的。而根据今天的价格,这个数额足以满足大部分人的日常需求。

当然,关于接受零确认交易,可以做的还有很多。比如构建全网的双花检测系统,增加商家风险提示,甚至推出双花保险服务。总之,接受零确认交易的风险基本在可控的范围之内,剩下的则是一份愿意去尝试的好奇心。或许有一天,大众在使用比特币支付时不再需要关注确认数的多少。毕竟,有多少人知道支付宝的结算周期是多久呢 :)

欢迎捐赠 Bitcoin SV 鼓励作者
0%