本篇论文主要涉及到了中本聪共识(Nakamoto Consensus,NC)、有向无环图(Directed Acyclic Graph, DAG)结构等基础知识,通过将传统NC共识进行改进,由单链形式转变为了网络拓扑结构,且不丢弃任何分叉的区块的对交易进行排序。本篇论文的主旨就是围绕处理并发交易或区块,以及对全部延迟的交易进行排序,其核心思想主要是解决两种问题,一类是交易排序问题,与传统NC共识先确定交易顺序再确定区块顺序不同,该共识协议是先确定区块顺序,再确定交易顺序;第二类是异常交易处理问题,对有冲突或双花的交易,始终只保留前一笔交易。
论文名称 | 作者 / 单位 | 来源 | 年份 | 简要内容 |
---|---|---|---|---|
Scaling Nakamoto Consensus to Thousands of Transactions per Second | Chenxing Li (清华大学) | arXiv | 2018 | 通过改进NC共识的交易排序问题,将吞吐率提升到每秒数千次交易 |
本篇论文提出的系统取名为Conflux,意为汇流。其主要的贡献为:
共识算法简述为普遍应用于像区块链一样的分布式网络当中,使其所有的节点对某个方案达成一致性协议。这里重点讲一下NC共识,以及其他共识。
共识算法 | PoW (工作量证明) | PoS (权益证明) | DPoS (委托权益证明) | PBFT (实用型拜占庭容错共识) | Dumbo-BFT (“小飞象”) | NC-MAX(改进NC共识) |
---|---|---|---|---|---|---|
容错率 | 50% | 50% | 50% | 33% | 33% | 50% |
出块时间 | >500s | <100s | <100s | <10s | ? | 动态 |
吞吐量(TPS) | <10 | <1000 | <1000 | <2000 | <18000 | <2500 |
可扩展性 | 强 | 强 | 强 | 弱 | 中 | 强 |
缺点 | 效率低 | TPS小 | 投票繁琐 | 扩展性差 | ? | ? |
有向无环图(Directed Acyclic Graph, DAG):指一个无闭环且有方向的图。具体内容见另一篇笔记介绍。
本篇论文主要提出了Conflux框架、共识协议和共识算法实现等三个方面。
如图,Conflux框架中主要包含了三个实体,Gossip Network、Transaction Pool和Block Generator。如果需要将一笔交易上传至网络的具体运行过程为:
因此,可以看出Conflux的目标主要是维护每个节点的本地DAG,以便使得所有节点最终对区块和交易的总顺序达成一致。
特别注意:为何J是归纳到H的epoch,而不是E的epoch内呢?是因为论文中提到需要可以通过父边和引用边从主链指向到达的区块或者不包含在以前的epoch中的区块。
以上标黄的四个是非常重要的概念,需要记住,以便理解这个协议是干嘛的。
Conflux协议是DAG图:
G = < B , g , P , E > G= G=<B,g,P,E>
其中,B表示区块集合,g表示创世区块,P表示映射函数,E表示边的集合。以及还有一些函数的定义。
函数 | 功能 |
---|---|
P ( b ) P(b) P(b) | 将区块b映射到它的父块 |
C h a i n ( G , b ) Chain(G, b) Chain(G,b) | 从创世区块到区块b的主链 |
C h i l d ( G , b ) Child(G, b) Child(G,b) | 区块b所有子块的集合,且包含b本身 |
S i b i l i n g ( G , b ) Sibiling(G, b) Sibiling(G,b) | 区块b的同级块,即除区块b之外的 C h i l d ( ) Child() Child() |
S u b t r e e ( G , b ) Subtree(G, b) Subtree(G,b) | 区块b的子树,且包含区块b本身 |
B e f o r e ( G , b ) Before(G, b) Before(G,b) | 区块b指向的区块,包含父边和引用边 |
P a s t ( G , b ) Past(G, b) Past(G,b) | 区块b之前所有区块的集合,包含b本身 |
T o t a l O r d e r ( G , ) TotalOrder(G,) TotalOrder(G,) | DAG图G里所有区块的排序 |
下面将具体介绍下三个主要的功能函数,包括 P i v o t ( ) Pivot() Pivot()算法、主循环共识操作和 C o n f l u x O r d e r ( ) ConfluxOrder() ConfluxOrder()算法。
如下面伪代码所示,实线的功能为选择拥有子树区块最多的那条链,然后通过迭代,直到计算到叶子节点。
例如,如何计算 P i v o t ( G , g ) Pivot(G, g) Pivot(G,g)呢?首先计算 g g g的子块有A和B,而A的子树区块总数为A、C、D、E、H、G共6个,而B的子树区块只有B、F、J、I、K共5个,所以选择A,继续比较A的子树D、G、C,C被返回,以此比较下去,直至返回H。
主要是处理更新DAG状态和生成新区块两类事件,前半部分,节点收到更新信息后更新本地的DAG图,并将本地G广播给其他节点。后半部分在生成新区块后计算主链的最后一个区块 a a a,然后将创建新区块 b b b到当前所有还没有入边区块t的边,然后添加新区快 b b b到 a a a的父边。
伪代码中有一个小错误,这里应该是半角字符a,而不是 a a a,虽然这不影响整体,但是提一下,便于理解。
该算法是从后往前递归的,先找到 a a a的父块,再将 a a a的父块epoch内的顺序赋值给L,然后计算 a a a的epoch中所有区块的排序。
例如,如何对H的epoch里的区块G、H、J、I进行排序呢,没有出边的区块有G、J,根据哈希值进行排序,那就把G、J放入L当中,然后剔除这两个区块,对剩下的H、I排序,又因为剔除后,I就没有了出边,且H指向I,所以I排在H的前面,即G、J、I、H,用同样的办法对其他的epoch中区块进行排序。
网络总的区块生成率为 λ \lambda λ,则有
λ = λ h + λ a , λ a = q λ h , 0 ≤ q < 1 \lambda=\lambda_h+\lambda_a,\lambda_a=q\lambda_h,0\leq q<1 λ=λh+λa,λa=qλh,0≤q<1
其中, λ a \lambda_a λa表示攻击节点的区块生成率, λ h \lambda_h λh表示诚实节点的区块生成率,这是比较合理的假设。
假设网络为所有节点提供d-同步通信。即在时间t内,诚实节点通过广播一个区块或交易,则在t+d之前,所有诚实节点都会收到这个区块,并将其添加到自身的本地状态。
假设攻击者的能力有两个限制,即
可以从上面的比例关系看出,始终 λ h > λ a \lambda_h>\lambda_a λh>λa,这也是比较合理的假设。
∑ k = 0 n − m ξ k q n − m − k + 1 + ∑ k = n − m + 1 ∞ ξ k , 其 中 ξ k = e − q λ h t ( q λ h t ) k k ! \sum_{k=0}^{n-m}\xi_kq^{n-m-k+1}+\sum_{k=n-m+1}^{\infty}\xi_k, 其中\xi_k=e^{-q\lambda_ht}\frac{(q\lambda_ht)^k}{k!} k=0∑n−mξkqn−m−k+1+k=n−m+1∑∞ξk,其中ξk=e−qλhtk!(qλht)k
其中n为在[t-d]之前b的子树数量,m为 a a a的子树数量。
本篇论文分别对Conflux的吞吐量、确认时间和可扩展性做了定量分析。
实验环境:400台8核Amazon EC2虚拟机,每台模拟25个全节点,共运行1w个节点。
影响吞吐量的三个影响因素:区块大小限制、区块生成速率和区块利用率。
实验环境:假设攻击者控制的网络区块生成率小于20%(则诚实节点控制的区块生成率为大于80%,即 q < 0.25 q<0.25 q<0.25)
影响区块的确认时间:节点必须等待一段时间以获得较高的置信度,即块的总顺序不会变。
实验条件:1)改变全节点的数量,从2.5k扩展到2w;2)改变带宽,从20Mbps扩展到40Mbps。
通过改变全节点的数量和改变带宽来进行仿真实验,可以得出节点数量与确认时间,与广播给99%的节点的延迟时间关系图。
回顾下全文,可将论文划分为三个重点。
欢迎大家看完后,有兴趣的朋友可以在评论区一起讨论,一起交流,一起学习。