纳尔图(Nerthus)基于DAG技术的区块链编程平台
Nerthus 是一个基于 DAG 技术的通用的区块链编程平台,一个去中心化分布式区块链操作系统。Nerthus 内置图灵完备的编程语言,用户可以用之来建构和定义他自己的各种特性,可以开发自己的应用与区块链系统,可以发行自己的货币。
背景
DAG,英文全称是 Directed Acyclic Graph(有向无环图)。在图论中,如果一个有向图无法从某个顶点出发经过若干条边回到该点,这个图则叫有向无环图。下图便是一个典型的有向无环图。圆代表顶点,线叫边,代表顶点与顶点之间的关系。
DAG 结构由 IOTA 团队率先使用,之后 Byteball 借鉴 IOTA 的 DAG 结构,并加以改进。在 IOTA 中,要验证新的交易前,必须直接验证之前的两个交易,这也使得在这两个交易之前所有被验证过的交易得到间接验证。在 DAG 中,顶点代表交易,带箭头的线代表交易的验证关系。在 IOTA 中,有一个权重积分的概念,所谓权重积分是指它自身的权重与它验证过的所有交易的自身权重之和。在DAG 结构中,交易总是自己创建并发布。从理论上看,攻击者总是可以建构比它要推翻掉的那个交易权重更高的交易用以双花。Byteball 在 IOTA 的基础上,做了改进,引入主链与见证人概念,并鼓励验证多个父辈交易单元。但是它在每个交易单元都有一个见证人列表,除了会造成单元数据变大之外,还会在恶意攻击者尝试双花时,故意发布不同见证人列表的双花单元引起混乱。同时他的确认机制是沿着一条 MC 前行的,一路遇到多少见证人,这都将增加交易证验的复杂度与不确定性。虽然交易最终会达到一个稳定的确定性,但是交易确认的时间是不确定的。NERTHUS 在 Byteball 的基础上,做了进一步的改进——维护用户级别的见证人列表。并受 DPOS 机制的启发,交易单元一旦发布且经所有见证人共同签署的见证单元验证后,该交易单元就是最终确认的。具体情况,将在后面详细介绍。
单元
Nerthus 底层数据结构采用的不是像比特币、以太坊那种传统的链式结构模式。而是采用一种 DAG(有向无环图)结构模式。
上图是 DAG 的结构模型,圆表示顶点,线条表示顶点与顶点的关系,箭头表示从子单元到父辈单元的方向,G 是创世单元,每个单元,通过其箭头所指的父辈单元,一直追溯,可达创世单元。对应于 Nerthus,圆表示一个单元。Nerthus中的单元包含引用之前一个和多个单元作为其的父辈单元,以此建立单元次序。单元可以包含多条不同类型的数据,如支付,文本消息,智能合约等等。
DAG 中的每个新单元,验证并确认其父辈单元,父辈单元的父辈单元,可达创世单元,并将其父辈单元的哈希包含到自己的单元里面。如果有人篡改数据,其单元的哈希必将改变,那就会使得它与直接或间接验证确认它的子单元中引用它的哈希不一致。如果要成功篡改单元数据,需要与它的所有的子单元合作,子单元修改它引用的 Hash,这又会导致子单元的 Hash 发生改变,那么子单元又要与子单元的所有子单元合作,直到最后的子单元。所以,如果一个单元被广播到网络中,被其它单元验证确认并建构在其上后,篡改数据需要协调的人数便会呈指数级增长。传统的单线链式结构,理论上它们要修改数据,只需和后面几个区块达成一致,就可以达到篡改数据的目的(51%攻击,通过算力快速产生几个区块,这些区块都是自己控制的,相互合作,就可以篡改数据了)。DAG 这个模式相比来说,篡改数据的复杂度更高,更难以篡改。
双花与地址顺序单元系列链
在去中心化系统里面,有效防止双花,是必要条件,更是基础。如果不能有效防止双花,整个系统就不成立了。DAG 通过下面协议规则解决双花问题。
1、 一个单元不能引用它的其它父单元直接或间接引用过的单元做父单元。
2、 一个地址如果创建发布超过一个单元,后发布的单元必须直接或间接地包含引用其之前发布的所有单元,形成这个地址的顺序单元系列。
3、 如果一个地址发布的单元,违反规则二,发布一个或多个,没有顺序引用关系的单元或单元系列,都会视为双花,不论是否存在实质性双花行为。
4、 在遵守规则二的情况下,出现双花问题,顺序单元系列里,发布较早的有效,发布晚的无效。如果不遵守规则二,发布多个非顺序引用关系的单元或单元系列,根据最优顺序单元系列算法,只有一个单元或顺序单元系列有效,其余单元或顺序单元系列无效。
5、 如果一个地址的单元间接或直接包含引用两个或以上的自己发布的没有顺序的单元,该单元无效,不论是否存在实质性双花行为。
图二中,橙色实心圆点代表了是同一个地址所发布的所有单元。后面的直接或间接地包含前面的单元,形成一个有序的单元序列。
中国观察