前文我们已经详细介绍过“挖矿”的过程,节点完成“工作量证明”算出随机数后即可生成区块并写入区块链,问题来了,如果有两个节点同时解出随机数,都把生成的区块广播到网络中随后写入区块链,必然会导致区块链分叉。那么所有节点就不可能有一本公共的总帐本。
如何确认哪一份才是公认权威的总账本呢?
中本聪在论文《比特币:一种点对点网络中的电子现金》中曾介绍,比特币工作量证明机制的本质是一CPU一票,而最长链包含了最大的工作量,所以“大多数人”的决定就可以表达为最长链。
通俗来讲就是,比特币区块是依靠矿工们不断进行数学运算而产生的,每一个区块都必须引用其上一个区块,因此最长的链也是最难以推翻和篡改的,所以节点永远认为最长链才是有效的区块链,只有在最长链上挖矿的矿工才能够获得奖励,这就是我们常说的比特币最长链原则。
去中心化共识
在挖矿一篇,我们了解节点通过工作量证明来竞争记账,权威的总帐本是怎么达到共识的,由以下四个独立过程相互作用而产生:
1.每个节点(挖矿节点)依据标准对每个交易进行独立验证
2.挖矿节点通过完成工作量证明,将交易记录独立打包进新区块,并广播至网络。
3.每个节点独立的对新区块进行校验并组装进区块链
4.每个节点对区块链进行独立选择,在工作量证明机制下选择累计工作量最大的区块链
共识最终目的是保证比特币不停的在工作量最大的区块链上运转,工作量最大的区块链就是权威的公共总帐本。
最长链的选择
先来一个定义,在一般情况下,把累计了最多难度的区块链,也是包含最多区块的那个链称为主链。每一个(挖矿)节点总是选择并尝试延长主链。
1.分叉
当有两名矿工在几乎在相同的时间内,各自都算得了工作量证明解,便立即传播自己的“获胜”区块到网络中,先是传播给邻近的节点而后传播到整个网络。每个收到有效区块的节点都会将其并入并延长区块链。当这个两个区块传播时,一些节点首先收到#3458A, 一些节点首先收到#3458B,这两个候选区块(通常这两个候选区块会包含几乎相同的交易)都是主链的延伸,分叉就会产生,这时分叉出有竞争关系的两条链,如图:
对于两个区块都收到的节点,会把其中有更多工作量的一条链作为主链,另一条链作为备用链保存(保存是因为备用链将来可能会超过主链难度称为新主链)。
2.分叉解决
收到#3458A的(挖矿)节点,会立刻以这个区块为父区块来产生新的候选区块,并尝试寻找这个候选区块的工作量证明解。同样,收到#3458B区块的节点会以这个区块为父区块开始生成新区块,延长这个链(下面称为B链)。这时总会有一方抢先发现工作量证明解并将其传播出去,假设以#3458B为父区块的工作量证明首先解出,如图:
当原本以#3458A为父区块求解的节点在收到#3458B, #3459B之后,会立刻将B链作为主链(因为#3458A为顶点的链已经不是最长链了)继续挖矿。
节点也有可能先收到#3459B,再收到#3458B,收到#3459B时,会被认为是“孤块“(因为还找不到#3459B的父块#3458B)保存在孤块池中,一旦收到父块#3458B时,节点就会将孤块从孤块池中取出,并且连接到它的父区块,让它作为区块链的一部分。
3.一点思考
比特币将区块间隔设计为10分钟,是在更快速的交易确认和更低的分叉概率间作出的妥协。更短的区块产生间隔会让交易确认更快地完成,也会导致更加频繁地区块链分叉。与之相对地,长的间隔会减少分叉数量,却会导致更长的确认时间。