VBFT共识机制的随机数生成方法和共识机制系统

文档序号:25858291发布日期:2021-07-13 16:12阅读:705来源:国知局
VBFT共识机制的随机数生成方法和共识机制系统

本发明涉及vbft共识机制技术领域,具体涉及vbft共识机制的随机数生成方法和共识机制系统。



背景技术:

区块链起源于比特币,2008年中本聪发表了《比特币:一种点对点的电子现金系统》一文,这标志着比特币和区块链的诞生。区块链最初是作为比特币的核心底层技术所提出,通过运用数据加密、时间戳、分布式共识等手段,实现去中心化、去信任的点对点交易,后来逐渐扩展到电子合同、物联网、保险、版权存证等领域。而共识机制作为区块链的底层技术,确保了保证分布式账本数据的正确性和一致性,是每个区块链网络节点都必须遵守的规则。一个区块链网络的性能、安全性和可扩展性很大程度上都取决于其共识机制的算法设计。

可验证拜占庭容错(verifiablebyzantinefault-tolerant,vbft)共识机制是新兴的一种混合型共识机制,其结合了vrf(可验证随机函数)、pos(权益证明)、bft(拜占庭容错)三者的优点,是一种去中心化程度高、可扩展性好且高效的共识机制,但其存在着很大的安全性问题。我们利用安全多方计算、椭圆曲线加解密、哈希运算等密码学技术提出一个改进的vbft共识机制系统,来解决vbft共识机制中的安全性问题,并在计算过程中用零知识证明保证计算的正确性及可验证性。

vbft共识机制拥有良好的性能,在vbft共识机制的支持下,onchain(分布科技)的区块链网络ontology(本体)每秒处理的交易数(transactionpersecond,tps)可以达到5300多,但vbft共识机制存在着很大的安全漏洞。首先,其基于vrf生成随机数v,并根据v的比特位数选择节点角色以及最终的出块节点,而vrf是通过循环位移的方式计算出来的,这其中存在着一定的安全隐患。下面对vbft共识机制的这一安全漏洞进行详细分析阐述。

vbft共识机制流程中共识节点角色的选择、出块的先后顺序以及由哪个节点完成最终的出块是由vrf产生的随机数的值决定的。而vbft共识机制中所用到的vrf算法是有着巨大的安全漏洞的。我们首先分析vbft中一个区块在产生时所用的方法。

首先,验证节点只对其手中最高等级的区块进行背书,而最高等级的区块由提案节点最高优先级决定。提案节点的优先级是在v中排列出的所有备选提案节点中的顺序。也就是说,排名第一的提案节点拥有最高的优先级。之后,确认节点在只对完成背书的且具有最高等级的区块进行签名。因此,提案节点的优先级对于共识的结果具有重要意义,即拥有最高优先级的提案节点拥有最大可能成为本区块的生成者。

我们假设现在共识第r个区块,r为正整数,第r块的vrf值为

v=hash(vrf_r-1,r)

即第r块的v值是通过第r个区块的vrf和r的哈希得出来的,hash(vrf_r-1,r)表示基于vrf_r和r的哈希值,vrf表示可验证随机函数,vrf的计算方式为

vrf_r-1=(sig,π)

其中,sig是用户私钥的哈希值,即用户的私钥签名;π是私钥生成的一个零知识证明,且π是可变的,因此,在产生第r个区块时(r为正整数),由于第r块的v=hash(vrf_r-1,r),且第r块完全是通过v来确定提案节点的优先级,所以第r-1个区块的提案节点在计算出vrf_r-1的时候,就可以事先知道第r个区块的最高优先级的提案节点是哪个节点。

通过上述分析,攻击者可能会有以下攻击形式:第r-1个区块的提案节点在生成第r-1块时,由于π是可变的,提案节点就可以通过不断的改变vrf_r-1中π的值,来尝试寻找能够让其在第r块中处于最高优先级的vrf_r-1。由于最高优先级的提案节点只是通过v的最低10bits确定出来的,所以平均来说,尝试1024次就可以找到一个能够让自己成为下一个区块最高优先级的vrf_r-1的值。

综上所述,如果某个提案节点在某一次区块竞争中获胜,那么它可能永远处于提案节点的最高优先级,并且所有区块都由该提案节点产生,这是一种严重的安全漏洞。



技术实现要素:

为了解决现有vbft共识机制的随机数生成方法存在安全漏洞的问题,本发明提出vbft共识机制的随机数生成方法和共识机制系统。

本发明为解决技术问题所采用的技术方案如下:

vbft共识机制的随机数生成方法,包括如下步骤:

步骤1、每个参与者均选择1个第一随机数和t-1个第二随机数,每个参与者根据其选择的1个第一随机数和t-1个第二随机数生成一个t-1次多项式,所述第一随机数作为t-1次多项式的常数项,把所述t-1次多项式分成n个子份额,将n个子分额分别编码到椭圆曲线e上,使每个子份额都成为椭圆曲线e上的一个点,参与者共n个,用n个参与者的公钥对编码后的n个子份额的进行加密得到n个秘密子份额,n个参与者的公钥一一对应n个秘密子份额,将秘密子份额发送至生成与其相对应公钥的参与者,t为协议门限值,t>1;参与者生成并提供用于验证其自身是否对每个编码后的子份额进行了正确加密的第一非交互式零知识证明;

