比特币被双花了吗?
原创:刘教链
7号比特币在高度788686发生了一次2个区块的临时分叉。竞争发生在Foundry USA和AntPool两个矿池之间。根据ForkMonitor的监测[1],Foundry USA在AntPool之后报告了分叉的区块。
在讨论比特币出块问题时,我们要格外注意“时间”概念。比如,上面的话里,所谓的“之后”就是一个时间概念。说Foundry USA在AntPool之后报告,只是ForkMonitor收到他们双方发出的区块数据的时间先后。收到来自Foundry USA的区块的时间是20:47:33,收到来自AntPool的区块的时间是20:45:24。
但是这并不意味着,全世界其他地方的节点,都是先收到AntPool的数据,后收到Foundry USA的数据。这可能受到互联网联网环境的诸多影响。因此,我们并不能根据接收到区块数据的先后来决定采用谁的区块。因为,这个“先后”是没有共识的。有人看到Foundry USA在先,有人看到AntPool在先。
那怎么办呢?有读者可能会说,那我们看一下他们各自报告的区块里记录的出块时间戳呢?让我们来看看。有趣的事情来了。虽然Foundry USA后报告了区块,但是它报告的区块时间戳却比AntPool的早。Foundry USA的区块时间戳是20:45:10,而AntPool的是20:45:13。
甚至我们用主动语态来描述这个事情也扭曲了客观事实,因为“Foundry USA报告的区块”(the block Foundry USA reported)这样一种表达暗含了Foundry USA有意为之的意思,而这一层意思属于主观观点,并非客观事实。思考难免要借助于语言,而语言会反过来让思考陷入误区。能够始终准确分辨主观观点和客观事实,是很重要的,有时候也是困难的。此处,用被动语态表达可能会更准确,即表述为“从Foundry USA收到的区块”(the block received from Foundry USA)。
好了,来自Foundry USA的区块时间戳比AntPool的早3秒钟,但是到达的时间却晚了2分多钟!
那么我们是否可以按照它们各自报告的区块时间戳的早晚来决定采用谁的区块呢?显然也不能。因为区块时间戳是出块的矿池可以在代码约定的范围内随意设置的,那么也就是不完全可信的。这也不是共识。我们的意思并不是谁在故意篡改时间戳,我们只是说这是很容易做到的。比如Foundry USA在20:47:00产生了区块,但是却把区块时间戳写成20:45:10,这是可以做到的事情,没有谁能够阻止。
所以,我们并不能尽信产生区块的矿工记录的区块时间戳。
中本聪告诉我们,在去中心化的情况下,我们唯一可以相信的,是投入算力计算出来的工作量证明(Proof-of-Work)。这就是比特币所采用的最大工作量证明链共识原则,或者简称为最长链原则。
在上面的案例中,最终AntPool的分叉打败了Foundry USA的分叉,获得了全网算力的支持,快速超越Foundry USA分叉的长度,淘汰了后者产出的2个区块。
20230513-01.jpeg 图:分叉
当然,被Foundry USA打包在这两个区块中而未被AntPool分叉所包含的交易,就会被退回到待打包交易池中,重新等待打包。只需要再等待一段时间,总会有矿工将其打包到区块链中的。
整个过程没有任何问题,完全符合比特币的工作原理。唯一有问题的,可能是不懂这个工作原理,而把交易出现在两个临时分叉中误称为“双花”(双重花费,double-spending)。这实在是对于这个概念的误解。
真正的“双花”,是付款方发出两个交易,花费同一笔比特币(同一个UTXO)。一个交易把比特币UTXO付给收款方,另一笔交易把同一个UTXO付给自己。让第一笔交易进入Foundry USA的分叉,另一笔交易进入AntPool的分叉。待Foundry USA的分叉出现了一个区块确认后,告诉收款方,“嘿老兄,币已付”。然后坐等Foundry USA的分叉被淘汰,AntPool的分叉胜出,从而实现撤销掉给付款方的支付,而把币回收到自己的口袋里的效果。
一看便知,这是很不容易做到的。
至于有交易所采用极少区块确认就给充值用户上账,而且也不检查UTXO,看到一次链上充值交易就上一次账,从而导致多给用户记了余额,那纯粹是自己找抽,怪不得比特币。
参考资料:
(公众号:刘教链。知识星球:公众号回复“星球”) (免责声明:本文内容均不构成任何投资建议。加密货币为极高风险品种,有随时归零的风险,请谨慎参与,自我负责。)