首页 百科知识 组装和选择区块链

组装和选择区块链

时间:2023-07-17 百科知识 版权反馈
【摘要】:比特币共识机制的第四个步骤是区块链的组装和最大累积工作量的区块链的选择。在下一小节中,我们将看到由于几乎同时挖出了相同高度的区块,导致了次链的产生。当节点接收到新区块时,会尝试将其插入已存在的区块链中。大多数时候,父区块会在主链的“顶端”,意味着新区块延长了主链。通过选择最大难度的链条,所有节点最终将达成全网范围内的共识。

比特币共识机制的第四个步骤是区块链的组装和最大累积工作量(最大难度)的区块链的选择。一旦节点完成一个新区块的验证,它将尝试将区块和已存在的区块链进行连接,形成新的链条。

节点维护着三套区块的集合:连接到主区块链的区块;形成主链分支的区块(次链);在已存在的链中均找不到父区块的新区块(孤儿)。只要不符合验证规则的任意一条,无效区块会立即被拒绝,不会被加入任何区块集合中。

“主链”在任何时候都是拥有最大累积难度的区块链。在大多数情况下,这也是含有区块最多的链,例外的情况是,同时存在两条长度一样的链,但其中一条的工作量证明更多。主链也可能存在分支,分支上有与主链区块存在同辈关系的区块。这些区块虽然同样是有效的,但不是主链的一部分。保留这些分支的目的在于,某些分支可能会在未来得以延伸,并在难度值上超过主链,那么后续的区块就会引用它们。在下一小节(“区块链分叉”)中,我们将看到由于几乎同时挖出了相同高度的区块,导致了次链的产生。

当节点接收到新区块时,会尝试将其插入已存在的区块链中。首先在区块中检查“前序区块哈希”字段,它是新区块对其父区块的引用。接着,在已存在的区块链中查找这个父区块。大多数时候,父区块会在主链的“顶端”,意味着新区块延长了主链。举例来说,新区块277316有一个到其父区块277315的哈希的引用。大多数节点接收到区块277316前,在其主链上已经存在区块277315,并处于区块链顶部,接收277316后将其与主链相连,并将区块链延长。

有时,正如“区块链分叉”中所描述的,新区块延长了一个链,但它却不是主链。在这种情况下,节点将区块连接到次链上,然后比较次链和主链的累积难度。如果次链的累积难度超过了主链,该节点将在次链上重新收敛,也就是说它将选择次链作为新的主链,而原来的主链则成了次链。如果该节点是矿工,它之后将在这个更新更长的链上构建区块,并进一步延长它。

如果接收到的是一个有效的区块,但是其父区块却无法在已存在的链上找到,那么这个区块就被当作是一个“孤儿”区块。孤儿区块被保存到孤儿区块池中,直到它的父区块到达本节点。一旦接收到父区块并连接到已存在的链条上,孤儿区块就可以从孤儿区块池中被取出,并与其父区块相连,成为区块链的一部分。孤儿区块的产生通常是因为两个区块被挖出的时间间隔比较短,而接收顺序刚好相反(子区块先于父区块到达本节点)。

通过选择最大难度的链条,所有节点最终将达成全网范围内的共识。当更多的工作量证明加入,某个可能的链条延长时,不同链条间暂时性的差异,最终将会得到解决。挖矿节点根据它们的挖矿能力,通过创建新区块的方式,“投票”决定待延长的链条。当它们开采出新的区块并延长了区块链条时,这个新区块本身就代表了它们的投票结果。

在下一节中,我们将讨论如何通过独立选择最长难度链条来解决竞争链(分叉)间的差异问题。

因为区块链是一个去中心化的数据结构,区块链的不同副本不是时刻都能保持完全一致的。区块在不同节点间的到达时间会存在差异,因而不同的节点可能拥有不完全一样的区块链视图。为了解决这个问题,每个节点总是选择并尝试延长代表了最大工作量证明的区块链,即最长的链条或者最大累积难度的链条。通过汇总记录在链上的每个区块的难度值,节点可以计算出创建这个链所耗费的工作量证明总额。只要所有节点都选择最大累积难度的链条,全局比特币网络最终将调整到一致状态。分叉是不同版本的区块链间暂时的不一致现象,当更多区块被加入其中某一个分支时,最终收敛将解决这一问题。

在接下来的几张图中,我们将在全网范围内,追踪“分叉”事件的整个过程。图形是比特币作为一个全局网络的简化表示。在现实中,比特币网络拓扑并没有按照地理位置进行组织。相反,互连的节点形成了一个网状网络,但是相连的节点间地理距离可能非常遥远。使用地理拓扑的表示法是为了更加简洁地演示分叉。在真实的比特币网络中,节点间的“距离”是用节点到节点间的“跳数”(hops)来衡量的,而不是基于它们的物理位置。出于演示目的,不同区块用不同颜色表示,散布在网络中,而它们经过的连接也用该颜色标示出来。

第一个图例(见图8.2),全网拥有统一的区块链视图,蓝色的区块位于主链的顶端。

