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(说明由几个shared),并且会连结到上一个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的时候也不会雾煞煞了。
broswer
https://viewblock.io/zh-CN/zilliqa/blocks
https://devex.zilliqa.com/
pool
https://miningpoolstats.stream/zilliqa