MeerDAG?MeerDAG!

原创
1046 天前
14870

DAG 一个陌生又熟悉的概念,在2020年区块链的扩容技术如雨后春笋般涌现时,连以太 2.0 都借助 ZK-Rollup 的东风要冲及千级的TPS, 再谈DAG似乎显得有点儿不合时宜。其实这是对 DAG 技术的误解,作为一个技术框架,处在整个区块链架构中数据结构层,代表的一个技术思想,怎么去改进都不会过时。就跟 PoW 和 PoS 一样,作为一个共识框架,在现有的技术格局下,很难说孰优孰劣,关键还是在于具体的实现是什么。

 

技术架构是分层的,虽然涉及到具体实现,各个层级之间不可能做到完全独立,但从架构设计的角度来说,基本可以认为各个层级的技术是互不依赖的,用比较专业的说法就是正交。正交就像大家熟悉的笛卡尔坐标系,x轴和y轴是不同的维度,互相之间不会影响。同样,DAG 作为数据结构层的技术,并不会影响和其他层级的技术的结合,比如说在 DAG的技术上结合zk rollup 进一步地提升交易吞吐量。这也解答了许多朋友的疑惑,现在采用ZK-rollup 还有闪电网络或者分片的技术轻松可以突破千级 TPS ,DAG 由于设计上还是存在单节点的计算能力的瓶颈,那研究 DAG 的意义究竟何在?

 

在任何一个技术架构中,任何一个环节的强健都是非常重要,尤其作为最底层的数据结构。用大家熟悉的话就是身体是革命的本钱,就象现在已经有了各种各样的交通工具代步,远超人类自身的生理速度极限,但是我们仍然追求更高更快更强的奥运精神。同样,我们研究 DAG 是为了给区块链网络提供更加强健的数据结构,在此基础上再结合其他技术自然如虎添翼。以太 2.0 就是最鲜活的例子,以太的数据结构就是一个施加了诸多限制的 Block DAG,但是丝毫不影响以太的共识框架转成PoS节约能耗 以及在二层上通过分片,状态通道,zk-rollup 等多种技术极大的提升智能合约以及交易的执行效率。

同样,Qitmeer 技术团队在做技术架构的设计方面就把共识协议放在了至关重要的位置。因为,共识协议是整个架构的骨架,这个架构必须要足够优化

 

同样, 共识协议是技术架构的骨架,所有的模块都是围绕协议来实现,所以Qitmeer 在协议设计之初就制定了非常严格的设计原则。

1.   完全去中心化

去中心化不仅是区块链的精神,更是网络安全性的来源。因为无论共识算法的共识指标多高,30%也好,50%也好,如果网络本身不去中心化,那攻击者联合少数共识节点形成的攻击的成本就会低得多。

2. 强健的数据结构

区块链虽然名称中包含 链,但是这个链只是代表只是微观层面相邻区块之间通过加密算法保证的单向验证关系,所以结构本身有极高的安全性。只要不违背这个安全性的设定,宏观上是链式还是图式本身没有严格要求。所以我们希望数据结构本身能突破协议的约束,在保证安全性以及其他技术指标的要求下,单位时间能容纳更多交易。

3. 安全性

Meer DAG 应该保证50%的共识安全性。

4. 可插拔

可插拔代表模块之间耦合度很低,可以根据需要随时更换模块。可插拔的设计不仅让架构更加灵活,更重要的是可以让模块尽可能的简单,从而增强整体的健壮性。

5. 公平性

应该保证为网络贡献的资源跟获得的收益大体平衡,节点应该承担跟其拥有资源相匹配的风险。

 

这五条虽然严格,但是让共识设计的方向反而清晰起来,Qitmeer 针对以上五点原则分配给出了自己的解决方案。

 

去中心化