步骤2、根据参与者提供的第一非交互式零知识证明对加密计算进行验证,若验证未通过则删除该参与者的所有相关计算数据;待对所有参与者均验证后,所有验证通过的参与者进行步骤3;

步骤3、参与者将接收的所有秘密子份额进行同态相加;

步骤4、参与者采用自己的私钥为步骤4得到的同态相加的结果进行解密得到解密后的子份额之和,在对解密后的子份额之和进行解码得到解码后的子份额之和;参与者生成并提供用于验证其自身解密的第二非交互式零知识证明;

步骤5、根据参与者提供的第二非交互式零知识证明对该参与者的解密计算进行验证,若验证未通过则删除该参与者的所有相关计算数据;待对所有参与者均验证后,所有验证通过的参与者进行步骤6;

步骤6、参与者发送自己解码后的子份额之和至其他参与者,参与者根据其他参与者解码后的子份额之和计算可验证随机数s。

基于所述的vbft共识机制的随机数生成方法的vbft共识机制系统,所述vbft共识机制系统的共识流程顺次为提案新区块、验证新区块、提交区块和确定区块;

提案新区块,在所述提案新区块阶段共识网络中的备选区块提案节点构建自己的备选区块,并完成在网络中提交;所有共识节点共同生成一个256bits的可验证随机数s,s的0-15bits用于选择第r个区块的提案节点,16-135bits用于选择第r个区块的验证节点,136-255bits用于选择第r个区块的确认节点,r为正整数;每个共识节点根据s的比特位数判断自己是否为备选提案节点;每个提案节点构建自己的备选区块,并把区块广播出去,如果超过一定时间没有区块被广播,则非备选提案节点向网络中提案空区块;

验证新区块,在所述验证新区块阶段共识网络中的所有共识节点对网络中的备选区块进行验证,并对最高优先级的区块提案进行背书;所有共识节点通过s可以判断其是否为验证节点,每个验证节点可以收到多个区块的提案,以s产生的提案节点顺序作为提案节点的级别;每个验证节点针对其收到的区块先进行提案节点优先级的排序,每个验证节点只对其收到的提案节点最高级别的区块进行背书,并把背书结果广播出去;

提交区块,对所有完成背书的区块进行确认,按照s中定义的提案节点等级进行排序;若某个区块的背书数量大于t,则将该区块提案设置为确认状态;对处于确认状态的区块产生一个数字签名,并把所述数字签名广播出去;

确定区块,所有共识节点通过s判断生成数字签名的节点其是否为确认节点;一定时间之后,如果某个区块的数字签名的数量大于t,则共识流程完成,该区块上链。

本发明的有益效果是:

1、本发明vbft共识机制的随机数生成方法,代替了经典vbft共识机制中的vrf来生成随机数,具有高效且安全的优点,该随机数生成方法可以使互不信任的多方共同生成一个由多方完成计算、任何人可验证的安全的随机数,且随机数的真伪以及生成过程可以被任何人验证。通过随机数生成方法,任何人都不知道他人的任何隐私信息及计算时的输入数据,但任何人都可以验证其中每个人计算的正确性。基于该方法,只要有一个诚实的参与者,最终生成的随机数便是随机且不可预测的。

2、基于所提出的公开可验证随机数生成方案,本发明提出的一种改进的vbft共识机制系统,针对vbft共识机制中的安全性问题,在共识的提案新区块阶段,基于所提出的基于安全多方计算的公开可验证随机数生成方案多方联合生成随机数,替代经典的vbft共识机制中通过可验证随机函数生成随机数的方法,并通过本发明方案中生成的随机数来确定区块链网络中节点的角色类型以及出块的先后顺序,从而保证了共识的安全性,有效解决了原共识算法中存在的安全漏洞,很好的解决了传统vbft共识机制中的安全性问题,防止了提案节点可能的作弊方式。

附图说明

图1为本发明的一种vbft共识机制的随机数生成方法的原理简图。

图2为本发明的一种vbft共识机制的随机数生成方法的方案流程图。

图3为本发明的一种vbft共识机制的系统流程图。

具体实施方式

为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式对本发明进行进一步的详细描述。

在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用其他不同于在此描述的其他方式来实施,因此,本发明的保护范围并不受下面公开的具体实施例的限制。

另外,在本发明中如涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。例如第一随机数、第二随机数、第三随机数、……、第八随机数,“第一”至“第八”仅是为了区分随机数,并不表示数量或大小,而且随机数的选择不受其他随机数的限制;例如第一非交互式零知识证明、第二非交互式零知识证明等的“第一”和“第二”仅是为了区分。

