下一代共识机制探究——基于DAG的BFT共识

在区块链的语义里,BFT 共识是试图让 N 个验证节点(其中最多存在 f 个拜占庭节点)就一个无限增长的提案(区块或者交易集合)序列达成一致的机制。

众所周知,经典的基于 BFT 的共识算法,无论是 PBFT 还是改进的 HotStuff 通信复杂度都比较高,可扩展性差,且在网络不稳定的情况下延迟很高。

最近几年,随着 DAG 技术在区块链上的广泛应用,一种基于 DAG 的 BFT 共识被提出并不断完善,利用 DAG 的高效实现和其天然的异步通信机制在提升共识的可扩展性、缩短确认时间和提高交易吞吐量方面优势明显。但 DAG 作为异步操作,它不存在一个全局的排序机制,这就很可能出现节点间所存储的数据在运行一段时间以后出现偏差,在这种偏差下,如何就序列最终达成一致是 DAG 共识的关键。

本文将先介绍基础理论:基于 DAG 的 BFT 共识和基于轮的 BFT 共识,然后详细解读 DAGRider 、Tusk 以及 Bullshark 协议。

基于DAG的BFT共识

DAG,英文全称 Directed Acyclic Graph,中文意为有向无环图。

图(graph)由两部分组成:点(vertex)和边(edge),所谓有向无环图,其实就是:有方向的边,这些边在一个图中不会构成一个闭合的环路。

图片

上面是有向树、DAG 图和有向图的示意图,从中可以看出三者之间的区别:

有向树:每个顶点只能指向一个之前的顶点,整个数据有个明显流动方向
DAG 图:每个顶点可以指向多个之前的顶点,整个数据流也有一个明显的方向
有向图:与 DAG 不同的是有向图允许有数据回流,整个结构的数据流向不明显
DAG在共识中的应用

在基于 DAG 的共识中,每个共识消息都包含一个提案(一个区块或者一组交易集合)和一组对以前消息的引用,这里的引用可以理解为:每一条新消息都必须明确地指向若干之前的消息,引用某一条消息即表明对该消息的认可和投票。

对应在 DAG 图中,一个消息是一个顶点,它的引用是一条边,因此,所有共识消息一起形成了一个不断增长的 DAG 图。

基于 DAG 的共识可分为两层:

网络通信层:负责可靠地传播和接收提案、投票消息,并将消息绘制成 DAG 图
零通信开销的定序层:各验证节点在不发送额外消息的前提下,仅通过解析其本地的 DAG 副本独立提取提案的公共顺序,并能保证所有验证节点就提案的串行提交顺序最终达成一致的算法
从消息的产生到消息的最终提交,由于网络的异步特性,不同验证节点上的 DAG 视图在任何时候都可能略有不同,所以如何保证所有验证节点就提交顺序最终达成一致是所有基于 DAG 共识算法的关键和难点。

与传统BFT的比较

经典的基于 BFT 的共识算法,无论是 PBFT 还是改进的 HotStuff 都需要一个 Leader 节点收集交易生成区块,广播并接收来自其他节点的投票,经过三个阶段的交互后(pre-prepare、prepare、commit)最终对区块提交达成一致性共识,协议比较依赖各节点间共识消息的可靠传递。

而基于 DAG 的共识,利用 DAG 图抽象出网络通信层,将消息传播与共识逻辑(提案定序)分离。这种分离带来的好处是,每个节点都可以异步地计算共识状态与提交序列,从而降低延迟与减少通信过程中的网络开销,再加上 DAG 的高效实现,使得基于 DAG 的共识拥有较好的可扩展性和高吞吐量。

基于轮的BFT共识

在基于轮(round)的 DAG 中,每个顶点都与一个整数(round number)相关联。每个验证节点每一轮只广播一条消息,且每条消息至少引用上一轮的 N−f个消息。也就是说,为了推进到第 r 轮,验证节点首先需要在第 r-1 轮中获得 N−f 条来自不同的验证节点的消息。

图片

上图是一个基于轮的 BFT 的示例,图中有4个验证节点,每一轮的每一条消息都引用了上一轮至少3个消息,如果某一轮无法收齐3个消息则无法推进到下一轮。
https://www.bilibili.com/video/BV1gA4y1f7kx
https://www.bilibili.com/video/BV1XW4y1C7yP
https://www.bilibili.com/video/BV1GY4y1x77y
https://www.bilibili.com/video/BV1AU4y117Gx
https://www.bilibili.com/video/BV1yY411K7BB
https://www.bilibili.com/video/BV15v4y1G7nC
https://www.bilibili.com/video/BV1vY411K7Tm

这里有点类似 HotStuff 算法中,每一个区块投票消息都必须携带上一个区块的 parent quorum,因为这样才能保证网络中的大部分节点有序、平衡地推进至下一轮,这也是基于法定人数的 BFT 容错共识的基础。

你可能感兴趣的:(前端,数据库)