zilliqa,第一个实现了分片技术提升性能的公链
分片的技术一直在区块量行业被提起,但以太网络的分片推进也是相当的缓慢。相反,Zilliqa,作为第一个使用了分片技术用来提升整体网络吞吐量的公链,已经上线了。在Zilliqa自己的测试网络上,有4个分片,每个分片600个节点,达到了支持每秒1400的交易容量,在加入更多分片和节点的情况下,达到了2800多的TPS。
官网:https://zilliqa.com
Zilliqa主要解决两方面的问题:
- 提高公链性能。通过引入分片机制,使得公链的整体性能与分片和节点数保持线性增加的比例,从而解决现有公链性能差,无法支持大规模用户和应用的问题。
- 解决公链(尤其是以太)智能合约适用性的问题。通过引入Scilla,一种新的智能合约语言,实现了偏向分布式计算应用的需求实现;并针对现有的solicit编写的智能合约出现的安全性问题,做了全面的优化。
这篇文章主要来解读一下Zilliqa的分片机制。
Zilliqa的挖矿节点采用了PoW的形式,但PoW只是用来防止女巫攻击,以及生成节点的身份凭证,而不用做共识。其PoW使用了Ethash算法。Ethash算法使得使用ASIC专用矿机变得困难,从而可以让更多使用GPU的矿机加入挖矿节点,从而保证矿工的数量,进而保证安全。
Zilliqa区块链里面的“区块”有两层:
- 第一层,叫DS Block,全称是directory service blocks。一个DS Block包含了将要参与交易区块共识的节点信息。
- 第二层,就是普通的交易区块TX-Blocks。由在DS Block里指定的节点进行共识。
Zilliqa的分片和共识机制如下:
1. DS Block的共识
一个目录服务委员会(directory service committee,简称 DS committee) 被选举出来,然后目录服务委员会将整个网络节点分片,并将每个节点分配到相应的分片中。
- 基于PoW1算法,最先计算出一个合理的nonce值的节点,会提议一个新的DS Block的头信息(header),然后向其他的DS节点广播。
- 一旦2/3的其他DS节点接受了该header(通过签名),这个新的DS区块就被写入在了DS链上。
- 成功挖出DS区块的节点,将代替DS committee中最老的节点成为新的DS committee节点,并且在随后的DS节点的公式过程中充当了领导者(Leader)的角色。
2. 分片的产生
在DS committee确认后,分片开始了。
- 一个节点基于PoW2算法,算出一个合理的nonce值后,将其广播到DS committee里的节点里。
- DS committee的领导者在收集到一定数量的PoW2要求的nonce值的解决方案后,它会开启一个针对PoW2结果的共识。假设整个网络需要L个分片,每个分片需要n0个节点。被收集到的nonce的结果,会按照从小到大的结果排序,产生头n0个nonce结果的节点被分配到第一个分片,然后依次分配。同一个分片中产生最大nonce结果的那个节点被作为该分片的领导者(leader)。
- 超过2/3的DS节点对于PoW2结果产生共识后,DS committee的leader会产生一个被2/3的共识DS节点共同签名过的多签名证明。
DS节点会在一个公开信道(public channel)里面发布相关的信息,这些信息也是经过2/3以上的DS节点共识的。这些信息包括但不限于以下内容:
- DS节点的身份标记以及连接方式;
- 每个分片里的节点;
- 每个交易提交到不同分片的逻辑。
3. 交易处理
每个交易提交到不同分片的逻辑如下:
根据每个交易发送方地址的最后几位,通过(log 2 L) + 1 的算法将交易分配到不同的L个分片中做验证。
注:由于交易是按照发送者的地址来决定进入哪个分片处理的,所以双花问题可以在一个分片中被处理并被发现
- 当交易被某个分片中的部分节点接收后,该交易被接收到的节点在分片里广播,直到被该分片的领导者所接收。该分片领导者将该交易打包在区块后,开始分片的共识流程。
- 一旦一个分片里区块的共识被2/3该分片的节点所签名,分片的领导者会将分片区块的头信息以及签名(包含了签署所有该分片区块的分片节点的签名)发送给DS committee的节点。
- DS committee的节点在收到该分片区块信息后,会将该分片区块信息广播,直到DS committee的领导者收到该信息。
- 当所有分片的分片区块信息被收到后,DS committee的领导者会将所有分片的区块组成"最终区块"。
4. 最终区块的共识
- 最终区块生成后,DS committee的领导者会主导另外一个共识流程。将该最终区块的头信息和签名信息向每个分片广播。
- 分片收到DS committee发出来的最终区块的广播后,首先通过掌握的DS节点的公钥验证该最终区块信息是否经过了DS committee的验证。
- 如果确实是经过了DS committee验证的,针对每一笔在最终区块里面列出的交易,在本分片掌握的交易信息里是否找得到。
- 如果交易信息不是在本分片的,那么交易发送者的账户在本分片会被暂时挂起,直到根据全局状态的更新会把该账号的挂起解除。
- 如果该交易是在本分片的,那么最终区块的数据项会被本区块掌握的交易信息填充,该交易账户的状态以及全局状态也会被更新。
不管是在DS committee里面,还是在每个分片里面,共识机制都是PBFT,但加以了改进,利用数字签名,将PBFT需要的交流复杂度从O(n2)降低到了O(n);并应用了植入了EC-Schnorr 多签方法,以及自定义的签名数位(bitmap)的方式,并将签名数据大小从O(n)降低到了O(1)。
Zilliqa的签名数位是指:通过一个数字B[i],记录第i个节点是否签名。签名的话,B[i]=1,不然为0。
Zilliqa里面交易确认以及智能合约的运行也是需要消耗“gas”的。Zilliqa里面的gas用Zilliqa自己的通证ZIL来支付。每个参与交易区块共识的分片里面的节点(包括领导者),以及DS committee的共识节点(包括领导者)都能从区块里面的“gas”这个数据项指定的数字获得指定的ZIL的奖励。ZIL总量是210亿,会在10年内被“挖矿”出来,前4年大约挖出整体的80%,后6年则是20%。