本发明提出一种vbft共识机制的随机数生成方法,即一个基于安全多方计算的可验证随机数生成(multi-partycomputation-randomnumbergeneration,mpc-rng)方案。

该mpc-rng方案中的随机数由区块链网络中所有参与共识的节点共同生成,其中每个人既是参与者又是验证者,整个过程不需要任何第三方也不需要任何超级节点,每个参与者的计算任务和计算量都是一致的,最终生成公开的、任何人可验证的、不可预测的随机数。

本发明所提方案的目的是设计一个由多方共同参与计算并且任何人都可以验证的高效的随机数生成方案。该方案由区块链网络中的所有参与共识的节点在新区块提案时执行,方案的计算基于椭圆曲线来完成,并且每个节点在进行秘密共享以及秘密重构的过程中都要生成一个零知识证明以证明自己计算的正确性和忠诚性。最终不止参与共识的节点,所有区块链网络中的任何节点都可以通过参与计算的节点发布的零知识证明来检验计算的正确性和有效性。

本发明提出的随机数生成方案中,所有的共识节点共n个,记为p,具体用pi和pj都表示共识节点即参与者,i和j均为正整数,且均∈[1,n],pi和pj的区别为:pi用于表示作为发送者的参与者,即表示发送秘密的参与者,pj表示用于表示作为接收者的参与者,即表示接收秘密的参与者。这n个共识节点共同计算生成随机数。使用mpc-rng方案生成随机数的过程如图1所示。在我们所提方案中,每个节点首先生成一个第一随机数,之后将这个第一随机数作为常数再生成一个随机多项式,接着每个节点都把该节点生成的多项式通过秘密共享再生成n份秘密子份额,并共享给其他n-1个节点(一个节点的秘密共享,使得每个节点得到一个与其对应的秘密子份额)。在所有节点都完成秘密共享后,此时每个节点都收到了其他节点发来的秘密子份额,总计拥有n份秘密子份额,之后每个节点都把这n份秘密子份额相加得到秘密子份额之和并用自己的私钥解密,而所有节点的子份额之和即是所有人最初生成的随机多项式的系数之和。最后由所有参与计算的节点中的t个节点进行秘密重构(t大于1,t为协议门限值),通过插值公式进行秘密重构恢复出原来的多项式常数的和,即每个节点最初生成的第一随机数的和s,并对此结果再做哈希运算即得出我们最终要生成的可验证随机数s。方案的流程公开、透明,结果公开且可供全网节点验证。

本发明所提mpc-rng方案主要分为八个步骤,即系统初始化、密钥生成、秘密共享、子份额的零知识证明、同态相加、子份额解密、解密的零知识证明和秘密重构。这些步骤均由参与者完成执行,每个步骤完成之后下一个步骤开始执行。mpc-rng方案的流程如图2所示。验证过程由验证者验证零知识证明来完成,验证者可以是除了发布零知识证明的参与者之外的任何人(包括其他参与随机数生成计算的参与者),一旦所有参与者的零知识证明都被验证通过,则下一个步骤开始执行,反之若某个参与者的零知识证明验证失败则该参与者被移出协议,该参与者的所有计算数据也被相应的删除,以下是一种vbft共识机制的随机数生成方法的详细步骤。

步骤aa、系统初始化

在系统初始化阶段,生成方案中所用到的椭圆曲线的参数(p,a,b,g,n',h),其中,p是椭圆曲线的有限域(除非特别声明,本实施方式mpc-rng方案所有公式的计算都为模p运算),a和b均表示椭圆曲线的系数(a为一次项系数,b为常数项),g是椭圆曲线群的生成元,n'是基点即生成元g的阶,n'是一个大素数,h是椭圆曲线上所有点的个数m与n'相除的整数部分。在xy直角坐标系下生成椭圆曲线e的公式为:

y2=x3+ax+b,(4a3+27b2≠0)modp(3-1)

其中mod表示模运算。

步骤bb、密钥生成

在密钥生成阶段,每个参与者都生成一个公私钥对(公钥和私钥),其中公钥对网络中的所有人公开,私钥则只有参与者本人知道,具体细节如下:

参与者pi随机选择一个小于n'的大数作为该参与者自身的私钥ski,并根据如下公式计算出该参与者的公钥pki:

pki=ski·g(3-2)

即每个参与者的私钥是一个随机数,公钥是私钥和基点g的乘积即是椭圆曲线上的一个点。

上述步骤aa和步骤bb为可以为mpc-rng方案中的步骤,也可以为构建dpos表的过程中进行的步骤。基于步骤aa和步骤bb的基础上进行下述步骤1至6

步骤1、秘密共享

秘密共享包括生成多项式、计算子份额、明文编码、公钥加密以及分发秘密子分额这五个步骤。每个方案计算的参与者pi首先选择一个第一随机数si,之后再选择t-1个第二随机数,并根据第一随机数si和t-1个第二随机数生成一个t-1次多项式,多项式的常数部分为si。随后把该多项式分成n个子份额,并把这n个子分额分别编码到椭圆曲线上,使每个子份额都成为椭圆曲线上的一个点。最后再用包括其他n-1个接收者以及自己在内的n个公钥对编码后的n个子份额的进行加密得到秘密子份额(n个接收者的n个公钥一一对应n个秘密子份额的加密),并把用哪个接收者的公钥给哪个子分额加密记录下来,之后将加密过后的n个秘密子份额按照记录对应发送给包括自己在内的n个参与者,也就是将秘密子份额发送至生成与该秘密子份额相对应公钥的参与者。如表1,表1给出了秘密共享过程中秘密子份额的发送和接收过程,在这个过程中每个人既是秘密的发送者同时也是秘密的接收者,每个参与者收到的秘密子份额都是其他参与者用该参与者自己的公钥加密的秘密子份额,其中yij表示第i个参与者(发送者)给第j个参与者(接收者)的秘密子份额,例如y12表示参与者p1给参与者p2的秘密子份额。秘密子分额全部发送完成后,每个参与者都收到了其他参与者发送的用该参与者公钥加密的总计n-1个秘密子份额,再加上拥有用参与者自己公钥加密的1个秘密子份额,共计n个秘密子份额。

表1秘密子份额分发与接收表

步骤1上述步骤的具体细节如下:

1)生成多项式:pi在[1,n]内选择一个第一随机数si,并记si=ai0,之后再选择t-1个第二随机数ai1,ai2,...,ai,t-1,并用第一随机数和第二随机数作为多项式的系数生成一个如下的t-1次多项式(选择的随机数作为系数):

