这一章,我们简单讲解一下,多节点之间是如何达成历史区块统一的。(如果你觉得这一章难以理解,可以跳过这一章,不影响后续的学习。)
首先,系统里的多个节点,它们的行为是基本上相同的,绝大部分时间都在做这几件事:
- 不断接收数据包并将新数据包填充到默克尔树底端,已填充的数据包不重复填充;
- 不断尝试任意数,努力凑出满足目标值的哈希值;
- 另外还有一件事,就是把新数据包不断广播给其他节点。
下图中,我们拆解了节点 X 的行为,而其他节点也是类似。
当节点 X 做出一个有效区块后,它会立即将部分区块信息广播给其他节点。“部分区块信息”只包含区块头和默克尔树的“树枝”,不包含挂在默克尔树下的数据包。
因为它之前已经广播过所有的数据包了,所以它就省得再次发送这些巨量数据了。而默克尔树的底部有每个数据包的哈希值,所以接收节点可以据此判断每个数据包应该挂在哪个位置。这样,接收节点对收到的区块稍作验证后,就可以将当前的区块与发送节点的区块相统一。整个系统便开始进行下一个区块的角逐。
从上面的流程中,我们可以看到这样几个有趣的现象。
- 节点会第一时间广播数据包。如果不在第一时间广播数据包,会有一个坏处,那就是要在广播区块的时候附带巨量数据包,这样广播区块的速度就会很慢,很有可能被广播更快的节点抢先发布新区块。
- 由于节点会广播数据包,用户就不一定需要把自己的数据包上传给每一个节点了。