2018年2月5日git
Zilliqa博客发布,Rita译微信
欢迎加入咱们的社区,向咱们提问并获取最新(但愿也是最棒的)资讯!网络
Nakamoto共识协议(或PoW)不理想以及为何Zilliqa须要一个不一样的共识协议。Zilliqa使用的共识协议被称为实用拜占庭容错(PracticalByzantine Fault Tolerance),简称pBFT,该协议具备计算成本低、在低能耗的状况下便可赋予交易最终性、提出下个区块无需确认等多个优势。session
然而,卡斯特罗和利斯科夫(Castroand Liskov)在其论文(连接https://dl.acm.org/citation.c...)中设计的经典pBFT 只有在共识组(在Zilliqa中指一个分片)较小时,例如少于50个节点,才具备较高的通讯效率。当共识组变大,节点之间的通讯成本将骤升从而成为效率的障碍。而咱们此前的文章提到,Zilliqa中任何分片都必须有至少600个节点才能确保其中拜占庭节点(即恶意节点)的比例低于三分之一的几率很是低。函数
本文是此系列文章的终篇,咱们将讨论经典pBFT协议对通讯的要求有多高以及咱们如何使用多重签名的方法来下降这个要求。区块链
在本文中,咱们将用n来表示共识组的大小, Zilliqa中n假设等于600。加密
pBFT的通讯成本spa
在此前提到的论文中,经典pBFT要求每一个节点与全部其余节点通讯共享协议消息,从而对系统状态达成一致。这意味着每一个节点都必须发送n条消息,所以总的通讯数量为n2,这一通信成本是很高的。设计
认证消息的成本3d
此外,在拜占庭网络中仅仅发送消息是不够的。特别是在一个公开的拜占庭网络中,当节点A接收到来自节点B的消息时,A必须肯定该消息确实由B发送,且该消息在传输过程当中未被修改,没有这种保证,节点就很难确保消息的真实性,由于黑客能够在中间环节修改消息并给节点提供不正确的信息。
一种验证消息传输的解决方案是在A和B之间生成保密的密钥,而后可使用该密钥为每一个传出的消息生成“标签”。因为只有A和B知道密钥,因此标签只能由A或B生成,从而他们能够验证消息的来源。
消息认证码(MessageAuthentication Code,简称 MAC)是能够生成这种标签的加密方法。构建MAC的一种可能方式是使用加密散列函数(cryptographichash function),该函数将密钥和消息做为输入并生成标签做为输出。
下图显示了发送者和接收者使用MAC的方式。发送者用消息和密钥经过MAC生成标签,并将其与消息一块儿发送给接收者。接收者再次计算MAC获得一个标签,将之与收到的信息进行比对,确认二者是否吻合,如吻合则该消息未被篡改。
然而,MAC和大多数对称密钥方法的问题在于,若是咱们有n个节点,每对节点都须要一个密钥。所以,若是咱们有n个节点,总共须要n(n-1)/ 2个密钥。
那么MAC的通讯成本究竟是多少?若是咱们在网络中有4个节点A、B、C、D,当A要向整个网络即向B、C、D发送消息时,A要建立3个不一样的标签由于A与B、C、D分别有不一样的密钥。如今,假设A用B做为中继(relay)将标签传送到C和D,那么A将须要向B发送3个标签(参见下图)。B在收到它的标签后,用C做为中继将A的标签转发给C和D时,它只会向C发送2个标签。以此类推,使用这种简单的基于中继的广播机制分发的消息总数为3 + 2 + 1 = 6。
此图显示出一条消息在网络中传输的方式。三种不一样的颜色显示出A建立的三个不一样的标签,A先将三个标签发送给B,B再将两个标签发送给C,最后C转发最后一个标签给D。
对于具备n个节点的网络,若是咱们使用MAC,则以标签形式发送的消息总数为:(n-1)+(n-2).. + 1 = n(n-1)/2。
采用公钥密码学提升效率
由于验证消息上的签名也能够确保该消息确实是由合法的发送者签发的,所以MAC实际上能够用数字签名来替代。卡斯特罗和利斯科夫之因此没有使用数字签名是由于,当时计算MAC比生成数字签名计算量便宜得多。现在,数字签名的计算量已经至关便宜。
并且,公钥密码学自身有不少优势。为了理解这一点,咱们继续使用前面的例子。如今,咱们假设A、B、C、D节点使用数字签名。所以当A发送消息时,它将签署消息并由此产生签名。请注意,A在这里不须要建立三个签名,只有一个就够了。而后签名被发送到下一个节点B,B在此只收到一条消息和相应的签名,B再发给下一个节点C。以此类推,在每一个节点,只有一个签名被转发,在这种状况下分发的消息总数将为1 + 1 + 1 = 3。
使用数字签名的传输模式时。A只须要为每一个消息生成一个签名。
对于具备n个节点的网络,若是咱们使用数字签名,则所传递的消息总数将为:1 + 1 +1 …(n-1)次= n-1。
最近有篇学术论文提出了用数字签名取代MAC的想法
连接:
https://www.usenix.org/confer...
使用数字签名而不是MAC将发送消息的数量从二次方数量级减小到线性,当n很大时这种减小会产生重要影响。以600个节点为例,其中传播的消息数量能够从17.97万减小到599。
使用多重签名方案减小每一个消息的大小
讲到这儿,你应该相信使用数字签名比MAC能更好地减小网络中需传输消息的数量了吧,那么接下来就让咱们用数字签名来替换传统pBFT协议中的MAC。
如今的问题是,咱们是否找到比数字签名更好的方法呢?答案是确定的!数字签名确实还有必定的改进空间,咱们会在将来的博客中更多地介绍这个内容。如今先让咱们看一下数字签名有哪些能够改进的地方。
咱们知道,pBFT赋予了交易最终性,这意味着一旦交易被提交到区块链,那么它就是最终的了且不会有临时分叉,所以不须要确认。交易之因此有最终性是由于,pBFT协议自己已要求每一个区块必须由共识组中的绝对多数诚实节点签署。每一个诚实的节点经过签名确认它已经验证了块的内容,确保交易有效。而在基于PoW的共识中,每一个节点均可以生成一个区块,而网络的其余节点或接受或拒绝它,这就会致使临时分叉的产生。
具体的签名方法是:每一个节点签署一个区块,而后将签过名的区块转发到网络的其他部分,以后其他节点都将本身的签名附加在这个区块上,最终在普遍传播后,这个区块就会得到绝大多数诚实节点的签名。若是网络中的每一个节点(包括恶意节点)都对该区块进行签名,那么区块的签名数量为n,在这里咱们就须要引入多重签名的概念了:多重签名是一种密码术语,指的是把一条信息上的n个节点签署的n个签名整合到一个大小固定的签名上。
简化的多重签名如何工做
在介绍细节以前,让咱们先了解一下背景:在多重签名方案中,咱们有n个签名者,每一个签名者都有一对密钥(公钥和私钥)、一个验证签名的验证者和一个汇总各方“签名”的聚合者(aggregator)。为了便于理解,咱们如今简单假设全部节点都是诚实的,而且会配合签署消息。
验证者在检验汇总后的签名时,会检查全部签名者是否都正确地签了名。仅当验证者确认全部签名者都正确地签了名以后,验证才算经过,反之则验证失败。
接下来让咱们深刻细节,请作好准备,由于这有些偏技术性。
多重签名方案基本上分两步进行。在协议的第一步中,每一个节点将其公钥发送给聚合者,聚合者根据公钥的数学形式,经过简单的加法或乘法将之聚合为一个单一的公钥。
例如,聚合公钥= 公钥_1 + 公钥_2 + …+公钥_n。
而后聚合者将聚合公钥转发给验证者从而可使后者验证聚合签名,与此同时聚合者也将聚合公钥发送给每一个签名者让全部人签名。
在第二步中,聚合者启动与每一个签名者的交互协议(interactiveprotocol)。这个交互协议总分包含三个阶段:
一、提交阶段(Commit phase):此阶段每一个节点生成一些随机内容并提交给交互协议。若是你不了解什么是加密提交(cryptographiccommitment),那么能够经过这种类比的方式理解:每一个节点都秘密地掷骰子,而后将结果写在一张纸上并将其放在一个盒子中锁好,最后发送给聚合者。聚合者无权打开盒子。
二、挑战阶段(Challenge phase):此阶段聚合者首先使用加法或乘法将全部的提交聚合为一个聚合提交,而后使用它以及聚合公钥、消息生成一个挑战,再将挑战发送到全部节点。以后挑战可用于确认全部节点都知道公钥对应的私钥。这与常规数字签名的工做方式相似,即由签名证实签名人确实知道私钥。
三、回应阶段(Response phase):全部节点为了应对挑战会向挑战发送私钥进行回应,以后聚合者将聚合全部的回应。所以回应可被视为签名者知道其公钥对应的私钥的证据。
所以,最后的聚合签名其实是挑战和聚合回应的信息对,并能验证第一步生成的聚合公钥。
值得注意的是,聚合签名的大小不取决于签名者的数量,它是固定的。
图中蓝色的节点是聚合者。H是用于将消息m生成挑战的密码散列函数。聚合签名就是R和S的信息对。R的大小等于Ri,S的大小等于Si的。仅在知道私钥的状况下才能生成有效的回应。
当验证者检查聚合签名时,它检查的不是每一个单独签名者是否都正确地遵照协议,而是检查全部签名者做为一个总体是否正确地遵照协议并知道私钥。所以,验证者作出的决定是全有或全无(all-or-nothing)。
目前一种比较流行的多重签名方案是基于Schnorr数字签名技术的并因为一篇学术论文(连接https://arxiv.org/abs/1503.08768)获得了关注,该论文在一些证人须要证实事件发生的背景下使用了这个技术。
结论
Zilliqa使用了近期一些学术论文中的技术来提升经典pBFT协议的效率。
本文的主要亮点是多重签名协议将签名数量从n减小到1,从而减小认定后的区块的大小。
还有一些问题在这篇文章里面没有涉及,最重要的一个问题就是若是只是绝对多数节点而不是全部节点对信息进行了签名,那么这个协议还有效吗?须要对协议作出什么样的修改?另外,你以为有什么方法能够攻击这个简单版的多重签名?
要回答这些疑问,你能够经过两种方法:比较难的方法是阅读 Zilliqa的技术白皮书,连接:
https://docs.zilliqa.com/whit...
而简单的方法是经过咱们的社区向咱们提出这些问题。
咱们很高兴地邀请您加入咱们的社区,与技术专家、金融业者和加密数字货币爱好者们一同探讨!您能够经过如下方式关注咱们的进展:
微信公众号:ZilliqaCN
Zilliqa中文社区联盟:http://www.zilliqa.com.cn
关注咱们的推特:https://twitter.com/Zilliqa
经过邮箱订阅咱们的新闻:http://zilliqa.us16.list-mana...
关注咱们的博客:https://blog.zilliqa.com/
Reddit:https://www.reddit.com/r/zilliqa
Slack:https://invite.zilliqa.com/
Gitter:https://gitter.im/Zilliqa/