fi(x)=ai0+ai1x+...+ai,t-1xt-1(3-3)

2)计算子份额:对于j=1,2,...,n,pi计算子份额fi(j)。

3)子份额编码:对每个子分额fi(j)进行编码使其成为椭圆曲线e上的一个点。首先选择一个大整数k(k对所有参与者公开),并且满足

(fi(j)+1)k<p(3-4)

子份额fi(j)的x坐标用如下公式表示:

xij=fi(j)k+l,0≤l≤k(3-5)

由于我们的椭圆曲线e的形式为y2=x3+ax+b,设a=x3+ax+b,步骤1.331、用欧拉准则来判断a是否是模p的二次剩余:若a是模p的二次剩余,则公式(3-1)对应的y坐标有解,即公式(3-5)成立,xij可作为子份额fi(j)的x坐标;若a不是模p的二次剩余,则l’=l+1,l=l’,并以新的l再计算一次公式(3-5),即以更新的l重新进行步骤3.331,直至a是模p的二次剩余即直到找到一个满足条件的xij。步骤3.332、根据公式(3-1)算出子份额fi(j)对应的y坐标,特别的,当y有多个解时,取子份额fi(j)和y在模p下做差的绝对值最小的一个解记为yij,点(xij,yij)就是子份额fi(j)编码到椭圆曲线e上的结果,记为fi'(j)。

4)公钥加密:用所有接收者的公钥给编码过后的这n个子份额加密:

yij={rijg,fi'(j)+rijpkj}(3-6)

其中,rij为发送者pi选择的一个小于n'的第三随机数,并记yij1=rijg、yij2=fi'(j)+rijpkj,加密后的秘密子份额yij为一个点对,记为(yij1,yij2)。

5)分发秘密子份额:在加密完成后,pi把用哪个接收者的公钥给哪个秘密子份额加密记录下来,形成一个i到j的映射i→j,最后pi把所有秘密子份额根据映射关系发送给相应的接收者,即用谁的公钥加密就把加密后的秘密子份额发送给谁。

参与者生成用于验证其自身是否对每个编码后的子份额fi'(j)进行了正确的加密的非交互式零知识证明,称为第一非交互式零知识证明。参与者提供第一非交互式零知识证明。

步骤2、子份额的零知识证明验证

为了防止恶意的参与者向其他参与者发送伪造的秘密子份额,每个参与者在生成秘密子份额后都必须生成一个非交互式的零知识证明来证明自己计算的正确性和有效性,其他计算的参与者可以通过这个非交互式的零知识证明来验证该参与者是否诚实的执行了计算,并且全区块链网络中的任何人都可以验证。若验证通过,则任何人都可以相信该参与者发布的秘密子份额是正确并且有效的,方案的参与者继续执行方案的下一个步骤;若验证未通过,则该参与者被移除出方案,该参与者的所有相关计算数据都会被删除,以保证系统的安全性,即在表1中删除该参与者所在的对应行,具体细节如下:

根据参与者提供的第一非交互式零知识证明,其他参与者对提供该第一非交互式零知识证明的参与者步骤1的加密计算进行验证(如图1中的验证所有零知识证明),若验证未通过则删除该参与者的所有相关计算数据,待所有参与者均验证后,以所有通过验证的参与者进行步骤3。参与者自身的第一非交互式零知识证明通常在步骤1中加密计算时/后获得,在步骤1或2中提供给其他参与者均可。

