承接上一篇结尾提出的问题,接下来的文章会着重介绍DAG的账本共识SPECTRE协议。从上一篇(《从区块链到DAG(二)--DAG的基本结构》)可以看出,DAG的整个网络并不是线性的。SPECTRE协议顺应了这种结构所以并没有提出选择主链的概念,而是着眼于解决冲突交易和防止恶意攻击。这里需要声明一下,所有讨论账本共识有效有个大前提:网络中大多数节点都是诚实的。我们不考虑集中超过51%算力的这种恶意攻击,因为无论用什么账本共识这样的攻击都会奏效。
1. SPECTRE如何解决冲突交易
SPECTRE通过区块间的投票来排除冲突的交易,如图1。
图片1 一个简单的DAG网络的投票过程
来源:Yonatan Sompolinsky, Yoad Lewenberg, and Aviv Zohar,《SPECTRE:Serialization of Proof-of-work Events: Confifirming Transactions viaRecursive Elections》
区块X里记录的交易信息是交易x先于交易y发生,记为x<y ;区块Y里记录的交易信息是交易y先于交易x发生,记为y<x,这两个交易相互冲突。
投票过程:
区块X和区块Y分别投票给自己。
区块X之后产生的区块我们称之为X的未来区块,回溯这些未来区块发现6,7,8只能回溯到X,所以这三个区块都投票给X,标记为蓝色。同理,回溯区块Y的未来区块发现9,10,11只能投票给Y,标记为红色。
未来区块12既回溯到X又能回溯到Y,它会投出与上一轮投票一样的结果X。图中虚线部分是上一轮的投票,按少数服从多数的原则可知,投票的结果是X。
X或Y之前产生的区块我们称为X或Y的过去区块,这些区块会分别统计自己对应的未来区块的投票,然后跟投给得票较多的那个选项。由此,区块1~5都投给X,交易x<y认定有效,y<x被丢弃。
2. “最长链共识”与SPECTRE的关系
图片2展示了当SPECTRE应用在区块链结构上的情况。
图片2:SPECTRE在“单链”上的应用
来源:Yonatan Sompolinsky, Yoad Lewenberg, and Aviv Zohar,《SPECTRE:Serialization of Proof-of-work Events: Confifirming Transactions viaRecursive Elections》
从“最长链共识”来看,链5->6->7->8长于9->10->11,所以蓝色区块会被选入账本。
现在我们换个思考方式,按照SPECTRE的原则对两笔冲突交易投票,比如6<10和10<6:
区块6,7,8投给6<10,因为6投给自己,6的未来区块7、8只能回溯到6。6的过去区块5根据自己的未来区块投票,5的未来区块有6、7、8都投票给6<10,所以5也投票给6<10。以此类推,区块9~11都会投给10<6。
区块1~4都是6和10的过去区块。以4为例,它的未来区块中5、6、7、8投票给6<10, 9、10、11投票给10<6,投给6<10的票数更多,所以4也会投票给6<10。同理,剩下的1~3也会投给6<10。最终投给6<10的区块占多数,投给10<6的区块被弃用,10<6被判断为无效信息。
从上述分析可以看出,SPECTRE和“最长链共识” 能够得到一个一致的结果。“最长链共识”其实就是SPECTRE在区块链结构下的简化版,SPECTRE是“最长链共识”在DAG结构下的拓展。在了解了SPECTRE的投票机制可以解决冲突交易后,我们来看看这种账本共识要怎么解决“双花”攻击和censorship攻击。
3. “双花”攻击
图片3展示了一次不成功的“双花”攻击,这种攻击一共分为三个阶段。
图片3 一次不成功的“双花”攻击
来源:Yonatan Sompolinsky, Yoad Lewenberg, and Aviv Zohar,《SPECTRE:Serialization of Proof-of-work Events: Confifirming Transactions viaRecursive Elections》
在第一阶段攻击者秘密准备了一个区块Y,Y包含了交易y<x。而后攻击者继续秘密生产区块13和14,这些新生产的区块一定会引用攻击区块,但是其中的一部分也会引用诚实节点的区块,例如13;目的是为了在后续的投票过程中“策反”这些诚实区块使他们投票给Y,比如诚实区块4,在第一阶段结束时4的未来区块只有13,14,4会投票给Y。但是这种“策反”在SPECTRE的投票规则里是无效的,因为诚实节点总是比做恶的节点多,总体上看诚实节点的出块效率会高于做恶节点,所以即使短时间内“策反”成功了,在后续过程中还是可以给修正回来。
第二阶段开始后,正常的交易x<y被记录在区块X中,攻击者的目的是等x<y被几个区块确认纳入账本以后,把通过这比交易获得的代币兑换成法币或者某种服务牟利;而后再释放出自己的攻击区块,使整个账本回滚并认定x<y这笔交易被无效,回滚后原本已经转出兑换的代币又重新回到自己的账户,可以反复使用,即“双花”(同一笔钱花掉两次)。
但是在SPECTRE投票中这种攻击是不会成功的。在第二阶段攻击者继续秘密生产区块15、16、17,诚实节点由于不知道这些秘密区块所以诚实节点产生的区块不会引用它们。
在第三阶段,攻击者继续生产区块并把之前秘密生产的所有区块上传到网络中,企图让自己的攻击区块合法化,回滚整个账本。此时分析图片可知:
Y的未来区块13~19只能回溯到Y故而投票给Y。
X的未来区块6~10只能回溯到X,故而投票给X。X的过去区块1~5分别通过统计各自的未来区块,可以得出大部分未来区块都投的X,所以它们也会跟投X。区块4在第一阶段被“策反”的投票正是在这里给修正了回来,因为在4的16个未来区块中,有9个投给X(区块X加上区块5~12),比投给Y的7个多(区块13~19),所以4最终会投票给X。
区块11和12既能回溯到X又能回溯到Y,所以他们分别投出与前一轮投票一致的结果,根据少数服从多数的原则,前一轮投票也是投给X的区块占大多数,所以11、12最终也会投给X。
综合所有区块的投票,投给X的占绝大多数,最终账本会记录x<y而抛弃y<x,”双花“攻击没有奏效。
4. censorship攻击
相比广为熟知的“双花”攻击,censorship 攻击(审查攻击)要显的陌生很多。与“双花”攻击不同,censorship的攻击者会持续的产生区块并立刻把这些区块在网络中公开,见图片4。
图片4 一次不成功的censorship攻击
来源:Yonatan Sompolinsky, Yoad Lewenberg, and Aviv Zohar,《SPECTRE:Serialization of Proof-of-work Events: Confifirming Transactions viaRecursive Elections》
在当前阶段,攻击者持续产生区块12~16,但是这些区块和区块X是没有关联的,它们即不会引用X,也不会回溯到X;这意味着这些区块将来是有可能被“策反”投票给Y的。
在未来的某个时刻,攻击者上传一个包含冲突交易的区块Y,Y的未来区块都会投票给Y,例如17、18。而与X不相关的过去区块16这时候会被“策反”投票给Y,因为16的大部分未来区块也都投票给了Y。那些与X不相关的、有“策反”可能的区块降低了网络的安全性,诚实的矿工在验证交易时会发现网络中有很多与X无关的区块,这会使X这笔交易的可信度降低,可能会增加确认交易的时间。因为无论是区块链还是DAG,新的交易都需要引用过去的交易来完成验证(通过区块头记录的哈希值来引用之前的区块),这些过去的交易得是可以信任的。(参考《从区块链到DAG(二)--DAG的基本结构》)
在SPECTRE的投票规则中,就算面对censorship攻击,交易也可以立刻得到确认。16~18都投票给Y。区块2~9都是只能回溯到X的区块,所以它们投票给X。区块1,12~15都投票给X,因为分别统计它们各自所属的未来区块的投票,都是投给X的占多数。区块10和11既能回溯到X又能回溯到Y,按照上一次投票的结果跟投,以少数服从多数原则可知它们都会投票给X。最终投给X的区块更多,攻击失效。
5. SPECTRE的不足之处
从上面的分析可以看出,SPECTRE可以很好的排除冲突交易,抵御攻击。如果一个项目只是向比特币一样用作支付作用的话,SPECTRE已经足够。但是如果要集成智能合约功能SPECTRE就无法胜任了,因为它只能对冲突交易做一个相对排序(判断冲突交易间的先后顺序),但无法给所有的区块做一个绝对排序。
智能合约的语言得是图灵完备的,就像我们编写一段计算机程序一样,需要按严格的顺序执行各种运算,所以具备智能合约功能的网络都有一个特征:网络中的交易可以按时间先后做线性排序(时序性)。
但为什么区块链的账本共识没有考虑时序性排序?因为区块链的底层账本结构天然的带有时序属性。区块链结构不允许分叉,每个区块一定要等前一个区块被确认以后才能加入账本(具体内容参考《从区块链到DAG(一)--区块链的账本结构和共识机制》),所以一条链上的区块和这些区块所记录的交易自然而然的就能按时间先后排出顺序。区块链的账本共识只需专注考虑如何排除冲突交易和防止恶意攻击即可。
图片5 本系列文章提炼的几个概念之间的关系
如图片5所示,底层账本结构和共识机制是组成主网的两大要素,而时序性是智能合约功能的必备要求。对区块链来说,时序性被天然的集成在了底层账本的链式结构中;但是对允许分叉的DAG来说,时序性只能通过账本共识来实现。SPECTRE无法用作智能合约正是因为它没有时序性,下一篇将介绍一种可以满足时序性要求的DAG共识。
参考资料:
[1] GHOST, DAG, SPECTRE, PHANTOM和CONFLUX技术原理,https://www.jianshu.com/p/8734e06d558f
[2] Yonatan Sompolinsky, Yoad Lewenberg, and Aviv Zohar,SPECTRE:
Serialization of Proof-of-work Events: Confifirming Transactions via
Recursive Elections
———— e n d ————
历史文章
希望大家可以关注微信公众号更加方便交流。公众号的文章也会率先更新~