深入比特币原理(十二)——区块链分叉

深入比特币原理(十二)——区块链分叉_第1张图片 Aaron 发表于 2018-03-19 16:52:23

文章来源:华为云社区

原文地址:https://bbs.huaweicloud.com/blogs/114580

 

上一节,我们讨论了矿工如何完成挖矿工作,也就是完成工作量证明。本节我们将讨论矿工完成新区块并广播后,整个比特币网络的运转方式。

一、独立验证新区块
比特币每个具有转发功能的节点(包括矿工)收到来自其他节点的新区块时首先会验证新区块是否有效,如果有效才会进行转发,否则会拒绝该区块。验证内容如下:

区块数据结构语法有效

区块头Hash值小于难度值(Target)(工作量证明有效)

区块时间戳早于验证时间未来两小时(由于各节点时间差异和网络传输时间等原因,区块链通常允许时间戳有一定的误差)

区块大小在可接受的范围内(无隔离见证的情况下为1000KB)

区块中有且仅有第一笔交易为coinbase交易

区块中所有交易符合交易验证的条件(参考深入比特币原理(十))


为什么每个节点要独立验证区块?
独立验证是去中心化的的基础,日常生活中我们的交易通常是由银行作为中心进行验证的。而比特币网络中所有节点平等,验证由所有节点共同参与,这是比特币去中心化的一种体现。
1.独立验证区块可以防止无效的区块在比特币网络中被大量传播。
2.独立验证可防止小部分节点串通作恶导致无效区块被网络接受的情况。

二、新区快连接到区块链

当一个节点收到新区块并验证通过后,会尝试将新区块加入到区块链上,但此时可能遭遇三种不同的情况,我们来进行逐一讨论。
1.将区块加入到主链上
这是一种最常见的情况,当节点收到新区块并验证通过后,直接将新区块链接到当前区块链最后一个区块后面,如下图星形图案区块。

深入比特币原理(十二)——区块链分叉_第2张图片

2.将新区块加入主链产生的分支链上
由于比特币节点地域分布、网络传输等原因,每个节点在收到其他节点产生的新区块时间存在一定差异。假设有两个诚实节点X与Y在相近的时间内完成了工作量证明,此时他们还未收到其他节点广播的新区快,于是X与Y都将自己发现的区块广播到网络中,这时候会出现一些节点先接收到X发现的区块,而一些节点先接收到Y发现的区块。由于X与Y发现的区块都是有效的,所以这些节点都会把先接收到的区块加入到自己的主链中。
如下图(X的区块用正三角形表示,Y的区块用倒三角形表示):

深入比特币原理(十二)——区块链分叉_第3张图片

随着X与Y发现的新区块在网络中进一步被转发,先收到X发现区块的节点也会收到Y的区块,先收到Y发现区块的节点也会收到X的区块。此时这些节点会把晚收到的有效区块加入到主链产生的分支链上,整条区块链将产生短暂的分叉。
如下图(X的区块用正三角形表示,Y的区块用倒三角形表示):

深入比特币原理(十二)——区块链分叉_第4张图片

在X与Y发现的区块被各节点接受后,矿工仅会把晚收到的有效区块连接到分支链上,然后继续基于自己的主链挖矿,即矿工组装的候选区块中Previous Block Hash总是对应自己主链上的最后一个区块。
接着,节点Z完成了下一个工作量证明组装了一个新区块并开始广播该区块,而Z的主链最后一个区块为X发现的区块(正三角形),所以Z延长了之前X发现的区块所在的区块链。
如下图(X的区块用正三角形表示,Y的区块用倒三角形表示,Z的区块用菱形表示):

深入比特币原理(十二)——区块链分叉_第5张图片

如果节点原本的主链最后一个区块为X的区块,就正常的将Z发现的区块加入到主链中。而如果节点主链最后一个区块为Y的区块,则会先将Z发现的区块加入到分支链中,然后将分支链切换为主链,即节点会选择工作量最大(区块高度最高)的链作为自己的主链。
随着Z发现的区块在网络中不断被传播,最终整个比特币网络又回到了一致的状态(无发叉)。

如下图(X的区块用正三角形表示,Y的区块用倒三角形表示,Z的区块用菱形表示):


深入比特币原理(十二)——区块链分叉_第6张图片

以上我们讨论的情况仅发生了一个区块分叉,实际中在一个区块分叉后可能再次产生同样的情况(分叉),所有节点处理方式是一样的。但是各节点在短时间内连续出现在相近时间完成工作量证明的概率呈指数下降。在比特币网络中一个区块的分叉每天都会发生,二个区块的分叉几周才会发生一次。而六个区块以上的分叉从未发生过,这也是为什么我们通常认为一笔交易得到6个区块的确认是最保险的。

3.将新区快加入到孤立区块池中
最后一种情况是当节点接收到一个新区快,该区块的父区块未被找到,即Previous Block Hash对应的区块不在节点当前的区块链中。类似交易(transaction)的处理,节点会将这种区块加入到孤立区块池中,当孤立区块的父区块被收到并加入区块链后,孤立区块会被移出孤立区块池并连接到它的父区块后面。
这种情况通常发生在两个连续的区块在短时间内被连续挖出(我们前面说过区块的产生时间是平均10分钟一个,但有可能短到1秒甚至更低),节点有可能会先收到子区块,随后才收到父区块。

本节我们主要讨论了比特币网络从自身自然的分叉到完成最终一致性的过程,下一节我们将来讨论人为的分叉——软分叉与硬分叉。

 

你可能感兴趣的:(区块链,比特币)