在步骤1秘密共享阶段,pi需要自证明对每个编码后的子份额fi'(j)进行了正确的加密以得到yij,具体细节如下:

pi选择一个小于n'的第四随机数kij,构建承诺一

qij=kijg(3-7)

pi计算承诺一对应的挑战值一

cij=hash(qij||yij1)(3-8)

pi计算应答值一

aij=kij-cij·rij(3-9)

pi生成一个完整的零知识证明

proofij=(qij,cij,aij)(3-10)

包括参与者在内的任何人都可以根据pi生成的第一非交互式零知识证明验证如下公式对于pi是否成立:

qij=aijg+cijyij1(3-11)

若等式(3-11)成立,则说明该参与者诚实的执行了方案,完成了正确且有效的计算;若等式(3-11)不成立,则说明该参与者为恶意的参与者,将该参与者以及其所有计算数据移除出协议。验证判断完成后,以保留的参与者进行步骤3。

步骤3、同态相加

由于我们最终需要的是所有多项式系数的和,所以我们利用椭圆曲线加密的同态属性先把加密后的秘密子份额同态相加,解密后即是这些子份额的和。具体细节如下。

接收者pj把所有发送给自己的秘密子份额进行同态相加,计算公式如下:

完成同态相加后的秘密子份额之和仍是一个点对(yj1,yj2),其中,

步骤4、子份额解密

每个接收者pj用自己的私钥skj给之前完成同态相加的秘密子份额yj进行解密,得到pj用自己的私钥解密的子份额之和sj',称为解密后的子份额之和;再对解密后的子份额之和进行解码,解码后即是所有子份额之和sj,称为解码后的子份额之和;虽然每个接收者解密后得到的均不是原多项式的系数的和,但其中都包含了不同的参与者发送给自己的秘密共享后的子份额,任何参与者都无法根据自己的子份额之和sj得到任何秘密数据,但最终集齐t个参与者的子份额之和即可以进行秘密重构。具体解密和解码的细节如下。其中解密的公式为:

sj'=yj2-skj·yj1(3-13)

我们将sj'的坐标记为(xj,yj),将sj'解码恢复为sj只需要按照如下公式进行计算:

sj=max([xj/k])(3-14)

其中,k是编码时发送者pi所选择的大整数,max([xj/k])表示小于等于xj/k的最大整数。

参与者生成并提供一个非交互式的零知识证明称为第二非交互式零知识证明,用于其他参与者验证提供该第二非交互式零知识证明的参与者的解密是否正确。

步骤5、解密的零知识证明验证

为了防止恶意的参与者向其他参与者发送伪造的解密子份额之和,每个参与者在完成解密之后都必须生成一个非交互式的零知识证明来证明自己解密的正确性和有效性。其他计算的参与者可以通过这个非交互式的零知识证明来验证该参与者是否诚实的执行了解密计算,并且全区块链网络中的任何人都可以验证。参与者自身的第二非交互式零知识证明通常在步骤4中解密/解码计算后获得,也可在步骤5中才提供给其他参与者。其他参与者根据第二非交互式零知识证明对该第二非交互式零知识证明提供者进行解密验证,若验证通过,则任何人都可以相信该参与者发布的解密结果是正确并且有效的,方案的参与者继续执行方案的下一个步骤;若验证未通过,则该参与者被移除出方案,该参与者的所有相关计算数据都会被删除以保证系统的安全性,具体细节如下。

参与者提供用于验证其自身解密的第二非交互式零知识证明,其他参与者根据参与者提供的第二非交互式零知识证明,对提供该第二非交互式零知识证明参与者步骤4的解密计算进行验证,若验证未通过则删除该参与者的所有相关计算数据;待对所有参与者均验证后,以所有通过验证的参与者进行步骤6。

在步骤4的子份额解密阶段,每个参与者都要证明自己对同态相加后的秘密子份额yj进行了正确的解密和解码以得到sj,具体细节如下:

pj选择一个小于n'的第五随机数kj,构建承诺二

qj=kjg(3-15)

pj计算承诺二对应的挑战值二

cj=hash(qj||yj)(3-16)

pj计算应答值二

aj=kj-cj·skj(3-17)

pj生成一个第二非交互式的零知识证明

proofj=(qj,cj,aj)(3-18)

全区块链网络的所有共识节点都可以根据此零知识证明验证如下等式对于每个方案的参与者是否成立:

qj=ajg+cjpkj(3-19)

若等式(3-19)成立,则说明该参与者诚实的执行了方案,即完成了正确且有效的解密计算;若等式(3-19)不成立,则说明该参与者为恶意的参与者且发布了伪造的计算结果,将该参与者以及其所有计算数据移除出方案,以保留下来的参与者进行步骤6。

步骤6、秘密重构

