Zilliqa是一个好像始终没什么名气的专案。这几天抽空读完了它的技术白皮书,看看版本号其实已经是一年前的产物了,但里面有许多的想法我觉得非常有趣,就来跟大家简介一下Zilliqa的运行逻辑。
简介
Zilliqa是主打使用Sharding技术增加吞吐量的智能合约平台。这里先简单列出Zilliqa的一些特别之处,后面我们再来一一介绍。
-
Sharding技术的实践
Zilliqa最引以为傲的就是他们Sharding(分片)的技术,而且这是从他们专案一开始,就着手对现有区块链扩容议题提出的解法以及努力的方向。当然,Sharding最后变得耳熟能详是因为以太坊的采用,但依然到今天没有实践完成。Zilliqa有没有机会在一月主链上线后成为第一个成功使用sharding的区块链呢?感觉是有的。 -
特殊的智能合约语言(Smart Contract Language)设计
大家都知道以太坊的智能合约语言Solidity是当今最红的Dapp语言,Zilliqa想要提出自己的智能合约语言:Scilla,则是主打着「平行化」运算的旗帜,透过所谓的「Computational Sharding」来让智能合约的运算上也可以达到平行化。 -
结合PoW以及PBFT的共识演算法
虽说现在流行PoS才是趋势,但是Zilliqa选择使用PoW以及PBFT加在一起结合成一个特别共识演算法。PBFT以往最大的缺点在于节点不能动态加入,因此不试用于去中心化系统当中。Zilliqa透过PoW来控管节点数量、达成节点排序,并透过PBFT来快速进行交易的验证以及共识,个人觉得是非常有创意的解法。
接着我们再看到Zilliqa比较中心的设计部份,一起来看看上述这些想法如何真正实现在公有链上。
System Settings
要了解Zilliqa,我们要先了解整个体系中的角色扮演。传统的区块链中,以Ethereum为例,只会有一条链,链上每个区块都纪录了数笔交易,十分的单纯。而整个制造区块链的工作都交给同一个角色— 矿工 (miners)来完成。
在Zilliqa中则稍有不同,整个生态系中大概可以分成两群节点:DS Committee以及Shard Members。在了解他们各自的工作之前,我们要先简介一下Sharding。
Network Sharding
Network Sharding是一个很好理解的概念,简单的说就是把一个大网路分成很多不同的子网路(sub-network),每个子网路就被称为一个Shard。不同的交易会被分配到不同的shard中进行运算及验证,透过这样的方法达到「平行化」的目的。
DS Committee
在Zilliqa的实践方法中,最重要的一群角色就是DS Committee,全名为Directory Service Committee,可以想像是网路中主导共识过程的「委员会」。这个委员会会有一个Leader (会长),负责提案所有要投票的内容,其他的成员就只负责认证并签章。
这个DS Committee将会动态的分配整个网路成若干个shards,并且指定不同节点至不同的shard中成为shard members。每一个shard就好像是一个小的委员会,同样是透过一个leader带领的方式进行PBFT共识。理想状况下一个shard会有约800个节点。这个数量可以使得恶意节点控制某个shard的机率降至足够低,并且维持高效能。每个shard会各自处理网路上一部分的交易,并且产生一个交易区块(称为Micro Blocks)。这些交易区块(Micro Blocks)在各个shard中获取足够的签名后,会被提交回到DS Committee中,最后在由DS Committee产生一个Final Block。这就是Zilliqa将网路分片的大致作法,我们将在后面对其细节做更多说明。
Data Layer & Network Layer
在Zilliqa中,区块被分为两大类:DS blocks以及Tx Blocks,而且分别形成两条不同的链:DS Blockchain以及Tx Blockchain。
DS Blocks
DS-Block contains metadata about the miners who participated in the consensus protocol.
DS Blocks的全名为Directory Service Blocks,作用是决定DS Committee。前面有稍微提过,Zilliqa的共识机制是PoW与PBFT的结合,进一步的说,Zilliqa是先透过一个PoW个过程,选择出好的DS Committee成员,接着再直接在这个DS-Committee中快速的透过PBFT进行交易的验证以及交易区块的撰写。
在一条公有链当中,大家都想要当这个Committee的一员,因为有权撰写区块并领取奖励,因此就必须采用PoW的方式来竞争,也借此防止女巫攻击。Zilliqa的设计是让最快挖到下一个DS-Block的miner加入DS-Committee,并且成为下一个DS-epoch (也就是持续到下一个DS-Bloc出现)最初的Leader。Leader可以算是整个共识过程中最重要的角色,在这段期间内所有有效的blocks (包含Tx Final Blocks以及下一个DS-block)都是由Leader产生。在加入了一位新成员后,为了维持委员会中委员数量恒定,最老的一个成员就必须离开。
也就是说,DS blocks纪录了DS-committee中成员的加入与退出。在Zilliqa的设计当中,每一个DS-block 都非常的简单,只有几个属性:
其中,Leader Public Key就是当前的Committee Leader,miner就是挖到这个DS-Block的人,也就是下一个DS-Block中的Leader。整个DS-Block除了Signature以外的部份和称为Header。
DS Blockchain
在一个DS miner成功找到PoW解答(nonce)后,会把这个答案交给DS-Committee中的Leader,由Leader确认无误后会组成这个 header,然后交给委员会中的其他成员验证及签名,超过2/3的成员Multisig的结果,就是DS-Block的Signature部份。这样就完成了一个DS-Block的交接,这个新的DS Block就会被接到DS Blockchain上,DS-Committee就被更新了,DS miner将成为新的leader接管网路。
TX Blocks
TX-Blocks stores information on which transactions were agreed upon by the nodes in a DS-Block.
再来就要说到Transaction Blocks。如同我们上面所说,TX-Blocks是我们比较熟悉的一种类型,其内容跟Ethereum的区块很像,纪录了BlockNumber、GasUsed、transactionRoot等等东西。一个TX-Block除了header跟Signature之外,还含有Data的部份,纪录了转帐以及智能合约呼叫等等关键讯息。而TX Blocks又可以分为两种:由各个Shard产生的Micro Block以及DS Committee决定的Final Block。
Micro Blocks
如同前面所说,Micro Block是由各个Shard Leader所产生。这些Micro Blocks不会真实被连接到任何一个区块链上,他们只是用来提交给DS Committee制造Final Blocks的小零件而已。Micro Blocks在实做广播时,会以type = 0x00标示。
Final Blocks: TX Blockchain
我们在 Zilliqa Explorer上可以查询到的TX-Blocks都属于Final Blocks。如下图所示,每个Final Block都会有一个 DS Block Number,表示了这个Block是在第几个DS-Epoch被产出,一个DS Block则可以连结到多个Final Blocks。
Explorer里有一项Number of Micro Blocks,代表了这个Final Block是由几个Micro Blocks组成。每一个Final Block从一个shard中最多只能拿一个Micro Block,并且会连结到上一个Final Block之后,形成TX Blockchain,并以type = 0x01标示该区块。
Consensus Layer
如果对于PBFT共识机制不太了解的话,可以看一下这篇文章的介绍,作者在文中将PBFR介绍地相当清楚。PBFT需要一个领导加上一群选定的节点进行PrePrepare-> Prepare-> Commit三阶段的沟通。不同于PoW,PBFT比较像是现代POS系列投票表决形成共识的演算法。由于不需要每一个区块都由所有矿工进行PoW竞争,这种轮流方式可以大幅提升出块速度,并且减少能源的耗损。
但PBFT最大的问题在于无法支持节点的动态加入,因此通常只在联盟链中被实用。在Zilliqa中,要加入Committee或是成为shard member以进行PBFT,就要透过PoW当作一个门槛。这可以防止有人以不同身份大量冒充节点进入网路,也透过奖励机制鼓励这些节点正常运作。个人认为是Zilliqa整个项目中最巧妙的设计之一。
一个节点若想要加入网路,可以选择挖一个DS Block来加入DS Committee (PoW1),或是在每一个DS Epoch开始的时候,试着去解另一个PoW问题(PoW2)来取得Shard Membership。在加入了Committee或是取得Shard Membership之后,节点就不需要再进行PoW这种高耗能的运算了,只要按照顺序轮流当Leader,准备好合法的区块或帮忙验证就可以了。因此在Tx Blocks当中,不会像以太坊的交易区块有nonce栏位,同时BFT的区块链也不会有分叉的发生,只要交易一被纪录上链即是「确认」。
EC-Schonorr Signature
由于PBFT中需要使用到大量的Multisig(每一轮的PFBT步骤都需要获得2/3节点的多签),因此Zilliqa选择使用EC-Schonorr当作数位签章的演算法。EC-Schonorr的特点在于可以直接透过add operation把大家的签章加在一起,所以无论多少人进行multisig都不会增加总signature的长度。但是在验章过程中,必须要明确指出是由哪些public keys所签章才有办法成功检验(不能只说一个Signature是这五个public key中的三个的签章结果)。因此在Zilliqa的实践中,每次提交多签结果都会搭配一个Bitmap来标示「参与签名的公钥」,借此方便验章的流程。
完整流程
以上就是Zilliqa对于网路分片、DS Committee选举以及区块产生的逻辑。这里我们再整理一下整个网路的运作流程:
-
DS Committee Election
在一切过程开始之前,要先进行DS Committee的选举。所有想要加入DS Committee的节点都会参加PoW1,成功解出nonce的节点提交答案至现有DS Committee当中,超过2/3节点验证并签章后即可接上新的DS Block,加入委员会成为新的Leader。 -
Generating Shards
有了DS Committee以及Leader之后,便会开始进行进行Network Sharding。所有想要参与Sharding的节点都必须进行挖矿,并提交PoW2的答案给DS Committee。等到DS Committee收集到足够多的PoW2答案后,会将所有nonce依照大小排序,依照顺序分配各个Node进入各个shard中,每个shard里面nonce最大的节点首先担任Leader。(分配过程一样是由DSC Leader发布,2/3成员检验后签名才会成立) -
Public Blockchain Information
在完成Network Sharding之后,DS Committee会透过公开频道对外发布目前blockchain的状况,例如目前的shard数量以及各个shard的Leader以及成员们的IP位址。这么一来每个交易在提交时就知道「哪个shard负责处理我的交易」,可以直接将交易送网该IP位址。 -
Transaction Processing
每一笔交易被送至目标shard中后,就会由shard leader来收集这些交易并组成Micro Blocks。组出Micro Block之后,要经过该shard中2/3的成员认证并进行多签,才能合法提交给DS Committee。
接着DS Committee的Leader会再结合所有收到的合法Micro Blocks,组织成Final Block,并且一样在DS Committee中达成PBFT共识,最后接到Tx Blockchain上。
当一个shard成功提交一个Micro Block之后,Leader就会照顺序轮换下去。同样的在DS Committee当中,Leader也会在成功产生Final Block之后进行轮替。 -
Processing Final Blocks
在DS Committee成功发布Final Block的后,各个sharding会根据Final Block的资料来更新自己本地端的Tx Blockchain。同时更新Globalstate。 -
New Nodes Joining ZILLIQA
一个想要进入网路的节点可以透过解PoW1来成为DS node或是透过PoW2来成为shard member。
有没有融会贯通啦?看到这里差不多已经可以理解Zilliqa的运作,在看Block Explorer的时候也不会雾煞煞了。
Smart Contract Layer
最后我们来提一下Zilliqa自己开发的智能合约语言:Scilla。其实Zilliqa打从一开始就不是以取代以太坊为目标,而是主打着「平行化运算」的旗帜,来开拓一个新的市场。
Computational Sharding
在以太坊的VM中,智能合约的执行是依照所谓的von Neumann Architecture,是一种图灵完备的运算架构,每一个程序的执行是有先后顺序的,只有在program counter指到该程序是才会被触发。而Zilliqa则是想要使用Dataflow architecture作为智能合约的运算架构。在Dataflow Architecture中并不存在Program Counter,一个程序是否被执行只受到其Input的Availability影响。也就是说如果一个运算的input都已经被决定,那么它就可以被执行,因此多个程序是可以平行运算的。
在Zilliqa的网路中,由于有许多个shard,分配工作,因此能够减轻所有电脑耗费能运作相同运算的浪费问题,这代表着gas fee可以降低;同时可能藉由分配计算subtask至不同的shard(或是比shard更小的单位),再藉由Dataflow architecture同时执行的特点,来达到运算上的平行化。
这项特点使得Zilliqa在执行某些运算时会比ETH有利非常多,最好的例子就是Neural Network的训练。由于Machine Learning背后是大量矩阵运算,可以很好的透过平行化进行加速(这也是为什么要用GPU训练ML模型)。除了ML之外,MapReduce的运算任务也可以透过平行运算来优化。
Smart Security Budgeting
Users can specify the sizes of consensus groups to compute for each of the subtasks.
这是第二个让我觉得非常聪明的设计:让使用者自己决定每个运算的consensus group大小。换句话说,在运作不同的Task时,可以指定要多少节点确认结果相同才试为合法。这个设计就好像CAP理论中,让使用者自己权衡Availability以及Consistancy一样,把两难的问题丢回给使用者「视情况」而定。假如今天的合约运行结果讲求高度精准,就可以设定5个consensus group全部要有相同的output才算合法;但如果今天是一个运算量大的程式(例如Machine Learning),每一个矩阵运算结果就不是特别重要,重要的是利用便宜的手续费使用到大家的电脑进行平行化运算。
这使的智能合约的适用情况又更广了一些,或是说Zilliqa包含了一些Ethereum不想触碰的范畴。由于DataFlow Architechture本质上讲求的就是平行化,全域的执行排序(Ordering)是不存在的,因此与ETH以Consistancy为目的的虚拟机有着本质上的不同。以往我们在ETH上设计智能合约时注重的是程式本质「公正严谨」的重要性,未来Zilliqa可能提供我们的是一个去中心化进行大量运算的平台。
结语
以上就是看完Zilliqa之后的一些整理以及想法。对于PoW与PBFT的结合我觉得看得十分舒服,最后Smart Security Budgeting我也觉得是非常聪明的设计。个人觉得读完之后对于区块链的不同架构设计很有起发性,撇开复杂的VM Architecutre不谈,原来一些简单的区块组合与变化就可以玩出这么多心花样,看来去中心化世界是有救了。
本文链接地址:https://www.wwsww.cn/jzb/2868.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。