去中心化的要求让我们在共识框架上选择了 PoW。PoS 有节省资源的诸多有优点,Qitmeer 团队也一直关注PoS 共识算法的发展,也一直把 PoS 作为远期的目标,就跟以太从PoW 发展为 PoS 一样。但在去中心化这点上,目前暂还没有发现特别理想的PoS解决方案。最关键的一个问题就是如何解决资产的首次分配。PoW 是用算力去获取资产的分配权,算力是一种物理资源,属于链外资源,而且获取成本大致相当。但是 PoS 是用股权 ( 权益) 去获取链上资产的分配权,而股权本身就是链上资产,这就掉入了先有鸡还是还是先有蛋的逻辑陷阱。所以主流 PoS 共识的做法会在创世块就切好蛋糕,把股权全部分配出去,但是这个切蛋糕的过程其实就是一个中心化的过程。所以Qitmeer 最终选择了 PoW 作为共识算法的框架。

 

数据结构

目前区块链世界,主流的数据结构就是链式和图式,图式主要就是 DAG 了。其实数据结构本身采用哪种方案并不是核心问题,关键要看不同的数据解决方案能解决什么样的问题。区块链是一个分布式的网络,节点在生产并发布区块的过程中,由于存在计算区块以及传播区块的时延,各个节点得到区块必定是异步的,异步就代表交易的顺序是不确定的,所以需要有一种统一的规则保证最终每个节点收到的交易顺序一致,这也就是共识算法了。传统链式结构为了解决共识的问题,采用的是人为增大区块的生产效率,这样保证在一个比较长的时间内,几乎只能产生一个区块传播到全网。

那我如果取消掉这个人为的区块周期,让区块在产生后立马就传播到全网,虽然交易的传播会因为时延造成节点接受的异步,但是由于交易本身是有严格的输入和输出的依赖关系校验,最终节点还是可以达成共识,而且网络的处理效率可以无限逼近带宽的物理极限。这也就是研究 DAG 的基本原理,但是细心的朋友发现,此时账本结构已经不是链式而是图式了,而且这个图由于交易的依赖关系是肯定是单向的,也就是有向无环图。

 

 Qitmeer 团队也因此看好DAG的前景。当时,在主流的 DAG 网络采用的是交易型 DAG ,即账本中每笔交易是彼此连接的,没有区块的概念。 这个设计的网络通信效率以及账本存储效率都不高,打个比方,如果把交易比作一个人,区块比作汽车,是多个人乘坐一辆公共汽车的交通效率高还是每个人开私家车的效率高;更重要的是,这些都不是兼容PoW 共识算法的,而PoW 是我们之前提到的去中心化的基础,所以Qitmeer 并没有采纳。

 

Qitmeer 最终发现了BlockDAG的数据架构,BlockDAG 跟BlockChain 只有一字之差,确实说明两者之间有着许多的共性,本质上说,BlockChain 就是一种特殊的BlockDAG。所以BlockDAG 于其他特殊的账本数据结构不同,BlockDAG 与比特币的经典区块链模型是同源的,所以天然就继承了比特币所有已经验证过的优良特性,比如说PoW, 比如区块之间的单向验证,同时又是BlockChain的拓展,能容纳分叉,从而实现更高的交易吞吐量。

 

BlockDAG 不是一个具体的共识协议是一个采用基于可挖矿的图式区块账本的共识协议框架或模型。BlockDAG 一般还会对于共识算法的安全性有较高的要求,即保证50%的算力安全性,后面会提到。去中心化,高安全性,高交易效率成为最终打动了Qitmeer。

 

安全性

细心的朋友会疑问,既然 BlockDAG有这么多的优点,为什么比特币最初没有采用BlockDAG,确实如此,但是这样的代价就是账本的分叉变多了,换言之就是每条分叉聚集的算力减少了,所以网络遭受攻击的风险就提高了,这也就是比特币宁可牺牲交易吞吐量也要保证安全性的原因。所以,DAG 的网络其实不少,但是不少都是通过引入一条中心化的辅助链保证网络不被攻击。这和我们追求的去中心化的原则是冲突的,如果去中心化的前提没有了,讨论链式还是图式其实意义不大,极端的情况,如果网络有一个共识节点,那即使是链式结构也能高速处理所有的交易,那这还是区块链么?

 