所有诚实的参与者把自己解码的子分额之和、解密的子分额之和和解密的第二非交互式的零知识证明发送给其他参与者,至此所有参与者都拥有了完成秘密重构的全部数据,因此,在这个阶段中的每个参与者都可以完成秘密重构的所有计算。在完成第二非交互式的零知识证明的验证过程并将恶意的参与者及其数据移除出方案后,所有剩余参与者都可以基于解码的子分额之和通过拉格朗日插值公式完成插值计算,计算结果即所有参与者初始选择的第一随机数的和。最后把这个计算结果作为输入再进行一次哈希运算,得到的结果即是最终本随机数生成方法所输出的可验证随机数。具体方法如下。

每个参与者pj都把自己解码后的子份额之和sj发送给其他参与者,所有参与者只要集齐t个参与者的解码后的子份额之和就可以完成插值计算,以得到一个由所有剩余参与者(步骤5后保留下来的参与者)最初生成的第一随机数si的和构成的随机数种子s。原来的多项式之和的插值公式如下:

其中,z为插值公式f()的自变量。在公式(3-20)中代入z=0即得到随机数种子s,该随机数种子s即是每个参与者最初生成的第一随机数的和,其数学表达形式如下:

最终,对随机种子s再做一次哈希运算,就得到本章所提方案生成的可验证随机数s,即

s=hash(s)(3-22)

对于vbft共识机制中,除本发明背景技术的记载外,还存在一个安全漏洞,在共识节点的选择过程中,vbft共识机制通过投票节点对备选共识节点进行权益值投票以构造dpos节点表(dpos节点表为记录参与一次vbft共识机制的共识节点的表),最终在表中的节点即是共识节点,而未入表的节点则等待下一轮共识,这个过程也可能被恶意的节点利用从而操纵dpos节点表的构造过程。现有的vbft共识机制流程中,在共识的初始阶段,由于在每个共识的周期中dpos表只能容纳1024个节点,且节点在dpos表中的先后顺序是按节点权益值的大小排序的,那么可能会出现如下情况:假设前1020个节点已经按权益值排序完毕并且已经被记录在dpos表中,并且网络中还剩下8个节点的权益值都为e,此时便发生了入表的冲突,即这8个节点中的哪4个节点可以被记录到dpos表中参与共识,而哪4个节点被排除在表外,这一问题在vbft共识机制中没有得到解决。然而,即使我们确定了在这种情况下哪4个节点可以被记录在表中,也可能会有如下更严重的问题产生。假设在这8个节点中前4个节点的权益值记为e1,后4个节点的权益值记为e2,若e1-e2=1,即前4个节点的权益值只比后4个节点的权益值大1,而后续可以对这8个节点进行投票的节点只剩下一个,按照dpos表的构建规则,如果最后的投票节点对这8个节点所投票的权益值相同的话则前4个节点应该安全入表,后4个节点无法进表而等待下一轮共识。但是如果此时最后一个投票的节点是恶意的节点,并且假设其拥有的投票权益值为8,若此恶意节点将他的投票的权益值都投给后4个节点,则后4个节点的权益值e2会超过前4个节点的权益值e1,导致后4个节点反而被记录进dpos表而前4个节点落选。或者如果此恶意节点把他的投票权益值只投给后4个节点中的一个或几个节点中,则也会导致被选择入表的节点的变化以及节点在表中先后顺序的变化。此安全漏洞可以总结为只要待入表的节点的权益值的差没有超过后续恶意节点所持有的投票权益值,那么后续未投票的恶意节点即可以通过他的恶意投票行为选择哪些节点可以被加入dpos表中以及入表节点在表中的排序。基于此安全漏洞,还可能出现投票节点贿赂待入表的节点或者待入表的节点贿赂投票节点的情况,还有可能出现大量的待投票节点都迟迟不投票而希望自己的投票顺序可以尽可能的靠后的情况,这对共识的公平性是一种严重的伤害。因此,在vbft共识机制中,在执行本发明在vbft共识机制的随机数生成方法之前还包括dpos表构建方法,通过dpos表构建得到随机数生成方法用到的共识节点,dpos表中的节点均作为随机数生成方法的共识节点p。

经典的vbft共识流程中dpos表的构建是随着其他权益节点的投票而逐渐完成的,在这个过程中每当有新的投票节点对备选共识节点投票,则备选共识节点的权益值即dpos值就会更新,并且对其他备选共识节点以及投票节点公开。本发明提出基于椭圆曲线加密和非交互式零知识证明等技术的dpos节点表的构造方案,记作i-dpos方案,详细步骤如下:

