Zilliqa的原理与创新

Zilliqa是一个好像始终没什么名气的专案。这几天抽空读完了它的技术白皮书,看看版本号其实已经是一年前的产物了,但里面有许多的想法我觉得非常有趣,就来跟大家简介一下Zilliqa的运行逻辑。

简介

Zilliqa是主打使用Sharding技术增加吞吐量的智能合约平台。这里先简单列出Zilliqa的一些特别之处,后面我们再来一一介绍。

  1. Sharding技术的实践
    Zilliqa最引以为傲的就是他们Sharding(分片)的技术,而且这是从他们专案一开始,就着手对现有区块链扩容议题提出的解法以及努力的方向。当然,Sharding最后变得耳熟能详是因为以太坊的采用,但依然到今天没有实践完成。Zilliqa有没有机会在一月主链上线后成为第一个成功使用sharding的区块链呢?感觉是有的。
  2. 特殊的智能合约语言(Smart Contract Language)设计
    大家都知道以太坊的智能合约语言Solidity是当今最红的Dapp语言,Zilliqa想要提出自己的智能合约语言:Scilla,则是主打着「平行化」运算的旗帜,透过所谓的「Computational Sharding」来让智能合约的运算上也可以达到平行化。
  3. 结合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选举以及区块产生的逻辑。这里我们再整理一下整个网路的运作流程:

  1. DS Committee Election
    在一切过程开始之前,要先进行DS Committee的选举。所有想要加入DS Committee的节点都会参加PoW1,成功解出nonce的节点提交答案至现有DS Committee当中,超过2/3节点验证并签章后即可接上新的DS Block,加入委员会成为新的Leader。
  2. Generating Shards
    有了DS Committee以及Leader之后,便会开始进行进行Network Sharding。所有想要参与Sharding的节点都必须进行挖矿,并提交PoW2的答案给DS Committee。等到DS Committee收集到足够多的PoW2答案后,会将所有nonce依照大小排序,依照顺序分配各个Node进入各个shard中,每个shard里面nonce最大的节点首先担任Leader。(分配过程一样是由DSC Leader发布,2/3成员检验后签名才会成立)
  3. Public Blockchain Information
    在完成Network Sharding之后,DS Committee会透过公开频道对外发布目前blockchain的状况,例如目前的shard数量以及各个shard的Leader以及成员们的IP位址。这么一来每个交易在提交时就知道「哪个shard负责处理我的交易」,可以直接将交易送网该IP位址。
  4. 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之后进行轮替。
  5. Processing Final Blocks
    在DS Committee成功发布Final Block的后,各个sharding会根据Final Block的资料来更新自己本地端的Tx Blockchain。同时更新Globalstate。
  6. 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
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。