在确定BlockDAG 作为数据模型后,很重要的一个问题就是如何解决分叉带来的安全性的问题。好在 BlockDAG 的概念提出的同时就有研究机构在探索基于BlockDAG 数据结构的安全性高的共识协议,其中几乎所有重要的论文都源自DAGlabs。最先出来的是 Inclusive 协议,Inclusive 协议共识算法,奖励等方方面面,几乎奠定了BlockDAG协议的总体框架,以后的BlockDAG 方向的论文几乎都是在这个框架上的改进。Inclusive 虽然是纲领性的论文,但是在细节上做得不是很到位,比如在最核心的共识算法层面,只有一个比较粗糙的图遍历算法,相当于抛砖引玉,不具备工程上的可行性。但是Inclusive 还是给Qitmeer 提供了宝贵的参考价值,尤其是在奖励设计方面,后面在公平性上会提到。

 

此后的GHOST 提出了树形DAG的解决方案,其共识算法解决BlockDAG 最大的安全性问题,达到了更比特币相当的50%算力,自此BlockDAG 才进入主流区块链的视野,其中最具代表性的就是以太采用了GHOST 作为共识协议,这也是为什么以太能将出块周期提高在10秒级别的最重要的原因。不过很遗憾的是,遗憾的是,以太采取了一个比较保守的策略,将GHOST协议的并发性做了一定的限定,所以并没有完全发挥GHOST协议的性能。

 

可能的一个原因就是,GHOST协议的是树形DAG中除了主干链上的交易打包进账本,其他分叉链中的交易是被抛弃的,所以在交易并发很高的时候,会造成了巨大的浪费。这也是很有意思的一点,在之前的 Inclusive 协议已经做出了标准 BlockDAG的设想,也就是说会研究怎样让所有的区块中的交易都能参与共识,但是后面的GHOST协议虽然解决了共识安全性的问题,却带来了交易的浪费。也许当时并没有找到既能充分利用所有区块的吞吐量,又能保证安全性的方案,在安全性和可扩容性相较之下自然要优先考虑安全性,更何况GHOST协议相较于经典的区块链协议而言交易速度已经非常快了。

 

之后的SPECTRE协议则完美解决了分叉链交易浪费的问题,而且从账本模型上也不再是树形DAG,而是一个标准BlockDAG, 就是说是一个完整的DAG图了,好处就是交易的利用率进一步提升。不过SPECTRE 还是不够完美,SPECTRE协议无法保证所有交易的线性排序,虽然共识算法保证了不会存在交易的双花,但是当时区块链系统支持智能合约是大势所趋,而一层智能合约是要求所有交易都是可以线性排序,更重要的是 Qitmeer 的奖励机制为了鼓励矿工积极挖矿,也对交易的排序有严格要求,故Qitmeer 只借鉴了 SPECTRE的共识算法可以快速确认的特点,优化了MeerDAG 的确认速度。

时间来到了2018年,DAGlabs 推出了 Phantom 协议。PHANTOM 协议解决了SPECTRE协议不能交易线性排序的问题,算是第一个工业级的BlockDAG 协议。Phantom 后面做了一些优化并修复了一些问题,也就是 GhostDAG 协议,标志着BlockDAG 协议走向成熟。Qitmeer 的共识协议也是基于 GhostDAG, 并做了大量的改进,算是一个GhostDAG 协议的少数工业级实现之一。

 

GhostDAG 协议的论文更多的还是在思路上提供指导,但是毕竟重心还是在论证算法的严谨性,很多工程中的问题论文是不会考虑太多的,其中最典型的一个问题就是性能,如果按照原文的参考算法直接去实现,性能几乎是没法接受的。众所周知,区块链的账本数据库随着时间的推移会变得非常庞大,而且每笔交易都要通过所有节点确认,一旦出现性能问题,肯定会被攻击者利用,造成整个网络的瘫痪,所以性能问题在区块链网络中本质是一个安全性的问题。

 

当时,Qitmeer 团队针对GhostDAG和SPECTRE 的共识算法做了大量的优化,将复杂度降低了两个数量级,达到了工程级别的要求。

 

可插拔

