之前有几期文章,讲述了 Conflux 中的 GHAST 共识。
简单来说,GHAST 共识就是在 GHOST 的规则基础之上,让每个区块的区块权重有多种可能。当网络中风平浪静的时候,区块的权重是 1,类似于一个出块速度很快的 GHOST 的规则。当网络中出现了一个攻击的时候,区块的权重有 1/360 的概率是 360,还有 359/360 的概率是 0。这相当于把出块速度放慢了 360 倍。
在判断每个区块的权重时,我们要先读取这个区块的父区块、引用区块、父区块的引用区块、引用区块的父区块、…… 总之,沿着父亲边和引用边,我们把所有能到达的区块放在一起,构成一个树图,叫做“区块的历史树图”。
对于一个诚实节点生成的区块,这个历史树图其实就是:“这个区块被生成时,生成它的节点看到的树图结构是什么样的。” 而 GHAST 规则,就是基于历史树图有没有被攻击的迹象来判断的。由于区块的父边和引用边是不可篡改的,所以这些边算出来的历史树图也是不可篡改的,确保了大家对区块权重的认知是一致的。《详解自适应权重 “GHAST” (1) -- 概览》有更详细的描述。
GHAST 规则的目的,就是应对存活性攻击。经过对 GHAST 规则的升级,我们将“历史树图有没有被攻击”的判断规则改得非常简单。(就不需要尝试理解之前那个晦涩的版本了)
“这个树图结构中,对每一个足够老的主链区块,它最大的孩子比第二大的孩子(子树权重上)有明显优势。否则,这个树图结构是遭到攻击的。”
l 我们为什么希望最大的孩子比第二大的孩子有明显优势?
大家回忆一下我们之前讲到的“平衡攻击”(点击阅读详情),坏人设法构造两个大小差不多的子树,让好人对哪个子树更大争执不休。而如果最大的孩子比第二大的孩子有压倒性的优势,那么这个最大的孩子就毫无争议地成为下一个主链区块。皇储之争决出胜负,皇位顺利继承,就不会出现九子夺嫡的现象了。
l 我们为什么只对足够老的主链区块有这样的要求?
因为对于比较年轻的主链区块,它的孩子(子树权重上)势均力敌是正常现象。如果对这些区块也要求“最大的孩子有明显优势”,只会让整个系统陷入神经过敏的境地而无益于提升安全性。
l 那么,我们如何量化有明显优势和足够老呢?
有明显优势相对比较简单,只要最大的孩子比第二大的孩子(子树权重上)多 1000 就可以了。
而对区块是否足够老的判断就比较麻烦了。理论分析显示,一个区块是否足够老,应当由它的生成时间决定,而不是大家首次看到它的时间。也就是说如果一个区块被坏人藏了很久,然后把它放了出来,哪怕大家刚刚看到它,它也应当是足够老的。此前我们在“分割攻击”(点击阅读详情)中讲过一种情形,一个被坏人藏了很久的块,刚刚放出来就可以进入主链。所以对主链区块是否足够老,不能简单地以区块高度或者子树大小为判断。
l 那么怎么判断一个树图中的某个区块是否足够老呢?
我们先来处理没有争议的情况:
1. 对于好人区块,如果它已经生成了很长时间(超过阈值 d1),它应当是足够老的。
2. 对于好人区块,如果在很短时间之前才生成(低于阈值 d2),它不可以是足够老的。
3. 对于坏人区块,如果它已经生成了很长时间(超过阈值 d1),它应该是足够老的。
上面的两个阈值中,d1 > d2,所以对处于中间状态的好人区块,我们并不总能准确地判断它是否足够老。不过对于我们的理论分析来说,只需要分辨是否“明显足够老”已经够用了。
细心的朋友可能注意到了,我们上面的分类里不涉及“生成时间很短的坏人区块”,这是因为存在根本无法判断的情况。假设在区块链网络运行了一年以后,有人放出来一个区块,它的父亲区块是创世块,也不引用任何其它区块。对于其他人来说,根本无法判断这个区块是刚刚生成的还是生成后被雪藏了一年才放出来——这是信息论意义上的无法区分,即使有量子超级计算机都没用。
但是有一点可以确定,就是这样的区块肯定是不正常的,肯定是坏人生成的——好人生成的不会有这么大的广播延迟。按照密码学中通常的处理方法,既然无法区分,那就不妨统一认为都是一种情况,所以我们可以直接把这类区块视为足够老的区块处理,也就是上面分类的第三种情况。
那么问题来了,如何判断一个区块是否“明显”足够老?这又是一个可以用八仙过海的方式解决的问题。至于 Conflux 如何解决,且听下回分解。
注:本文中凡是涉及的参数仅为原理讲解用途,Conflux 测试网、主网采用的系统参数以技术规范文档为准。
本文来自,仅作分享,存在异议请联系平台删除。本文观点不代表刺猬财经 - 刺猬区块链资讯站立场。