最近央行动作在数字货币领域动作频频,在2019年下半年,大有加快数字货币研发的趋势,有可能正式推出央行数字货币CBDC。虽然目前还不确定央行数字货币的具体技术架构,但是从央行数字货币研究所前所长姚前,以及谢平等人的观点来看,央行数字货币投放将采用两层结构,即央行将数字货币配发给商业银行或运营机构,由商业银行或运营机构负责公众服务,商业银行和运营机构各自维护自己的账本,央行维护统一的账本。对于商业银行和运营机构的技术选型不做要求,可以采用区块链或分布式账本技术,也可以采用传统账户模型,但是要求性能必须达到30万笔/秒。从目前区块链解决方案,即使采用分片区技术,目前TPS最高也只能达到1万笔/秒,显然很难达到这一指标。
本文将探讨采用相对比较异类的区块链技术架构DAG技术,来探讨达到这一技术指标的可行性。DAG是计算机数据结构中的有向无环图,而传统的区块链技术,可以视为数据结构中的链表,直观来看,图比链表的功能会强大一些。DAG技术是为解决区块链并性性能差而提出的技术,改变了区块链只有一条主链,无法并行计算的缺陷,同时最小单位是交易,直接跳过了交易打包成区块的步骤,另外就是采用Gossip和HashGraph共识算法,极大提高了系统的并发性。DAG区块链最著名的案例是IOTA,其TPS可以达到1万笔/秒,新秀InterValue所称可以达到10万笔/秒,而DAG领域的标杆项目Hedar HashGraph,其TPS可以达到25万笔/秒,这一性能如果在做一些改进,还是非常有希望达到央行数字货币所设定的30万笔/秒的技术门槛的。
下面我们详细讨论一下DAG区块链中HashGraph共识协议。关于HashGraph协议在网上有一些比较好的资料,如http://www.swirlds.com/downloads/SWIRLDS-TR-2016-02.pdf,但是这些资料只是从宏观上描述了一下共识算法的流程,缺少各种实现细节,本文将以此为基础,补充协议的实现细节,使大家可以自己动手实现这个神奇的算法。

系统初始状态

我们假设系统中有四台机器,同时有四个用户,初始时每个用户钱包中将分别有1000、2000、3000、4000的余额,因此我们需要四个发币事件,我们来看第一个发币事件:
在这里插入图片描述

我们以给赵一发1000元币为例,其形成事件1。在系统中,每个事件由timestamp、交易tx、本机父事件、其他机器父事件构成,由于这是系统第一个事件,因此其本机父事件和其他机器父事件均为空,交易采用传统的UTXO格式,由特殊钱包将钱转入到赵一的钱包中,赵一账户的余额就变成了1000元。
重复上述过程,为上图的4个用户充值,形成了如下图所示的初始状态:
在这里插入图片描述
在这种情况下,四台机器上分别记录着这四个用户的余额,我们需要使用HashGraph共识算法,将这些信息同步到所有网络节点中来。

Gossip协议

Gossip协议是指网络中所有节点,随机的向其他节点发送消息,接收到信息的节点,通过产生新的事件,使自己与其他节点的信息保持同步。
我们假设华南给华北发消息,因为华西从来没给华北发过消息,所以华西知道事件2是华北所不知道的,因些将事件2的信息发送给华北,华北产生事件5,并更新自己机器上的状态(表格中黄色行):
在这里插入图片描述
如图所示,华西机器将e2发送给华北,如下所示:

{
    “eventId”: e2,
    “timestamp”: t2,
    “txs”: [
        {
            “txId”: x2,
            “vin”: [
                {“acct”: 00000, “amt”: 2000}
            ]
            “vout”: [
                {“acct”: w2, “amt”: 2000}
            ]
        }
    ],
    “hash": "e2_hash",
    “selfParentHash”: “e0_hash”,
    “otherParentHash”: “e0_hash”
}

华北机器收到后,首先执行e2中的交易,此时钱二的余额就会成功变为2000元,其同时生成新的事件e5,如下所示:

{
    “eventId”: e5,
    “timestamp”: t5,
    “txs”: [],
    “selfParentHash”: “e4_hash”,
    “otherParentHash”: “e2_hash”
}

接着华北机器将e4、e2、e5发送给华西机器。华西机器识别出事件e2是已知事件,不做任何处理,先执行事件e4,即向李四发币4000元。然后生成事件e6。如下图所示:
在这里插入图片描述
到此为止,就完成了一次消息的同步操作。接下来,华西机器随机选择向华东机器同步消息,内容为事件6、事件5、事件2、事件4为参数。华东机器接收到消息后,会执行事件2、事件4,同时生成事件7,如下图所示:
在这里插入图片描述
华东机器会给华西机器回复信息,内容包括事件7、事件1、事件6、事件2、事件5、事件4。华西机器识别出事件6、事件2、事件5、事件4已经处理过,不做任何处理,仅执行未见过的事件1,即给赵一发币1000元,并生成事件8,如下所示:
在这里插入图片描述
华西机器收到消息后,识别出事件7、事件6、事件5、事件2、事件4为已处理事件,只需执行事件1,向赵一发币100元,并生成事件8。
假设华南随机向华北发送消息内容为事件3,如下所示:
在这里插入图片描述
华北机器接收到消息后,执行事件3,然后生成事件9,然后向华南机器发送回执信息,内容包括:事件9、事件5、事件2、事件4、事件3,如下所示:
在这里插入图片描述
华南节点接收到消息之后,执行未见过的事件2、4,即向钱二发币2000元,向李四发币4000元。
接下来假设华东节点向华南节点发送消息,内容包括事件[7,1,6,2,5,4],如下所示:
在这里插入图片描述
此时其只需要执行事件1,即向赵一发币1000元。接着华南节点向华东节点发送回执信息,内容包括事件[10, 3, 9, 5, 3, 4],如下所示:
在这里插入图片描述
华东节点发现只需执行事件1,即向赵一发币1000元。
接下来我们假设华东向华西发送消息,内容包括事件[12, 7, 11, 1, 10, 3, 9, 5, 4, 2],如下所示:
在这里插入图片描述
华西节点发现只需执行事件3,即向孙三发币3000元。接下来华西节点向华东节点发送回执信息,内容包括事件[13, 8, 12, 11, 7, 10, 6, 5, 4, 2, 3, 1, 9],如下所示:
在这里插入图片描述
华东节点发现没有未知事件,所以不需要更新。
接下来我们假设华北节点向华南节点发送消息,内容包括事件[],如下所示:
在这里插入图片描述
华南节点发现没有新事件需要执行,接着向华北节点发送回执信息,如下所示:
在这里插入图片描述
华北节点执行新事件1,即向赵一发币1000元。至此系统开始的四个事件,经过节点间Gossip协议的对话机制实现了节点内容的一致,这是HashGraph共识算法最基本概念。
在本节中,我们详细描述了HashGraph共识算法的最基础部分,可以实现节点间信息的同步。在下一节中,我们将探讨HashGraph共识算法的高阶特性,如Round、Witness等。

Logo

为所有Web3兴趣爱好者提供学习成长、分享交流、生态实践、资源工具等服务,作为Anome Land原住民可不断优先享受各种福利,共同打造全球最大的Web3 UGC游戏平台。

更多推荐