可插拔就是说模块之间是可以自由替换,这首先自然是Qitmeer 工程师文化的体现。工程师对于软件产品除了追求可得见摸着找的体验和效率在看不见的部分追求的就是架构设计了。还有一个比较现实的原因就是 Qitmeer 在探索一条全新的道路,Qitmeer 也不知道未来Qitmeer 会发展成什么样子,会集成什么新的技术,但是当时Qitmeer 团队达成了一个共识,就是我们要保持开放的心态,只要是优质的成熟的技术,我们就会积极拥抱,所以就要在架构设计上对技术的更新换代提供接口。

 

Qitmeer 的可插拔性最典型的体现就是我们在共识算法上做到了抽象,就是说只要是兼容 BlockDAG 框架的协议,都是可以替换的。所以,Qitmeer 很快就实现了 SPECTRE 和 GhostDAG 的共识算法,甚至在 Conflux 协议还没有出官方实现时,Qitmeer 也根据Conflux的论文实现过一个 Conflux 的版本来检验可插拔的稳定性。

 

Qitmeer 可插拔性的设计最被社区熟知的模块体现在挖矿算法。Qitmeer 是多种算法混合挖矿的,一是Qitmeer 开放精神的体现,Qitmeer 希望在挖矿生态尽可能地丰富;二也是 Qitmeer 在成长初期需要根据网络的发展状况做出灵活性调整的现实需要。Qitmeer 的挖矿算法先后实现了对CPU 友好的Blake2bd, 对GPU 友好的Cuckoo Cycle 以及FPGA 友好的keccak256,而且还支持多种算法同时进行的混合挖矿,每次算法的调整都比较顺利。

 

Qitmeer 可插拔性最近的一个体现就是将网络库替换成了libp2p。Qitmeer 的框架代码移植自Btcd, 在经过一段时间的测试发现在网络的稳定性和连通性上达不到 BlockDAG 网络的工程要求。因为BlockDAG 是需要承载高并发的区块请求,MeerDAG 协议已经保证了协议对于交易的吞吐量是没有上限的,所以瓶颈只会在网络本身的连通性。网络的物理极限Qitmeer 没有办法提升,但是在仍然可以优化网络库,提高网络利用率,这样可以把交易的吞吐量尽可能地逼近网络的极限。libp2p是从IPFS项目开源出来的网络库,除了连通性的优化之外,还支持许多高级的属性,比如说支持类似URL的网络协议,这样很方便的连接网络中的内网节点,可以充分发挥节点的计算能力,实现负载均衡。得益于Qitmeer 可插拔的设计,libp2p 的迁移非常顺利,两周时间就完成了迁移,而且迁移后也比较问题,没有出现重大的兼容性问题。

 

Qitmeer 可插拔的设计也回答了许多人关心的问题,为什么Qitmeer 不优先去做二层网络的优化,二层网络由于计算在链下,不需要每笔交易的都全网链上共识,在不考虑网络拥堵机器计算能力等物理因素限定下自然速度可以达到理论上的无限扩容。比如说,如果Qitmeer 为了提高交易吞吐量先去做分片或者闪电网络,可以轻松地达到几千甚至上万的TPS。但是这样的比较意义并不大。 所以更关键的问题不是Qitmeer 先做什么后做什么,而是Qitmeer 能不能做,或者换个角度思考,如果同样是一个分片或者二层链,在安全性相同的情况下,你是希望每个分片或者二层链的TPS是上千还是只有区区十几呢?这就取决于Qitmeer的协议架构是不是足够灵活,也就是可插拔性强不强。事实上,Qitmeer的智能合约就是跨链的,也可以认为二层的,从这个角度来说TPS说多高都行。虽说跨链或者二层智能合约并不是新的概念,而且可能会被社区误解,Qitmeer 在智能合约设计上没有作为。但是如果Qitmeer 把智能合约定位为跨链,就会要在和数据结构和协议设计上保证一个开放的接口。举个不起眼的例子,Qitmeer的区块中是预留了类似于以太状态根(state root)的的字段, 这个字段就为智能合约的扩展提供了各种可能性。

 

公平性

