物联网区块链共识机制漫谈之一,DAG算法优缺点浅析
相关评论
来源:
作者:
发布时间:2018-03-11 10:06

  共识机制一直是区块链领域最值得争议的话题之一。从最初的PoW到近期的PoS,到未来的DPoS,每种架构和理论所带来性能、特点与优劣势各自非常明显。而近一段时间IOTA提出的DAG理论及其各种变型也充斥在社区上被大家讨论。在这里笔者阐述一下自己的看法,片面之处也请业界专家指正。

6_副本.jpg

  区块链即分布式多活数据库,这是笔者一直以来对区块链本质的理解。抛开账本即事务日志的存储模块,其所谓的“共识”机制从本质上来说与分布式数据库中“一致性算法”有异曲同工之处。

  纵观数据库历史的发展,IBM DB2 for z/OS与Oracle RAC是Share Disk架构中的鼻祖,其核心理念在于多个服务实例共享存储,而在服务之间通过高速网络连接以实现共享锁与共享内存(RDMA等)。这种架构一般被用来实现高可用(HA),但是对于异地灾备环境来说,业界的普遍做法是采用主从日志复制(Log Shipping)的方式进行。

  在传统Log Shipping机制中,集群中存在一个可读写的主数据节点,与一个或多个只读的从节点(开始时从节点只是冷备,后来2008年前后业界才提出在业务层面牺牲强一致的理念,做到备节点只读)。因此可以看出,数据库发展到今天,其灾备架构中一般来说存在一个相对持久的主节点进行交易日志生成,之后通过网络将该节点生成的交易日志发送给其他备节点进行回访,从而达到主备节点之间数据最终一致的目标。

5_副本.jpg

  而这种机制与区块链的“出块”何其相似。可以说区块链数据同步的本质就是Log Shipping,唯一不同的地方在于每次出块的过程中需要进行多节点间竞争,只有获胜的节点才获得记账权(也就是发送事务日志的权利)。这部分与传统数据库永远由主节点发送日志不同,区块链的第一个开源实现比特币,其十分钟出块的设计思路使得集群中的主节点每十分钟改变一次,从而避免了任何“主从”概念,做到全节点对等。

4_副本.jpg

  而另一个与数据库事务日志不同之处则在于,区块链的节点间数据同步采用定时检查点的理念,而非以事务提交回滚为检查点。这里定义,检查点即数据从内存真实落入磁盘的过程。只有数据从非永久存储的内存写入永久存储介质后,才认为该数据被永久保存。数据库一般在提交回滚操作时会触发一个日志缓存刷盘的过程,通过DIO的方式将日志写入磁盘。而比特币则只有每次出块时,才会将数据块作为日志永久结构写入链条并发送给其他节点进行持久化存储。从本质上讲,两者之间没有任何区别。

3_副本.jpg

  因此可以看到,区块链的出块、同步、以及回放机制都是一种检查点同步的过程,而该过程不论从PoW、PoS、甚至DPoS来看都是一种同步操作。因此,我们可以认为,区块链的链式结构中,使用账本同步机制实现的共识算法为检查点式同步持久化策略。

  而IOTA则提出DAG模式,以及近期依据DAG思路所提出的一系列变种,则采用异步持久化策略。

  从数据结构体系来看,DAG模式是一种典型的谣言传播算法,那么不论IOTA的DAG白皮书中写到的一大堆数学公式再如何精妙,也无法改变谣言传播算法的本质,即异步通讯。

  异步通讯所带来最大的问题在于一致性不可控。就好像微服务架构中最让开发者头痛的在于各个微服务之间一致性与先后顺序控制的逻辑,远比传统开发模式复杂许多。在DAG模型中所带来最大的问题在于交易确认时间完全未知。当然,某种程度上同样可以认为在链式模型中,一个区块被超过2/3以上节点数接受才算全网最终确认,因此最终确认时间同样无法准确判断,但是IOTA的DAG所面对的是数以亿计的海量小型设备节点,与全球万级别的账本节点所需要的通讯确认时长要高出很多。

  另一个DAG一直宣称的利用全部节点带宽所带来的优势,实际上会被网络中成几何级数增长的通讯量所迅速湮灭。为什么这么说?

  试想链式结构中仅仅账本节点记账,大量的钱包节点仅仅向一个账本节点通讯即可,因此全网络账本节点的数量远远小于钱包节点。在这种情况下,所有的数据同步均在账本节点之间完成,假设网络中有M个账本节点,每一条记录在网络中传输的次数为M+1(即钱包向一个账本发送数据,同时账本节点将数据转发给其他账本节点)。

2_副本.jpg