在i-dpos方案中,投票节点对备选共识节点进行权益值投票,所有投票节点的投票同时进行,每个投票节点所投的权益值以及投给了哪些备选共识节点不对外公开,而每个备选共识节点接收到其他投票节点的投票权益值时,都把其收到的每个权益值用自己的公钥加密得到加密后的权益值、并生成一个零知识证明记为第三零知识证明,其加密后的权益值及第三零知识证明对其他所有备选共识节点公开,最终当所有投票节点投票完成后,每个备选共识节点都把收到的所有加密后的权益值进行同态相加并用自己的私钥进行解密,同时附上一个关于解密的正确性的零知识证明记为第四零知识证明,再进行解码后最终得到的即是所有投票节点给该备选共识节点投票的总权益值。dpos表根据所有备选共识节点投票的总权益值得到,此时一个初始的dpos表。其他备选共识节点和所有投票节点可以根据该备选共识节点发布的第三零知识证明验证其加密的正确性,其他备选共识节点和所有投票节点都可以根据该备选共识节点发布的第四零知识证明验证其解密的正确性,若有一个第三零知识证明或第四零知识证明验证失败,则记该备选共识节点为恶意的节点并将其移除出dpos表,由没有进dpos表的权益值最大的备选节点候补入dpos表,候补节点再验证候补入dpos表的备选节点的加密和解密正确性,若验证不通过,则采用上述候补方法继续更新dpos表,直至dpos表中所有备选节点均通过第三零知识证明或第四零知识证明验证,得到最终给的dpos表,dpos表构建完成。i-dpos节点表的构造方案中的加解密以及零知识证明的生成和验证依然基于椭圆曲线,且所有参数的选择和本发明随机数生成方法中的参数选择保持一致。

我们记备选共识节点共为m个,投票节点共为n个,每个备选共识节点收到投票的投票节点个数为n'u(n'u≤n)个,m、n和n′u均为正整数,每个备选共识节点为pu,u表示该备选共识节点的序号,u∈m,v表示给该备选共识节点投票的投票节点序号,v∈n,pu每次收到的投票的权益值为euv,euv表示投票节点给pu投票的权益值。首先我们对该权益值进行编码,使该权益值成为椭圆曲线上的一点,权益值的编码方式与本发明所提mpc-rng方案中的编码方式相同,记编码后的权益值为e'uv,之后该备选共识节点pu生成一个第六随机数记作ruv,并用其自己的公钥pku对e'uv进行加密,描述这个过程的数学表达形式如下:

e'uv={ruvg,e'uv+ruvpku}(4-3)

并记e'uv1=ruvg、e'uv2=ruvpku,加密后该备选共识节点再生成一个非交互式零知识证明(即第三零知识证明),来证明它对其收到的权益值没有进行篡改,第三零知识证明的具体生成过程如下:

1)pu选择一个小于n'(椭圆曲线的阶)的第七随机数kuv,构建承诺三

quv=kuvg(4-4)

2)pu计算承诺三对应的挑战值三

cuv=hash(quv||e'uv1)(4-4)

3)pu计算应答值三

auv=kuv-cuv·ruv(4-5)

4)pu生成一个完整的第三零知识证明

proofuv=(quv,cuv,auv)(4-6)

其他备选共识节点都可以根据pu生成的非交互式第三零知识证明验证如下公式对于该备选共识节点pu是否成立:

quv=auvg+cuve'uv1(4-7)

若等式(4-7)验证通过,则表明pu对接收到的权益值进行了正确的加密而没有篡改或伪造;若验证未通过,则表明pu是恶意的节点,将其从dpos表中移除并删除其所有相关数据。

当全部可投票的节点都投票后,该备选共识节点把所有收到的并且加密过的权益值进行同态相加,其公式如下:

经过同态相加之后得到的e'u即是对所有投票节点的权益值加密后得到的权益值之和,这些节点个数共n'u个,之后再用自己的私钥对未解码的加密的权益值之和进行解密,这个过程的描述公式如下:

e'u=e'u2-skue'u1(4-9)

之后pu对e'u进行解码,其解码方式与mpc-rng方案中的解码方式相同,解码后得到发送给pu的权益值之和eu,并附上一个关于解密的正确性的零知识证明来证明它执行了正确的解密。第四零知识证明的具体生成过程如下:

pu选择一个小于n'(椭圆曲线的阶,与mpc-rng方案中的相同)的第八随机数ku,构建承诺四

qu=kug(4-10)

2)pu计算承诺四对应的挑战值四

cu=hash(qu||e'u1)(4-11)

3)pu计算应答值四

au=ku-cu·sku(4-12)

4)pu生成一个完整的第四零知识证明

proofu=(qu,cu,au)(4-13)

其他备选共识节点都可以根据pu生成的非交互式第四零知识证明验证如下公式对于该备选共识节点pu是否成立:

qu=aug+cue'uv1(4-14)

若等式验证通过,则表明pu对接收到的权益值之和进行了正确的解密而没有对其进行篡改或伪造;若验证未通过,则表明pu是恶意的备选共识节点,将其从表中移除并删除其所有相关数据。

最终得到的即是所有投票节点给该备选共识节点投票的总权益值,在这个过程中,所有的投票节点都无法看到备选节点在dpos表构建过程中所收到的权益值,也就无法根据自己手中持有的权益值恶意的影响哪些备选共识节点可以入表以及备选共识入表的顺序。而当所有投票节点投票完成后,每个备选共识节点都将自己收到的权益值之和以及零知识证明公开,所有备选共识节点按照各自权益值的大小排序并根据dpos表所能容纳的节点总数n将前n个备选共识节点选入表中,成为vbft的共识节点。