BlockDAG 在同等情况下天然就比BlockChain 更具备公平性。因为如果出块率很高,虽然概率保持不变,小矿工就能在很短的周期内获取预期的收益。矿池的原理也是类似,矿池并没有提高矿工的挖矿成功率,而是降低了矿工挖矿的风险。但是公平性是一个系统的工程,涉及到挖矿算法,经济模型,共识算法,奖励机制等等,仅仅靠出块率还是无法完全保证公平。经济模型后续会有专文介绍公平性的问题,挖矿算法的公平性之前的文章也有过介绍,这里着重提一下奖励机制的公平性。

 

一个合理的奖励机制的原则就是多劳多得,然后尽量能平衡生态中各个角色的利益。BlockDAG 在奖励设计上要比BlockChain复杂许多。区块链由于只有唯一的链,所以天然就解决交易排序的问题。然而BlockDAG 会存在一笔交易存在多个同样高度的区块中的问题。那这些区块中的交易谁先谁后就至关重要。

 

Qitmeer 在最开始的核心共识算法是选择SPECTRE 还是GhostDAG 一直在权衡。SPECTRE 交易确认速度快,而且已经有两年的成熟期,虽然不支持交易全排序,但是Qitmeer 出于底层网络的稳定本来就没有考虑实现一层智能合约,所以交易不能全排序并不影响;但是GhostDAG (当时还是Phantom) 支持交易全排序,为未来网络的可扩展性提供了更大的空间,缺点就是没有足够的市场成熟期的验证,万一协议有问题,共识协议的问题往往都是致命的。MeerDAG 采用以GhostDAG 为主SPECTRE 为辅的混合协议的决定性因素就在奖励设计上面。因为Qitmeer 希望鼓励矿工能积极为网络做贡献,自然谁先将交易打包,谁就应该获得更多的奖励,而这个奖励机制的基础就要求任何两笔交易的先后顺序是确定的。Qitmeer 为了奖励机制承担了重大的风险,足见Qitmeer 团队对公平性的重视。所以目前的交易手续费的机制就是先到先得,只发给最先打包的矿工,引入了一定的竞争机制,让矿工能更有动力为网络提供安全性。先到先得的思想源于 Inclusive的论文,但是当时Inclusive的提供的参考共识算法过于简陋是不具备工程级别的价值,Qitmeer 通过引入GhostDAG 的共识算法,算是给这个先到先得的思想提供了一个最佳实践。

 

BlockDAG的奖励机制比BlockChain 复杂还体现在交易手续费的设计上。矿工是趋利的,如果没有一套合理的激励机制的话,自然都会去打包高手续费的交易,那就会造成区块里面的交易重合度非常高,交易重合度高,那BlockDAG的高可扩容性的优势就要大打折扣,而且对手续费不高的用户来说也是不公平的。举个极端的例子,如果所有的矿工都打出一样的矿,那BlockDAG 就退化成为区块链。当然更不可能因为避免交易重复就取消手续费,那矿工就失去打包的积极性了,很有可能就只会打空块了。最先在Inclusive 就提出了这个问题,但是Inclusive 并没有给出一个最终的解决方案,只提供了一个要分权重更改交易打包优先级的思路。Qitmeer 相信大道至简,采取了一个最简单的实现就是交易手续费的高低与交易费的被打包概率成正比,比如说A的手续费比B高一倍,那被打包的概率也相应的提高一倍,这样同一笔交易在区块中的重复率就显著降低了。当然也不排除矿工会私自更改代码,破坏公平。但我们之前也提到了先到先得的规则,矿工要冒着竞争交易手续费失败的风险,而且手续费越高的交易,竞争就越激烈,失败的风险就越大,所以理性的做法还是接受默认的设定。这样除了解决交易重复的问题,更是保证了矿工和用户的公平性, 因为这既保证了矿工仍然有手续费的激励,也保证了用户在手续费不高的情况下仍然有概率会被打包。

 

MeerDAG 不仅仅( Mere ) 是DAG,是Qitmeer 团队朝着自己 “打造一条可用的区块链” 的小目标奋战了无数个日夜的结晶,MeerDAG 也仅仅是DAG,一条回归最本真DAG的普惠公链,这就是MeerDAG的初心。