一文读懂Darma Cash(DMCH)对区块链的贡献
Darma Cash (DMCH) Block-DAG技术
1. 前言
区块链技术在很多领域有着广泛的应用前景,如何提高区块链的交易处理性能是目前区块链应用面临的一个主要挑战。包括以太坊在内的众多项目,提出了包含交易分片、链下状态通道等各种链下或链上扩容技术。本文将重点介绍一种在Darma Cash上实现的链上扩容方案:Block-DAG。
2. 面临的问题
传统的金融支付系统,能够每秒处理几千到几万笔交易,相较而言,比特币的交易处理性能相差了几个数量级,我们先来看表2-1各种著名的区块链项目的交易处理性能:
2.1 性能低的原因
比特币采用著名的链式结构组织区块,每个区块能够包含的交易是有限的,如果有多个矿工挖矿,当同时有多个区块被发现时,需要根据最长链原则选择一条“最佳链”而临时丢弃其它区块,之所以是“临时”,是因为被丢弃的区块继续延伸并满足最长链原则,则会再临时丢弃之前的最佳链,自己成为最佳链。在区块链的顶端,不断来回地选择、丢弃、收敛,这称之为“选择最佳链”。举一个简单例子,如果在同一高度,同时有10个矿工广播了10个区块,每个区块中有100笔交易,那么只有一个区块会被在最佳链上延长,其余9个区块将被丢弃,被丢弃的900笔交易将陆续在后面的区块中被打包确认。是的,如果这10个区块能够被同时确认,那么处理性能将提升10倍。
选择最佳链还会带来另一个重要的安全性问题:51%算力攻击。如前所述,在算力上拥有控制力的矿工,事实上可以人为操纵“最佳链”的选择,用自己精心构造的区块覆盖掉之前的区块。如何防止51%算力攻击,提高区块链的安全性,也成为比特币的一个热门话题。
3. Block-DAG解决方案
Block-DAG就是采用有向无环图(DAG)来组织区块,有向无环图指的是一个无回路的有向图。如果有一个非有向无环图,且A点出发向B经C可回到A,形成一个环。将从C到A的边方向改为从A到C,则变成有向无环图。换句话来说,就是Block-DAG采用“图”,而非“链”的方式来组织区块,这样,就从根本上避免了比特币的“最佳链切换”的性能和安全性问题。用一句话来简单形像地描述Block-DAG与传统比特币的区别就是,“比特币的区块处理是单核单线程,而Block-DAG是多核多线程”。
基于Block-DAG的区块链,不再是单一的链式结构,整个区块呈网状结构,如下图所示:
我们知道,在区块链中,区块都是由低向高不断延伸的,在Block-DAG中,如果一个区块,在其后没有新的区块延伸,即其处理“顶端”位置,这样的区块,被称为“Tip”。从每个Tip出发,都可以单向追溯到创世块。Tip将被新的区块所引用,一个新区块可以同时引用多个Tip,结合上图,我们来看看Block-DAG的区块是如何延伸的:
Step1:在最开始的时候,整个区块链只有创世块一个区块,即只有1个Tip,假设有4个矿工同时挖矿,在同一个Tip上向后延伸了4个区块。
Step2: 我们假设因为挖矿速度和网络传输原因,矿工甲和矿工乙收到了,矿工丙有,矿工丁只有自己挖出的,这样,他们分别以、、为Tip继续挖矿。是的,他们无需继续等待所有节点区块一致,或者在中切换选择最佳链。
Step3:以为Tip分为三组:、、,产生了新的区块,矿工们又以它们为Tip,继续挖矿,以此类推。
在Block-DAG的区块中,一个Tip被下一个区块引用后,称为“父边”,类似于比特币中的“父块”的概念,“边”是DAG算法的概念,这里不做进一步阐述。正如你所看到的,基于各种不可预料的因素,不是每一个Tip都有机会成为“父边”而继续向后延伸,对于这种区块,在Darma Cash中,将被视为孤块丢弃掉。
另一个值得注意的问题是,当一个新的区块出现时,最多允许它引用多少个Tip?考虑最极端的情况,如果允许新块引用所有它能看见的Tip,那么意味着相同高度将会有更多的并行区块,这将带来最高的交易处理性能,但是副作用也非常明显:如果矿工足够多,区块将无限膨胀。所以,在允许新块引用Tip的最大数量方面,需要一个折衷的权衡,目前,Darma Cash允许新块引用的最大Tip数量是3个。
4. Block-DAG的排序
对于Block-DAG的区块排序,不是必须的,但是在绝大多数应用场景下,排序都显得非常重要。这是因为在交易之间,大多数时候都存在着某种基于顺序的关联性,最典型的代表是智能合约:一个交易中某个条件的发生,以另一个交易中某个条件的执行结果为基础。所以,Darma Cash需要在图状的区块中,根据算法“计算”出一条“逻辑顺序”的链出来。这样做为两个目的:
n 决定交易的顺序性,满足上层业务的需要;
n 孤块将被丢弃;
这个逻辑顺序与传统比特币的链式结构非常相似,但也有本质的区别:比特币是通过“父块的Hash”来实现这种顺序性,而“逻辑顺序”只是一种逻辑概念,区块间并不存在这种物理联系。
排序后的区块集合,被称为“full order”,每一个在full order中的区块,都拥有一个唯一递增的拓朴高度(Topo height),这也是为什么在块浏览器上,可以看到每一个区块同时拥有两个高度,blockheight和topo height。前者是区块在链上的高度,它总是在其最大的tip的block height基础上加1,以保证链高度不停地递增。同一个block height下面,可能会有多个矿工同时挖出的块。
针对Block-DAG的排序,有多个项目或团队提出了各自的解决方案,这些方案各有优缺点,我们来看Darma Cash是怎么实现的:
Step 1:收到矿工广播新块,进行合法性检查,例如双花检测,交易有效性检查,PoW校验,PoS签名检查等等,检查合格的区块,将会被放入区块集合。
Step 2:根据共识算法,找到本次排序的起点,假设为Base,最初Base就是创世块,随着区块链的延伸,它也会跟着延伸。被选做Base的区块是已经稳定的区块,其在full order中的顺序不会再因为排序而改变。
Step 3:从Base开始,其后的所有区块的交易暂时标记为无效。
Step 4: 获取当前最新的Tip的集合,最新加入的区块也在这个集合中,根据共识算法选择一个最佳的区块,称为Best。Darma Cash采用了“累计难度和”来决定最佳Tip的选取,所谓累积难度和,就是从创世块开始,到当前块的所有经过的区块的难度和。
Step 5:从Best出发,不断地向前递归追溯其Tip,最终取得[Base,Best]区间内的所有可到达的区块,根据它们各自的累积难度进行排序,得到最终排序后的区块集合。很明显,集合中的其它Tip,并不在[Base,Best]之中(因为它们也是顶点,且区块间不存在环路),将被临时抛弃,甚至它们递归向前的父边,如果没有再被另外的区块引用,也会被同时抛弃。临时抛弃是Block-DAG的正常收敛过程,将在后文进一步阐述。
Step 6:根据排序后的区块顺序,重新应用该区间内所有区块的交易,重复的交易,将被标注为无效。
如上图,候选的Tip集合为,假设J是最优的(即Best),A为Base起点,那么在[A,J]之间的所有区块将被选中排序,而将会被临时抛弃。
在Block-DAG的排序过程中,有两点是值得特别注意的:
a、在Block-DAG末端,总是存在一组待收敛排序的区块,它们是不稳定的,称之为“不稳定”,因为区块可能被丢弃掉,那么交易也是不可靠的,这与比特币的未确认区块非常相似。在Darma Cash中,可以通过getinfo接口获取当前的“稳定高度”,即可以区分稳定和不稳定的区块。
b、在谈到“临时抛弃”的时候,假设当前链有10个候选的Tip,仅选择了其中1个区块,剩下的9个会不会被永远地丢弃掉呢?答案是不一定,或者说绝大多数时候不会。这是因为下一个新的区块,在选择“父边”的时候,会根据共识算法选择它们中最优的几个(当前允许最多选择3个),这样,当下一个新的区块被选择为Best时,它们就自然有效了,因为这些区块属于[Base,Best]区间内向前追溯可到达的区块。依次类推,区块在不停地向后延伸,不停地收敛和排序,绝大多数区块都将被视为有效。如上例,一旦有新的块L产生,引用了,那么从L向前追溯,所有的区块都将有效。
5. 后记
Block-DAG是一种优秀的链上扩容解决方案,它有效地解决了比特币交易处理能力低下的问题。Darma Cash的Block-DAG技术,与其它类似闪电网络的链下扩容方案是不冲突且有效互补的,结合其它扩容技术,Darma Cash的交易处理能力还将进一步大幅提升。同时,Darma Cash快速简单的区块收敛排序算法也会下一步的智能合约应用打下了坚实的基础。
我们感谢门罗在匿名技术上做出的杰出贡献和探索,结合门罗的匿名框架+Block-DAG+WASM智能合约+二层私有SDWAN,Darma Cash必将在众多的匿名区块链项目中脱颖而出创造自己的全新的非传统区块链的生态体系。
微信掃描關注公眾號,及時掌握新動向
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表比特範的觀點或立場
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表比特範的觀點或立場