基于所提出的公开可验证随机数生成方案和所提出的改进的dpos节点表的构造方案,提出了一种改进的vbft共识机制系统。改进的vbft共识机制系统包括备选共识节点集、拥有权益值的投票节点集,以及根据投票节点选出来的共识节点集,并且其中每个节点都充当了零知识证明的验证节点(与经典的vbft共识机制节点角色中的验证节点不同)。首先系统完成初始化,包括生成系统参数,生成节点的公私钥,基于备选共识节点集,进行投票并运行i-dpos方案,在所有备选共识节点的零知识证明均通过后完成dpos表节点的选择和构建,得到共识节点集。之后每个共识节点运行mpc-rng方案,在方案运行的过程中将生成的零知识证明发送给其他所有共识节点,其他共识节点验证零知识证明的正确性,验证通过后输出mpc-rng方案生成的可验证随机数s,最后系统根据mpc-rng方案生成的可验证随机数s选择提案节点集、验证节点集和确认节点集,并结合dpos表完成最终出块节点的选择。改进的vbft共识机制在系统初始化完成后的共识流程如图3所示,具体流程如下:

(1)提案新区块:在此阶段共识网络中的备选区块提案节点构建自己的备选区块,并完成在网络中提交。所有共识节点运行本发明的基于安全多方计算的可验证随机数s生成方案共同生成一个256bits的可验证随机数s,s的0-15bits用于选择第r个区块的提案节点,16-135bits用于选择第r个区块的验证节点,136-255bits用于选择第r个区块的确认节点。每个节点根据可验证随机数s的比特位数判断自己是否为备选提案节点。每个提案节点构建自己的备选区块,并把区块广播出去。如果超过一定时间没有区块被广播,则非备选提案节点向网络中提案空区块。

(2)验证新区块:在此阶段共识网络中的所有节点对网络中的备选区块进行验证,并对最高优先级的区块提案进行背书。所有共识节点通过s可以判断其是否为验证节点,每个验证节点可以收到多个区块的提案,以s产生的提案节点顺序作为提案节点的级别。每个验证节点针对其收到的区块先进行提案节点优先级的排序,而每个验证节点只对其收到的提案节点最高级别的区块进行背书,并把背书结果广播出去。

(3)提交区块:对所有完成背书的区块进行确认,按照s值中定义的提案节点等级进行排序。若某个区块的背书数量大于系统的门限值t,则将该区块提案设置为确认状态。对处于确认状态的区块产生一个承诺(即数字签名),并把签名广播出去。

(4)确定区块:所有共识节点通过s可以判断生成承诺的节点其是否为确认节点。一定时间之后,如果某个区块的签名的数量大于系统的门限值t,则共识流程完成,该区块(图3的新区块)上链。

本发明vbft共识机制的随机数生成方法和共识机制,基于安全多方计算和零知识证明等技术提出了一种公开可验证随机数生成方案mpc-rng方案,代替经典vbft共识机制中的vrf来生成随机数。该方案高效且安全,该方案可以使互不信任的多方共同生成一个安全的真随机数,即可以生成由多方完成计算、任何人可验证的随机数,且随机数的真伪以及生成过程可以被任何人验证。通过该方案,任何人都不知道他人的任何隐私信息及计算时的输入数据,但任何人都可以验证其中每个人计算的正确性。更重要的是,在该方案中,只要有一个诚实的参与者,最终生成的随机数便是随机且不可预测的。

本发明基于椭圆曲线加密和零知识证明等技术提出了一种改进的dpos节点表的构造方案i-dpos方案。该方案可以隐藏dpos节点表的构建过程中投票节点对备选共识节点投票的权益值,使恶意投票节点无法利用自己投票的权力控制节点表中的节点选择以及表中节点的排序;同时备选共识节点无法隐藏或篡改自己所接收到的每个投票节点给该备选公式节点投票的权益值。因此恶意投票节点无法控制dpos节点表中节点的选择及顺序,大大降低了投票节点和备选共识节点间相互贿赂的可能。

基于所提出的公开可验证随机数生成方案mpc-rng方案和所提出的改进的dpos节点表的构造方案i-dpos方案,本发明提出的一种改进的vbft共识机制系统。针对vbft共识机制中的安全性问题,在共识的提案新区块阶段,基于所提出的基于安全多方计算的公开可验证随机数生成方案多方联合生成随机数,替代经典的vbft共识机制中通过可验证随机函数生成随机数的方法,并通过本发明方案中生成的随机数来确定区块链网络中节点的角色类型以及出块的先后顺序。在共识的初始化阶段,用所提出的改进的dpos节点表的构造方案进行备选共识节点的入表选择及排序,从而保证了共识的安全性,有效解决了原共识算法中存在的安全漏洞。本发明的vbft共识机制系统,很好的解决了传统vbft共识机制中的安全性问题,一、防止了提案节点可能的作弊方式,二、防止了投票节点和备选共识节点间的贿赂问题和可能的恶意行为。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1