在上一篇文章比特币的秘密(四)矿工到底在挖什么中,我介绍了作为节点运营商的矿工在打包的时候可以获得的收益的组成,接下来将揭露节点运营商在争夺打包权中面临的激烈竞争和博弈。
挖矿收益,由区块的构造者,通过在区块中的第一笔交易,也称为铸币交易(coinbase transaction)的输出收入囊中。
回顾一下交易的构成,铸币交易的输入部分可以为任意的字符,而其输出金额可以包括区块补贴/区块中的总手续费。
在区块经过了100个区块的成熟之后,其中的铸币交易的输出才可以转出,我们认为此时节点运营商才真正获得到了挖矿的收益。
因此,我们可以把比特币挖矿的竞赛,看作是节点运营商争取在自己的区块后获得超过100个区块投票支持的行为。
区块链,是每个区块中均包含有上一个区块头的哈希所构成的哈希链。当节点运营商根据所接收到的经过验证的交易构造了区块模板之后,会将区块模板发送给算力运营商,并和算力运营商合作在区块模板上,对这个区块模板所指向的上一个区块头的哈希,使用算力进行投票。此时的算力投票,表明了节点运营商接受了上一个区块,愿意付出沉没成本来延长包括了上一个区块的这条区块链。
为什么每个节点运营商不拒绝其他人提交的区块链,只延长自己的区块链呢?当节点运营商通过自己的(各种方法)判断,算力占系统多数的节点运营商们所接受的那个区块,更有可能成为下一个区块所在的区块链(最长链)的一部分。因此,如果自己不接受这个区块,非要在自己打包的区块(假设是这个区块的上一个区块)上挖矿,则在数学期望上,能够成为最长链一部分的概率是低于不能成为最长链的一部分的。因此,当有一个预期被多数算力接受的合法区块被发现,理性的做法应该是接受这个区块,在这个合法的区块上继续投票延长,而不是拒绝这个区块投票给上一个区块。
这里的最主要的预期,是多数算力的选择。
在一切皆不可信的网络消息中,如何知道多数算力的选择在哪里?一个最直觉的手段,是盲目的跟随最新发现的区块。但最新发现的区块一定可以更快被其他算力接受么?我们在挖矿过程中,也发现一些先被发现的区块,并没有成为最长区块链中的一部分。因为节点的挖矿原则,应该是在发现区块并完成验证后,才开始在新区块上用算力进行投票。因此,我们需要同时考虑这个区块的验证时间。先发现的区块并不一定是最有可能的区块链账本候选,最先被其他算力验证完成的区块,则更有可能是区块链账本最长链的一部分。
当网络上出现了不同版本的区块竞争时,我们需要判断出,不同版本背后的算力数量,这将依靠对不同节点运营商的出块数量来进行估计。这个数量将不应该被篡改和隐藏,将能够充分体现出“多数算力”的选择。节点运营商将可以通过 MinerID 的技术,在区块的铸币交易中添加一些可以表明自己身份的,不可以伪造的信息。这里就可以列出关于节点运营商的访问方式等信息,以后也可以通过公私钥的非对称加密技术,来向其他节点运营商传递只有节点运营商可以看到的信息。
这样,我们就可以1. 通过区块信息获得节点运营商大致的算力比例,2. 通过查询不同节点运营商信息来获得其投票的区块信息。综合以上,我们就可以计算出,在同一个高度上竞争的不同版本的区块成为最长链一部分的概率。此时对于特定的节点运营商来说,在同一高度上的任何合法区块上投票都是可行的,竞争的任何一方只要有新的区块被发现,都会影响胜利的天平。但考虑到区块的传播和验证的过程依然需要时间,所以节点运营商需要考虑在不同版本上投票的其他节点运营商,切换到另一个区块分支版本上所需要额外付出的处理代价,即使少数算力的分支成功的延长,也需要更大的代价才可以获得多数算力的支持,在这个传输验证过程中,也可能会被多数算力所在的分支所超越。最终一个被大多数算力投票的分支版本胜出的概率将会略大。
从上面的分析我们可以看到,随着区块的逐渐增大,要处理的交易逐渐增加,节点运营商将会有越来越多的区块虽然被发现,但因为传输验证上的延迟而在算力竞争中落败,带来一定的孤块率。区块越小交易越少的时候,因为传输验证成本带来的延迟将会越少乃至可以忽略不计,就会有较小的孤块。
但孤块是有害的吗?从个体上来看,节点运营商因为孤块“损失”了一定比例的收入。但如果节点运营商平均来看都有同样的损失,那么对每个节点运营商来说都是公平的。而每个节点运营商就有动力通过提升连通性,提升验证速度,平衡手续费收入和区块大小等方法,来降低自己的孤块率。低于平均水平的孤块率,高于平均水平的手续费收入,就意味着更高的收入水平。
对于区块链的用户来说,我之前强调过交易链是核心,区块链只是不同的记录账本。孤块并不会影响到用户的交易。同时用户也有必要同时去检测网络上可能发生的区块分叉,并查询到交易被不同区块打包的状态。这部分的查询,可以通过直接查询打包区块的节点运营商的访问接入点来完成。这就是 Merchant API 所需要提供的内容。我们的用户或者支付服务商,将可以通过 MinerID 来查询到不同的区块头的归属,并通过对应的 Merchant API 来查询关心的每一个交易的状态。
「诚实」的这个字眼,在白皮书中出现了多次。如果在出现不同区块版本的时候,不仅仅是交易的顺序不同,甚至还包括了交易的版本不同,也就是出现了对同一个 UTXO 的双花,那会意味着什么呢?
如果用户或支付服务商正确的使用了比特币账本,则他们可以尽可能的联系上所能查询到的节点运营商,来查看交易的状态。如果这笔交易只有一个版本,则该版本将有极大可能被下一个区块打包。如果交易出现多个版本,则显然是发送者进行了双花的尝试。
对于情况 2 和 3 来说,在交易发送给所有节点运营商时,是检测不到有双花的。但在节点运营商最后打包的结果来看,却出现了双花版本。因为这些节点运营商遵循的应该是对交易先到先得的策略,因此在一开始报告交易不存在双花,和后续的打包结果出现矛盾。这种矛盾,就是节点不诚实的表现。
不诚实的节点,损害了比特币网络整体的安全性和稳定性,且因为节点对外作出的数字签名的承诺,会被检测出来,被诚实的节点所抵制。
因此,在 100 个区块的成熟度要求下,打包了双花交易的节点,会因为区块被诚实节点放弃而丢失这部分区块奖励,诚实节点将可以重新组织成一条诚实的账本记录的区块链。
这是比特币成为全球唯一不可篡改真相之源的重要基础。