发明内容
为解决以上现有技术存在的技术问题,本发明提出了一种基于动态节点的拜占庭容错共识协议的数据共识方法,该方法包括:构建区块链系统,该系统包括副本节点、主节点、C-collector节点以及E-collector节点,采用基于动态节点的拜占庭容错共识协议对数据进行共识的过程包括:
S1:初始化系统的共识参数和各个节点的密钥;
S2:根据初始化的共识参数随机选取节点作为共识组;
S3:更新共识组中的各个节点,得到新的共识组;更新共识组包括新的节点加入共识组或者共识组中的节点被撤销;其中,共识组中的节点被撤销包括:节点分布式主动退出共识组、节点分布式被动撤销共识组以及退出节点密钥管理;
S4:在新的共识组节点中选取主节点,并随机选取C-collector节点和 E-collector节点;
S5:主节点接收来自客户端的请求信息,并将请求信息打包成区块后广播到共识组的所有节点;
S6:每个节点采用自己的私钥ski对区块信息进行签名,并将签名发送给 C-collector节点;
S7:C-collector节点确定接收的数据,根据接收的数据判断执行fast-path 数据共识过程或者执行linear-PBFT数据共识过程。
优选的,初始化系统的共识参数和各个节点的密钥包括:
S11:确定共识小组的初始节点数n;
S12:确定签名初始阈值参数t1、t2以及t3,该参数用于判断共识是否进入下一阶段以及是否进行双视图的转换;
S13:每个节点运行分布式密钥生成算法生成各自的私钥ski,并根据私钥计算公钥pki,并将公钥广播给给个节点;
S14:每个节点运行共识算法,对初始化过程中生成的公共参数params达成分布式一致,所述公共参数包括共识小组初始节点数、签名阈值参数以及公私钥集。
优选的,新的节点加入共识组的过程包括:
步骤1:新加入节点向共识组节点发送加入申请;
步骤2:共识组节点验证新加入节点身份,对其包含身份信息的数据进行签名,并将签名后的数据发送给C-collector;
步骤3:C-collector若收到所有节点的签名消息,则将其聚合并广播给共识组的所有节点;
步骤4:共识组节点根据新加入节点的身份,生成对应的私钥份额发送给新加入节点;
步骤5:新加入节点将签名份额进行累加,得到自己的私钥,根据私钥计算自己的公钥,并将公钥广播给共识组的所有节点;
步骤6:共识组节点将新加入节点的公钥添加至公共参数中,并进行一次公共参数的共识。
优选的,节点分布式主动退出共识组的过程包括:
步骤1:主动退出节点向共识组节点发送退出申请;
步骤2:共识组节点验证退出消息的有效性,并发送签名给E-collector;
步骤3:E-collector若收到超过(2n)/3的节点发来的签名消息,则将其聚合并广播给共识组的所有节点;
步骤4:共识组节点验证聚合签名的有效性,然后向主动退出节点发送退出成功消息;
步骤5:共识组节点将其退出消息记录在撤销列表CRL中,删除公共参数中退出节点的公钥,并发送退出成功消息给主动退出节点;
步骤6:共识组节点广播撤销列表,对撤销列表以及公共参数达成分布式一致。
优选的,节点分布式被动撤销共识组的过程包括:
步骤1:共识组节点广播投诉消息给共识组的所有节点;
步骤2:共识组中的节点若收到超过(2n)/3的节点发来的投诉消息,则发送签名给E-collector;
步骤3:E-collector若收到(2n)/3的签名消息,则将签名进行聚合并广播退出成功消息给共识组的所有节点;
步骤4:共识组节点将其退出消息记录在撤销列表CRL中,删除公共参数中退出节点的公钥;
步骤5:共识组节点广播撤销列表,对撤销列表以及公共参数达成分布式一致。
优选的,退出节点密钥管理的过程包括:
步骤1:若退出节点为初始共识组节点,则退出节点在分布式密钥生成中所使用多项式将由其余节点赋予新加入的某个节点,此时这个节点拥有与初始签名组同等的权利;
步骤2:若退出节点不为初始共识组节点,则无需进行多项式的权利变更操作,直接退出共识组。
优选的,选取主节点的过程包括:
S41:获取全网公知的数seed,根据数seed和该节点的私钥ski采用确定性算法F生成随机数value;设置阈值条件,该阈值条件为分布在1~n之内的随机数;将生成的随机数与设置的阈值条件进行对比,若该随机数满足设置的阈值条件,则生成该随机数的节点为当前主节点,否则,该节点不为主节点;
S42:将全网公知的数seed和私钥输入到确定性算法F中,生成随机数的证明proof;
S43:验证proof是否可以正确计算出value,且value是否由ski的拥有者所生成;其中验证过程在主节点发布打包区块之后,由共识组其余节点进行验证,判断其是否为当前主节点。
优选的,根据接收的数据判断执行fast-path数据共识过程或者执行 linear-PBFT数据共识过程:设置数据接收时间阈值,在设置的数据接收时间阈值范围内确定C-collector节点接收的数据量,若在接收的数据量未超过3f+c+1,则执行fast-path数据共识过程;若在数据接收时间阈值内超过3f+c+1,则执行执行linear-PBFT数据共识过程;其中,f表示可容忍的拜占庭节点个数,c表示冗余服务器的个数。
进一步的,执行fast-path数据共识过程包括:
步骤1:C-collector节点对签名进行聚合,并将聚合签名发送至共识组所有节点;
步骤2:每个节点收到聚合签名后,将签名提交到区块,并执行客户端请求,对当前区块状态摘要d=digest(Dx)进行签名,并将该签名发送给E-collector节点;其中digest表示哈希函数,Dx表示区块状态;
步骤3:E-collector节点将签名进行聚合,并将聚合签名发送至共识组所有节点以及客户端;
步骤4:客户端验证共识操作是否被执行,若被执行,则共识完成,否则共识无效。
进一步的,执行linear-PBFT数据共识过程包括:
步骤1:C-collector节点对签名进行聚合,并将聚合签名发送至共识组所有节点;
步骤2:每个节点收到聚合签名后,对聚合签名再进行一次签名并发送给 C-collector节点;
步骤3:C-collector节点将签名进行聚合,并将聚合签名发送至共识组所有节点;
步骤4:每个节点收到聚合签名后,提交区块,并执行客户端请求,对当前区块状态摘要d=digest(Dx)进行签名,并将该签名发送给E-collector节点;其中 digest表示哈希函数,Dx表示区块状态;
步骤5:E-collector节点将签名进行聚合,并将聚合签名发送至共识组所有节点以及客户端;
步骤6:客户端验证共识操作是否被执行,若被执行,则共识完成,否则共识无效。
本发明的有益效果:
本发明在SBFT共识的基础上,主要利用VRF、聚合签名、DKG等密码学技术,设计了准入协议、撤销协议以及相关消息类型的数据结构,实现了主节点的匿名选取、节点的动态加入、退出以及节点密钥的分布式授权。该协议可以在无需停机进行节点信息重配置的条件下,实现节点的分布式加入、退出,同时也能够抵御对主节点的自适应攻击。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
一种基于动态节点的拜占庭容错共识协议的数据共识方法,包括:获取待共识的节点,采用拜占庭容错共识协议对待共识的节点进行共识。
本发明实施例提供了一种面向节点动态变化的拜占庭容错共识协议,该协议由VRF、聚合签名、DKG等密码学技术实现。在区块链共识过程中的节点用于实现数据的分布式一致性。所述节点除了进行投票外,还可以拥有额外的角色(功能):主节点、C-collector、E-collector。主节点:接收客户端的请求消息,并将请求消息打包成区块广播给所有的节点。C-collector:收集提交消息并将(组合的)签名发送回所有节点,以便节点拥有块可以被提交的证书。 E-collector:收集执行消息并将(组合的)签名发送回所有节点和客户端,表明当前状态是持久并且操作已经被执行。
一种基于动态节点的拜占庭容错共识协议的数据共识方法的具体实施方式,如图1所示,该方法包括构建区块链系统,该系统包括副本节点、主节点、 C-collector节点以及E-collector节点,采用基于动态节点的拜占庭容错共识协议对数据进行共识的过程包括:
S1:初始化系统的共识参数和各个节点的密钥;
S2:根据初始化的共识参数随机选取节点作为共识组;
S3:更新共识组中的各个节点,得到新的共识组;更新共识组包括新的节点加入共识组或者共识组中的节点被撤销;其中,共识组中的节点被撤销包括:节点分布式主动退出共识组、节点分布式被动撤销共识组以及退出节点密钥管理;
S4:在新的共识组节点中选取主节点,并随机选取C-collector节点和E-collector节点;
S5:主节点接收来自客户端的请求信息,并将请求信息打包成区块后广播到共识组的所有节点;
S6:每个节点采用自己的私钥ski对区块信息进行签名,并将签名广播到 C-collector节点;
S7:C-collector节点确定接收的数据,根据接收的数据判断执行fast-path 数据共识过程或者执行linear-PBFT数据共识过程。
具体的,拜占庭容错共识协议包括:
S1、初始化:共识参数以及节点密钥初始化。
S11、确定共识小组初始人数n。其中,n=3f+2c+1,f为可容忍的拜占庭节点个数,c为冗余服务器的个数。所述共识小组中的每个节点P={P1,P2,...,Pn}拥有唯一的身份标识ID={id1,id2,...,idn}。其中Pn表示第n个共识小组中的节点,idn表示第n个共识小组中的节点身份标识。
S12、确定签名初始阈值参数t1=3f+c+1,t2=2f+c+1,t3=f+1,所述参数用于判断共识是否进入下一阶段以及是否进行双视图的转换。
S13、每个节点pi运行分布式密钥生成算法生成各自的私钥ski,计算自己的公钥pki并广播给每个节点。
S131、每个节点pi选择两个t2-1多项式和并广播/>其中i=1,2,...,n,k=0,1,...,t2-1;其中,t2-1表示多项式的阶数,fi(z)表示生成私钥分片所需的多项式,fi'(z)表示生成承诺分片所需的多项式,z表示未知数,/>表示第t2个系数,Ai,k表示用于验证私钥分片的公共参数;/>表示对两个多项式的隐藏式处理,使得其在不泄露系数的情况下,也可用于验证;mod表示模,p表示大素数,g和h 均为有限域GF(p)上的生成元,其中多项式的系数都必须是1~p-1范围内的整数。
S132、每个节点pi计算si,j=fi(idj)和s'i,j=fi'(idj),并发送si,j、s'i,j给对应的节点pj,同时公开其中,si,j表示私钥分片,s'i,j表示承诺分片,/>表示用于对公钥进行验证的公共参数。
S133、每个节点pi通过验证是否等于/>来判断证其他节点发来的sj,i的有效性,若通过验证,则计算自己的私钥ski=∑sj,i;其中,/> 表示用于验证私钥分片的公共参数。
S134、每个节点pi计算自己的公钥并公开。
S135、每个节点pi计算验证其他节点pj公钥的正确性,并将其加入自己的公共参数集中。所述验证方式为:等式成立,则公钥正确。
S14、每个节点运行共识算法,对初始化过程中生成的公共参数 params={n,c,f,ID,t1,t2,t3,PK}达成分布式一致。其中,n表示共识组节点个数,c表示冗余服务器的个数,f表示可容忍的拜占庭节点个数,t1=3f+c+1,t2=2f+c+1,r3=f+1,PK表示公钥。
S2、主节点选取:主节点的匿名选取。如图2所示,对主节点的匿名选取的过程包括:
S21、随机数生成,向确定性算法F输入全网公知的某个数seed以及私钥ski,生成随机数value。所述随机数满足一定的阈值条件,则生成该随机数的节点被选中为当前主节点。
S22、证明生成,向确定性算法F输入全网公知的某个数seed以及私钥ski,生成随机数的证明proof。所述证明为零知识证明,可以用于验证随机数生成的真实性。
S23、验证,验证proof是否可以正确计算出value,验证value是否由ski的拥有者所生成。所述验证过程在主节点发布打包区块之后,由共识组其余节点进行验证,判断其是否为当前主节点。
S3、共识执行:对来自客户端的请求达成最终一致性。
所述共识执行过程如图3~4所示,图3表示n=4,f=1,c=0的情况,具体的步骤包括:
S31、主节点接收来自客户端的请求消息<″request″,o,t,k>,并将其打包成区块。所述区块将被广播至共识组的所有节点,广播的消息用<″pre-prepare″,s,v,r> 表示;其中,o表示操作,t表示时间戳,k表示客户端,s表示序列号,v表示视图编号,r表示请求的集合,request表示请求,pre-prepare表示预准备阶段。
S32、每个节点计算hi=H(s||v||r||idi),并利用私钥ski对h进行签名,并广播 <″Sign-accept″,s,v,idi,σi(hi)>消息至C-collector处。其中,σi(hi)中表示为第i个节点对hi的签名,hi表示对序列号,视图,共识轮次的哈希值,H表示哈希函数, Sign-accept表示签名接收阶段。
S33、C-collector将签名进行聚合,并将聚合签名发送至共识组所有节点,以便于节点拥有块可以被提交的证明。所述聚合签名附在全提交证明消息 <″full-commit-proof″,s,v,σ:PK′>上进行发送。其中,PK′表示聚合签名中使用的签名对应的拥有者公钥集,该公钥集用于进行聚合签名的验证, full-commit-proof表示得到全提交证明的阶段。
S34、每个节点收到聚合签名后,提交区块,执行请求,更新当前区块状态摘要d=digest(Dx),并对状态摘要d以及自身id进行签名,然后发送<"sign-state",s,idi,σi(d||idi)>消息给E-collector。其中,σi(d||idi)中表示为第i个节点对d以及自身id的签名,sign-state表示对区块状态进行签名的阶段。所述区块状态包含三种:Committed、Executed、Stable,此时区块的状态为Committed; Committed:至少一个正常的节点提交了该区块,Executed:至少一个正常的提交了1到s的所有区块,Stable:至少f+1个正常的节点提交了1到s的所有区块。
S35、E-collector将签名进行聚合,并将聚合签名发送至共识组所有节点以及客户端。所述发送给共识组节点的签名附在<"full-execute-proof",s,σ,PK'>消息上,表明当前状态是持久。
发送给客户端的签名附在<"execute-ack",s,l,val,o,σ,p,PK'>消息上,表明操作已经被执行。其中,val=execute(D,o)表示为根据操作o修改状态d,并返回val; p=proof(o,l,s,D,val)表示为区块s中第l个操作o执行后(状态变为D)的结果val的证明,其中,execute-ack表示执行确认阶段。
S36、客户端验证操作是否被执行,检查σ是否有效以及验证 verify(d,o,val,s,l,p)是否为真,其中verify表示验证函数。确认有效后客户端标记o 已执行,将val设置为返回值。
S4、双视图转换:快速模式与慢速模式的转换。上述共识执行过程为SBFT 的快速模式Fast-path。
S41、当在超时时间到达时,C-collector收集签名数量达到2f+c+1但未达到 3f+c+1,则直接进入Linear-PBFT模式。
S42、所述Linear-PBFT模式,包含两次C-collector的收集操作和一次E-collector的收集操作。
如图4所示,执行linear-PBFT数据共识过程包括:
步骤1:C-collector节点对签名进行聚合,并将聚合签名发送至共识组所有节点;
步骤2:每个节点收到聚合签名后,对聚合签名进行第二次签名并发送给 C-collector节点;
步骤3:C-collector节点将第二次签名进行聚合,并将聚合签名发送至共识组所有节点;
步骤4:每个节点收到聚合签名后提交区块,并执行客户端请求,对当前区块状态摘要d=digest(Dx)进行签名,并将该签名发送给E-collector节点;其中digest 表示哈希函数,Dx表示区块状态;
步骤5:E-collector节点将签名进行聚合,并将聚合签名发送至共识组所有节点以及客户端;
步骤6:客户端验证共识操作是否被执行,若被执行,则共识完成,否则共识无效。
S5、节点准入:节点分布式加入共识组。
所述节点分布式准入过程如图5所示,具体的步骤包括:
S51、新加入节点发送加入申请<"Join-Request",idr,w>给共识组的所有节点,其中w=H(idr||ts),IDr为新加入节点身份标识,ts为时间戳,w表示对节点身份和时间戳的哈希值。
S52、共识组节点验证新加入节点身份,对其包含身份信息的数据w进行签名后发送给C-collector,表明接受新节点的加入。所述签名附在<"Sign-accept-join"σ,i w(idi||>消息上进行发送。
S53、C-collector若收到所有节点的签名消息,则将签名进行聚合,并生成一个全接受证明<"full-accept-proof",σ,PK>广播给共识组的所有节点。
S54、共识组节点验证聚合签名的有效性后,根据新加入节点的身份IDr,生成对应的私钥份额以及证明发送给新加入节点。所述私钥份额和证明分别为 si,r=fi(IDr)、s'i,r=fi'(IDr)。所述私钥份额和证明附在<"SK-GEN",si,r,s'i,r,idi,σi(si,r||s'i,r)>消息上进行发送,SK-GEN表示私钥生成阶段。
S55、新加入节点通过验证是否等于/>来判断证其他节点发来的si,r的有效性,若通过验证,则计算自己的私钥skr=∑si,r,/>同时,广播自己的公钥给共识组的所有节点。所述公钥将附在消息<"PK-DIST",pkr,σr(idr||pkr)>进行发送。
S56、共识组节点将新加入节点的公钥添加至公共参数中,并进行一次公共参数的共识。
S6、节点撤销:节点分布式退出共识组。所述节点分布式退出共识组,包含两种方式:一是主动退出,二是被动撤销。所述节点分布式主动退出过程如图6 所示,具体的步骤包括:
S61、主动退出节点计算w′=H(pkn||idn),并发送退出申请<"Quit-Request",idn,σn(w')>给共识组的所有节点。所述主动退出节点假设为pn。
S62、共识组节点验证退出消息的有效性,计算vi'=(w'||idi),并发送签名给 E-collector。所述签名附在消息<"Sign-accept-quit",idi,σi(vi')>进行发送。
S63、E-collector若收到超过(2n)/3的节点发来的签名消息,则将签名进行聚合并广播给共识组的所有节点。所述聚合签名附在消息<"accept-proof",σ,ts>进行发送。
S64、共识组节点验证聚合签名的有效性,然后向主动退出节点发送退出成功消息<"Quit-success",ts,idi,σi(ts||idi)>。
S65、共识组节点将其退出消息<"Quit-MSG",idn,ts,pkn>记录在撤销列表CRL中,删除公共参数中退出节点的公钥,并发送退出成功消息给主动退出节点。
S66、共识组节点广播撤销列表,对撤销列表以及公共参数达成分布式一致。
S7、节点撤销:节点分布式退出共识组。所述节点分布式退出共识组,包含两种方式:一是主动退出,二是被动撤销。所述节点分布式被动撤销过程如图7所示,具体的步骤包括:
S71、共识组节点广播投诉消息<"Complanit",IDn,idi,σi(w')>给共识组的所有节点。所述共识组投诉的对象假设为idn,所述w'=H(pkn||idn)。
S72、共识组中的节点若收到超过(2n)/3的节点发来的投诉消息,则发送签名给E-collector。所述签名附在<"sign-accept-quit",idi,σi(vi')>消息上进行发送。
S73、E-collector若收到(2n)/3的签名消息,计算vi'=(w'||idi)则将签名进行聚合并广播退出成功消息<"Quit-success",σ,ts>给共识组的所有节点。
S74、共识组节点将其退出消息记录<"Quit-MSG",idn,ts,pkn>在撤销列表CRL中,删除公共参数中退出节点的公钥。
S75、共识组节点广播撤销列表,对撤销列表以及公共参数达成分布式一致。
S8、节点撤销:节点分布式退出共识组。所述节点分布式退出共识组,包含退出节点密钥的处理,包括:
S81、若退出节点为初始共识组节点,则退出节点在分布式密钥生成中所使用多项式将由其余节点赋予新加入的某个节点,此时这个节点拥有与初始签名组同等的权利。所述新加入的某个节点假设为pr,向pr赋予的多项式的原始拥有者为pn。
S811、初始共识组的节点(不包括已经退出的)向pr发送(idn,fi(idn))。
S812、pr若收到超过t2-1条消息,则通过拉格朗日差值公式恢复出原本pn拥有的多项式。所述多项式用于给后续新加入节点赋私钥份额。
S82、若退出节点不为初始共识组节点,则无需进行多项式的权利变更操作,直接退出共识组即可。
本发明实施例中,主要在SBFT共识的基础上,利用VRF、聚合签名、DKG 等密码学技术,设计了节点准入协议、撤销协议以及相关消息类型的数据结构,实现了主节点的匿名选取、节点的动态加入、退出以及节点密钥的分布式授权。该协议可以在无需停机进行节点信息重配置的条件下,实现节点的分布式加入、退出,同时也能够抵御对主节点的自适应攻击。
以上所举实施例,对本发明的目的、技术方案和优点进行了进一步的详细说明,所应理解的是,以上所举实施例仅为本发明的优选实施方式而已,并不用以限制本发明,凡在本发明的精神和原则之内对本发明所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。