图8.2 区块链“分叉”事件演示——分叉前

当两个候选区块同时竞争以形成最长区块链时,“分叉”发生了。通常情况下,这是因为两个矿工几乎在同时找到了工作量证明算法的解。当矿工发现各自候选区块工作量证明的解时,他们立即将“赢得”的区块发送给离他们最近的邻居,这些邻居则继续将区块传播到网络中。每个节点接收到一个区块后,都会将其整合进自己的区块链,将区块链延长一个区块。如果节点稍后又看到另一个候选区块同样延伸了相同的父区块,那么它将会把第二个候选区块连接到次链上。结果是,有些节点先“看到”这个候选区块,而其他节点则会先看到另外一个候选区块,这样两个竞争版本的区块链就出现了。

图8.3中,我们看到两个矿工几乎同时发现了两个不同的区块。两个区块均是蓝色区块的子区块,也就是说,将在蓝色区块之上创建新区块来延伸区块链。为了便于跟踪,一个区块被标识为红色,从加拿大发起,另一个标为绿色,从澳大利亚发起。

图8.3 区块链“分叉”事件演示:两个区块同时被发现

假设A国的矿工找到了“红色”区块的工作量证明的解,从而在父区块“蓝色”区块上延伸了区块链。几乎同时,B国的矿工也找到了“绿色”区块的解,也在“蓝色”区块上延伸了区块链。现在,存在两个可能的区块,一个是“红色”,来自A国;另一个是“绿色”,来自B国。两个区块都是有效的,都包含了有效的工作量证明,都在相同的位置延伸了区块链。两个区块中的交易也几乎相同,可能只是在交易顺序上有些细微差异。

当两个区块都开始广播后,有些节点先接收到了“红色”区块,而有些节点则先收到了“绿色”区块。如图8.4所示,网络分裂为两个不同的区块链视图,一个视图顶端是“红色”区块,另一个则是“绿色”区块。

图8.4 区块链“分叉”事件演示:两个区块的广播导致网络的分裂

从这个时刻开始,离A国的挖矿节点最近的(拓扑上而不是地理上最近)比特币网络节点将首先接收到“红色”区块,并建立一个最大累计难度的区块链,“红色”区块为这个链的最后一个区块(蓝—红),同时忽略晚到的“绿色”候选区块。同时,接近B国的节点将认为“绿色”区块是赢家,并将其加入区块链的最后区块(蓝—绿),而忽略晚到的“红色”区块。任何先看到“红色”的矿工,会以“红色”为父区块,立即开始构建新的候选区块,并尝试找到候选区块的工作量证明解。先接受“绿色”区块的节点则基于区块链顶端的“绿色”区块开始工作。

分叉问题几乎都能在一个区块的处理过程中就得以解决。网络中的一部分哈希算力专注于在“红色”区块之上挖矿,而另一部分算力则专注在“绿色”区块之上挖矿。即便哈希算力能做到平均分配,其中某个阵营先找到新区块的工作量证明解,并广播到网络的概率也是极高的。我们假定在“绿色”区块上挖矿的阵营先找到一个“粉色”的区块,从而延长了区块链(蓝—绿—粉)。它们会立即将此区块广播到网络,整个网络都会确认其有效性。如图8.5所示。

图8.5 区块链“分叉”事件演示:一个区块延伸了一个分叉

所有在上轮挖矿竞争中选择“绿色”并成为赢家的节点,简单地将区块链延伸一个区块。选择“红色”的,现在将看到两条链:“蓝—绿—粉”和“蓝—红”。“蓝—绿—粉”链相对“蓝—红”更长(累积难度更多)。结果,这些节点将重新将“蓝—绿—粉”设置为主链,而“蓝—红”则成为次链,如图8.6所示。这就是链的重收敛,因为那些节点被迫改变它们对区块链的认定,以接受更长链条的客观事实。所有正在尝试延长“蓝—红”链的节点将放弃在那条链上的工作,因为父区块“红色”已不在最长的链条上,它们的候选区块变成了“孤儿”。由于区块已不在最长的主链中,“红色”区块内的交易只能重新进入队列,等待处理下一个区块。整个网络收敛到一个区块链,“蓝—绿—粉”,“粉色”则作为链条的最后一个区块。所有矿工立即投入新的、以“粉色”区块为父区块的延展“蓝—绿—粉”区块链的工作。

图8.6 区块链“分叉”事件演示:网络重新收敛到一个区块链

理论上,如果连续两个区块几乎同时被处于分叉两侧的矿工挖出,则存在分叉延续两个区块的可能性。但是发生这种事情的概率非常低。一个区块的分叉可能每个星期会发生一次,但是两个区块的分叉极少出现。

10分钟的比特币区块间隔是一种在快速确认(交易结算)和分叉可能性之间的一种权衡。更短的区块间隔时间可以使交易的清算更快,但是会导致更频繁的区块链分叉;而更长的区块间隔时间虽然可以降低分叉次数,却使得交易结算变慢了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