我们可以在https://blockchaindemo.io/体验这个过程。
创建区块
默认第一个链叫Satoshi(中本聪)。链上第一个区块叫“创世区块”——Genesis Block。后面我们会看到创建的第二条链第一个区块也是如此。
新增链
新创建的链叫Debby。默认上面有一个创世区块。
然后我们让这个链和其他链(Satoshi)连接。
如上图,Satoshi链是标蓝的,即当前链。Debby上的数字7,表示Satoshi链上发生了7次行为。
我们看下这7条消息。
这是Satoshi链的视角。
- 连接到Debby链。
- 向Debby要它的最后一个区块。
- Debby向我要我的最后一个区块。
- 我向Debby发送我的最后一个区块。
- Debby把它最后一个区块发给我了。
- 判断出Debby的最后一个区块的索引并没有我大,所以我什么都不要做。因为之前我们在Satoshi上创建了一个区块,所以有两个区块。而Debby是新创建的链,它上面只有一个创世区块。Debby最后一个区块的索引是0,Satoshi最后一个区块的索引是1。
- Debby把它最后一个区块发给我了。
- 判断出Debby的最后一个区块的索引并没有我大,所以我什么都不要做。
我们再切换到Debby视角来看
可以看到Debby已经同步了Satoshi的链上所有区块了。
- Satoshi和我连接上了。
- 向Satoshi要它的最后一个区块。
- Satoshi将它最后一个区块发给我了。
- Satoshi最后一个区块的Pre hash和我最后一个区块的Hash一致,于是我们将该区块添加到我这条链上。
- Satoshi向我要我的最后一个区块。
- 向Satoshi发送我的最后一个区块。
- 向Satoshi发送我的最后一个区块。
区块链直接替换
在上面的例子中,Debby收到的Satoshi最后一个区块,这个区块的Pre Hash正好是Debby最后一个区块的Hash。这样Debby就直接把这个区块加入自己的链上。
如果链上区块差距比较多,那是怎么做的呢?我们可以继续做实验。
我们在Debby链上新增一个区块
我们看下Debby链上的行为,主要集中在新增区块后的行为
- 向Satoshi发送我的最后一个区块。
- Satoshi给我发送了它的最后一个区块。
- 判断出Satoshi最后一个区块索引并不比我大,所以我什么都不用做。这个是正确的,因为我们第二次新增的区块是在Debby上,所以它的最后一个区块不可能比Satoshi最后一个区块的索引小。
我们再切换到Satoshi视角,可以看到它已经同步了Debby链上数据
Satoshi视角看在Debby上新增一个区块后的行为
- Debby向我发送了它的最后一个区块。
- 判断出Debby的最后一个区块索引的Pre Hash和我的最后一个区块的Hash一致,我就将这个区块直接加入我的链上。
- 向Debby发送我的最后一个区块。
上面的情况都是在链不一致时,由于只是差一个区块,于是就在当前链上直接追加这个区块。
我们再新建一个新链,它和老链Satoshi和Debby差两个区块。
新建的区块链叫Tony。我们让它和Satoshi同步数据。
- Satoshi和我连接上了。
- 我向Satoshi要它的最后一个区块。(已经领先2个区块了)
- Satoshi将它的最后一个区块发送给我。
- 我向Satoshi要它的全部区块。
- Satoshi将它的所有区块发送给我。
- 判断出Satoshi的区块链比我的长,我直接用它的全部区块链来替换我的区块链。
- Satoshi找我要我的最后一个区块。
- 我向Satoshi发送我的最后一个区块。
- 我向Satoshi发送我的最后一个区块。
我们再切换到Satoshi的视角,看它和Tony的数据同步
- 我连接到Tony。
- 我找Tony要它的最后一个区块。
- Tony找我要我的最后一个区块。
- Tony找我要我的全部区块链。
- 我向Tony发送我的完整的区块链。
- 我向Tony发送我的最后一个区块。
- Tony把它的最后一个区块发送给我了。
- 判断出Tony的最后一个区块的索引没有我的大,所以我什么都不用做。
- Tony把它的最后一个区块发送给我了。
- 判断出Tony的最后一个区块的索引没有我的大,所以我什么都不用做。