来源: NSDI2019
作者: Jiaping Wang, Hao Wang
文章介绍及下载链接:
https://www.usenix.org/conference/nsdi19/presentation/wang-jiaping
背景介绍
1
自比特币诞生以来,区块链技术得到快速发展。但区块链世界的突破性建设,受限于一个著名的理论:“不可能三角理论”,即安全性、去中心化和高效三者不可兼得。
图 1 区块链“不可能三角”
高效:具体落实到技术指标,性能包含两个方面,一个是众所周知的吞吐量,即最高每秒处理多少笔交易 (TPS),而另一个是全网表达账簿状态的总有效内存总量。前者是速度,后者是容量。
安全:区块链系统必须是安全的,这一点是不容妥协的,否则所有其他特性将毫无意义。具体落实到技术指标,就是在系统中构造一系列非法区块并得到全网认可的代价。这个代价就PoW共识机制而言,就是实施攻击的最小挖矿算力。
去中心化:共识机制的一种实现方式,无须依赖某个机构来进行记账。区块链网络中全节点能够在不信任其他节点的情况下,独立验证交易,重建账簿状态,而不是像中心结构那样,需要依赖于信任特定的节点(或服务器),这是区块链本质之一。
比特币牺牲高效来满足安全和去中心化,共识算法采用PoW,人人可以参与挖矿来确保去中心化,但从高效角度来看,比特币的低交易量难以满足人们当前需要。
王嘉平、汪浩博士的Monoxide模型论文入选计算机网络系统领域的国际顶会NSDI,文章中提出了名为异步共识组 Monoxide的区块链扩容方案,可以在由4.8万个全球节点组成的测试环境中,实现比比特币网络高出1000倍的每秒事务处理量,以及1000倍的状态内存容量,有望打破“不可能三角”这个长期困扰区块链性能的瓶颈。
相关技术
2
分片:由于单一的、整体式的区块链系统,交易处理速度慢、吞吐量低,因此可考虑将单一系统分割成一定程度上独立的N个分片子系统,以提升整个系统的交易处理速度与吞吐量。
异步共识组:将单一的区块链网络及账本分割成N个形式上独立的共识组,每个共识组拥有独立的账本(链)、P2P网络,分组K的区块只在网络K中进行Gossip广播,各个分组的行为与动作是异步执行的,可以认为每个共识组就是一个分片。
原子操作:区块链系统,每一个交易都是一个原子操作。在单链系统中,就好比单线程,这个原子操作并没有被强调,因为交易本来就是被一个一个地确认和处理,系统无需做任何额外的事情,原子性就自然有保障。
挖矿: 1)“挖矿”的过程是运行特定的计算公式,试图计算出符合特定规则的Hash值的一个过程;2)“挖矿”的本质是:生成最新区块,挂载到区块链的末端;其本质也可以理解为:争夺账本的记账权。
DHT:全称叫分布式哈希表(Distributed Hash Table),是一种分布式存储方法,一类可由键值来唯一标示的信息按照某种约定/协议被分散地存储在多个节点上,这样也可以有效地避免“中央集权式”的服务器(比如:tracker)的单一故障而带来的整个网络瘫痪。DHT的技术/算法常见的有:Chord, Pastry, Kademlia等。
系统设计
3
图 2 Monoxide总体架构图
总体来说,Monoxide的设计并不复杂:在能满足上述三角特性的前提下,尽量不引入额外的实体,不引入额外的机制,并尽量少修改现有的机制。Monoxide网络是一个并发的多链系统,每一个链我们称之为"共识组"。每个共识组其组成部分和现在单链系统完全一致,有自己的账簿状态、区块的链条、未确认交易的集合、同步区块数据和交易数据的广播网络以及一堆全节点(包括矿工)。各个共识组之间完全对等,无主次之分,除此之外这个网络就没有任何其他的角色了,没有之前那些方案提出的母链,根链之类的,也没有任何掌控全局的调度节点或验证节点。引入这些实体会使得一些功能更容易实现(例如动态负载平衡),但是他们会牺牲去中心化特性,甚至还可能导致严重的性能瓶颈。
全网所有共识组用一个整数编号 (0到n-1),我们限定共识组的总个数为2的k次幂,即n=2^k。任何一个账簿地址,根据其地址二进制数据的前k个比特,永久地被分配在一个共识组中。每个交易则根据交易的验证方的地址 (例如转账交易的支付方),被分配在验证方所属的共识组。所以Monoxide网络的划分不需要任何中心化的机制来分配地址和交易。
图 3 Monoxide分片示意图
为了处理跨分组交易,Monoxide引入了接力交易(或称之为中继交易):分组A的Alice给分组B的Bob转了X个币,则可先在分组A的区块Y中打包这笔交易,并执行Alice(-X)。接着生成接力交易,包含完备的转账信息,比如区块Y的头部信息,及交易Merkle Tree Path,并将接力交易发送到分组B,分组B的矿工最终(虽然会延迟)会验证接力交易的合法性,并记录到分组B的区块中、执行Bob(+X)。通过将1笔交易转换为2笔交易的方式完成跨组交易,Monoxide称之为交易的「最终原子性」。由于收款方共识组的全节点需要验证接力交易的合法性,因此需要持续接收并存储支付方分组的所有区块头部数据。每笔交易最多可跨越2个分组,随着系统生态的繁荣、分组数量的增大,不跨分组的交易占比逐渐趋零,因此由N个分组构成的系统,和不分组的单一系统相比,全账本数据量增长到约2N倍,交易吞吐量与TPS提高到约N/2倍。
图 4 中继交易示意图
Monoxide全网由各个共识组的出块过程和未确认交易集合完全独立,共识组之间完全并行、异步且无需锁定和同步,即使某一个共识组发生拥塞也不会干扰其他共识组的吞吐和出块。
Monoxide全网由各个共识组的独立广播子网所构成,但这些广播子网互相不重叠,互相不打搅。在我们的设计中,这些广播子网由DHT的Swarm实现,每一个广播子网对应一个Swarm。新启动的全节点根据其想要加入的共识组编号直接计算Swarm地址,然后利用DHT的路由机制找到同一共识组里面的其他全节点,并尝试连接并入网。全节点可以随机选择加入任意一个或多个共识组,或由上层应用来决定。例如,钱包节点通常会加入登录用户的钱包地址所在的共识组,以便实时获取其账户余额等状态。Monoxide全节点不记录任何用户登录状态或用户私钥,以避免以太网全节点之前出现的RPC接口安全隐患。除非其上层应用请求,通常一个共识组的全节点不会主动连接另一个共识组的节点。
同样矿工可以自由选择参与一个或多个共识组,进行挖矿,以期获得每一个共识组中的出块奖励。正常情况下,矿工会优先选择参与当前算力较低的共识组,以获得更高的利润,从而导致各个共识组会收敛到一致的挖矿算力和出块难度。
为了确保分组安全性,Monoxide引入了连弩挖矿:矿工节点可以利用一次成功的挖矿运算,同时为多个分组生产区块,多个分组共享全网算力,而不是各个分组独自占用一份算力,避免算力分散并确保分组安全和全网安全的等价性。对于矿工来说,执行连弩挖矿,更需要存储所有分组的账本,矿工必须确保自己正在扩展的各个分组账本不与其他分组账本的数据发生冲突、各个分组账本数据必须是互相融洽的(比如跨分组的Alice(-X)和Bob(+X)),然后才能根据Nakamoto或GHOST继续进行扩展。因此Monoxide虽然对账本进行了形式上的分片和隔离,但实际上矿工节点仍需获取所有分组账本,并构造「全账本」,对于专业的矿池来说,这并不是问题。专业的矿池为了提高算力利用率,必然会同时接入所有的共识组P2P网络,同时加入所有共识组执行连弩挖矿。
图 5 “连弩挖矿”示意图
连弩挖矿的工作原理:在区块链技术中,一般以Merkle Tree的形式组织多笔交易,但实际上Merkle Tree可被用于组织任何数据条目。在连弩挖矿的设计中,矿工M可以同时生产多个分组的区块,并将这些分组的区块头部用Merkle Tree组织起来,结合Root及其他相关参数进行统一的挖矿计算,一旦找到符合任一分组挖矿难度要求的解,就可以立即将「挖矿结果、Merkle Tree路径、分组区块 」广播到该分组的P2P网络,并继续执行挖矿运算,以求取符合其他分组难度要求的解。不同分组的挖矿难度最终会收敛到同等级别,因为在各个分组区块奖励相同的情况下,算力资源必然优先加入挖矿难度低的分组中执行挖矿以获取最高收益,这必然会抹平不同分组的挖矿难度差异。因此连弩挖矿有很大的概率“不连弩”,或许只找到一个有效解即可同时满足所有分组的挖矿难度要求。
从以上系统设计,我们可以看到Monoxide架构满足区块链三角的情况。
1) 安全:只要各个共识组本身是安全的,Monoxide就会是安全的。交易的安全和正确(例如避免双花)依赖于每个共识组内部的共识算法。Monoxide全网应对女巫攻击(Sybil Attack)也依赖于共识组内部的共识算法本身的抵御能力。就PoW而言,每个共识组的安全,依赖于其内部挖矿算力。所以Monoxide架构的安全保障,核心是要能够抵御算力分散的问题,即全网算力分散到每个共识组之后,每个共识组的算力将是全网的1/n,这时单个共识组的防御壁垒将下降到 51/n %,(即所谓的1%攻击)。这将是一个完全无法接受的值。为了解决这个算力分散的问题,Monoxide引入了连弩挖矿(Chu-ko-nu Mining),使得单个共识组的防御壁垒回升到 51%。
2) 性能:由于各共识组的区块验证、存储和账簿状态更新完全独立,所以这三个方面将获得无代价的无限线性提升。共识组之间唯一需要打交道的地方,就是为了正确处理跨共识组的交易。这使得在数据传输方面,性能提升是有代价的,并且不是无限的。为了高效完成跨共识组交易,Monoxide引入了最终原子性(Eventual Atomicity),使得即使跨共识组交易的比例就算是接近 100%,全网仍旧可以轻松地完成交易吞吐,其性能代价为一个和共识组个数无关的常数。
3) 去中心化:根据上面的描述,Monoxide依旧是一个彻底的permessionless的系统,并且每个共识组内部的全节点的负担始终保持在同维护一个单链系统相当的水平,可以被轻松部署到大部分有互联网接入的角落。
实验展示
4
文章通过以太坊的从开始到块高度5867279的完整历史交易来评估Monoxide系统,其中包括1650万个唯一地址和7580万个交易。我们将系统部署在包含1200个虚拟机的分布式环境中,每个虚拟机具有8个内核和32GB内存。这些计算机均匀分布在15个可用区中,用于测试现实世界中的跨国延迟。在测试网络中,我们将端到端的峰值带宽限制为30Mbps,测量的平均端到端延迟为102.48毫秒。在每个区域中,我们为块大小设置32KB限制,并设置15秒块创建间隔目标,对于一对一令牌传输,产生大约15.6 TPS。在这样的测试平台上,我们在系统中支持48,000个区块链节点。
图 6 Monoxide系统测试TPS变化
实验结果:在这样一张曲线图中,横轴是这些节点被划分成了多少个共识组,纵轴是平均每秒处理的交易量。在测试中,最大的共识组数量为2048,此时吞吐量为11694 TPS。这个数字已经远超现今所有公开发表的运行于互联网上的公链项目,当然那些只在机房里面跑,单节点采用怪兽级服务器的项目除外。
图 7 区域的交易分布情况
上图显示了系统的TPS随着区域数量的增加而变化的情况,可以看到Monoxide系统表现出线性可扩展性。
思考改进
5
1)Monoxide按照账户地址的前k个比特,划分出2^k个分组。而我认为可以有其他更灵活的可选分组方案:让用户自主选择一个共识组,用这个共识组的编号作为前缀修饰自己的地址,比如001.asdfgh,001是分组编号,asdfgh是用户通过公钥计算出的通用地址。整个系统可根据发展情况,逐步增加新的共识组,而不用提前规划好一个固定的共识组数量,这样有利于资源的最大利用。
2)Monoxide可将所用智能合约独立编址,划分到专用的一个或多个特殊共识组中,方便用户与合约之间的交互,既保留UTXO的模型,也保留智能合约来进行交易,能够进一步提高可扩展能力,适用于更多的应用场景。
3)系统共识机制设计得可以更灵活,使其变得可插拔,可以采用PoS、DPoS、PBFT之类的共识,而不采用PoW,并且最好具备状态最终性,而不是概率最终性,这样更有利于设计和实现高效的DAPP。
关于 天 方 夜 “谈”
天方夜谈原意讲不切实际的东西,而这里想要 “脚踏实地”真正弄懂并感受一篇文章的思想。
方班人有自己的浪漫,
我们探讨知识,谈论理想,
采摘科研的繁星,
脚下是星辰大海。
天:代表我们的理想犹如天空般浩荡
方:代表方班
夜:代表代码人的冷静与静谧
谈:代表方班愿与您,就领域内的经典思想和前沿成果“秉烛夜谈”