RChain运行原理[7] - Casper共识之预言机

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wangjia184/article/details/81059271

经过上一篇《Casper共识之安全性》的铺垫,本篇开始介绍RChain具体如何判断区块已经处于终结(finalized)状态。

1 终结性

下面动图演示了区块的终结过程。和BTC不同,RChain的区块具备终结性(Finality)。所谓终结,即表示区块所选择的分支不会在未来发生更改,因此终结的区块一定是从头向尾进行。一个区块只有当它所有前置区块的分支选择不再变化后,才可能有当前区块的终结性。
这里写图片描述
下面动图演示了RChain的DAG链的生成过程,其中的圆圈表示区块,箭头表示父子关系,红色的部分即是生成的DAG链。仔细观察动图可以发现,DAG链只有尾部出现分支选择(fork choice)的变化,随着区块叠加得越多,DAG链固化的部分越长。这里可以直观地看到,随着区块的叠加,DAG链从头至尾依次进入到了终结状态。
这里写图片描述
DAG链尾部最后一个处于终结状态的区块称为最新终结区块(latest finalized block)。在DAG链最初创建时,创世块(Genesis)即是最新终结区块。在DAG继续追加的过程中,只需已知的最新终结区块依次向尾部遍历判断,找到的第一个无法确定终结状态区块的前一个区块即是更新的最新终结区块。此过程不断重复,最近终结区出现的位置随着DAG链的增长而不断后移。

2 两个诚实验证者

首先考虑最简单的情况,某名字空间仅有两个诚实的验证者。

2.1 候选者

下图左侧是某时刻的状态,最新终结区块为传世块。此图和前面的图稍有区别,其中用虚线标出了justification区块,也就是打包该区块时打包验证者看到的最新区块集合。同时实线也代表一条有条虚线。
这里写图片描述
从最新终结区块(创世块)开始通过使用前面一文介绍的GHOST规则,选择出分支B1->B2->B3分支(右侧)。那么这个子分支就是候选者(Candidate)。顺着这条链依次向上检查每个区块是否处于终结状态,找到的第一个无法确定终结状态区块的前一个区块即是更新的最新终结区块。

2.2 检查候选者

首先检查区块B1。根据前文所述,在少于N个拜占庭错误的情况下,协议参与者如果都做出估值安全的决定,必将有共识安全。因此依次检查两个验证者是否在区块B1分支选择这个命题上是否都符合估值安全。如果双方在这个命题上做到了估值安全,那么这个分支选择必定会被后续任何新加的区块选择的分支所包含,也就具有了共识安全。

首先用验证者A的视角做如下检查:
这里写图片描述

  • 左图
    • 以验证者A的最新区块A4为视角,找到它的justification中指向了B验证者的区块,即B2。
    • 然后检查B2是否已经将候选者分支包含。 在此例中B2包含了候选者B1的分支。
  • 右图
    • 上述检查还不够,还需要检查验证者B生成的B2的后续区块B3。
    • B3区块也选择了候选者B1的分支。

然后用验证者B的视角重复上面的逻辑:
这里写图片描述

  • 左图
    • 以验证者B的最新区块B3为视角,找到它的justification中指向了A验证者的区块,即A2。
    • 然后检查A2是否已经将候选者分支包含。 在此例中A2包含了候选者B1的分支。
  • 右图
    • 上述检查还不够,还需要检查A验证者生成的A2的后续区块A3、A4。
    • A3、A4区块也选择了候选者B1的分支。

那么在这个状态下,任何未来生成的新区块,其用GHOST规则选择的分支必定包含了B1–因为B1已经获得了来自双方验证者的权重。验证者A和验证者B在B1区块分支选择这个命题的估值都是安全的,因此B1区块不会再次更改,从而有了共识安全。

3 多个诚实验证者

上面的例子是两个诚实的验证者,将它推广到多个诚实的验证者会如何?

某名字空间有N(>2)个诚实的验证者,对这些验证者两两一对进行上述的检查。如果其中有M(M<=N)个验证者两两之间都通过了上述检查,那么它们就是一个小圈子(clique)。

比如有三个验证者A、B、C:

  • A和B对同一个命题有估值安全;
  • B和C对同一个命题有估值安全;
  • A和C对同一个命题有估值安全;

那么这三个验证者就组成了一个小圈子,它们的权重都累加到了被检查的分支上,它们内部不可能再发生任何改变。如果要改变这个圈子的分支选择,必须来自于这个圈子外部其它验证者,外部的权重必须超过圈子内的权重才能改变。所以,当这个圈子的权重超过总权重的一半,外部就不可能改变圈子的分支选择。而其它未做出相同选择的验证者最终也会做出相同的选择。因此,判断多个诚实验证者是否达成共识的就是检查是否有一个权重超过总权重一半的圈子

具体到实现上,需要用到点图论。
每个验证者用一个顶点(vertex)表示,一共有N个顶点。这些验证者可以组成Cn2 对(pair),每对执行2.2节中所述的检查逻辑。如果检查通过就在代表这两个验证者的顶点间画一条线,称之为边(edge)。

例如:
这里写图片描述

为了判断这N个验证者是否在该候选者上达成共识,在此图中查找具有最大权重的完全子图(Complete Induced Subgraph)。如果这个子图的权重超过总权重的一半,即达成共识。

4 拜占庭容错度

上面说的情形都是假设验证者完全诚实的情况,也就是拜占庭容错度为零,实际中需要提供一个冗余度。另外,在前一篇中提到了拜占庭错误(Equivocation)会导致共识失败。一方面,验证者在发现拜占庭错误时检举揭发Slash掉拜占庭叛徒的保证金;另一方面,验证者也要将犯了拜占庭错误的验证者的权重扣除掉。

因此,判断条件如下:

Wclique>(1+tolerance)WtotalWfault2

其中的tolerance为容错度。当容错度为1/3时又没有监测到拜占庭错误,则圈子的权重至少要超过2/3才算安全。

需要注意的是,每个验证者都可以选择自己的容错度,拜占庭错误数少于两个节点是更小的容错度两者才会有共识安全。Vlad说这点上非常酷(cool),可以防止中心化。
我实在是理解不到。欢迎指点。

本文地址:https://blog.csdn.net/wangjia184/article/details/81059271
转载须注明出处!

展开阅读全文

没有更多推荐了,返回首页