一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种应用于区块链的拜占庭容错共识方法与流程

2022-12-13 23:17:50 来源:中国专利 TAG:


1.本发明属于区块链技术领域,具体涉及一种应用于区块链的拜占庭容错共识方法。


背景技术:

2.区块链技术是一种分布式数据库技术,它提供了分布式共享账本和数据库,具有去中心化、数据难以篡改、完全可追溯保留、集体维护和稳健性等突出的特点。区块链技术将加密算法,分布式数据存储,点对点网络传输,共识机制等技术相结合,创造出了一个去中心化,透明自治,信任公开且不可篡改的价值交互平台,具有广泛的应用前景。
3.在区块链系统中,共识算法用于解决分布式账本的一致性问题。目前区块链常用的共识算法主要有pow(proof of work,工作量证明)、pos(proof of stake,权益证明)、dpos(delegated proof of stake,股份授权证明)和pbft(practical byzantine fault tolerance,实用拜占庭容错)等。其中pbft共识算法是一种可以容忍恶意节点的拜占庭容错算法,该算法是由miguel castro(卡斯特罗)和barbara liskov(利斯科夫)在1999年提出来的,它将算法复杂度由指数级降低到多项式级,解决了原始拜占庭容错算法效率不高的问题,算法的时间复杂度是o(n2),使得在实际系统应用中可以解决拜占庭容错问题。
4.然而,传统的pbft算法采用view change触发主节点轮换,用于处理各种投票超时和节点作恶场景,过程较为繁琐,实现较为复杂,且耗时长,而且在主节点出现宕机或者作恶的情况下,pbft算法是按照顺次选举的方式更换主节点,选举方式随意,导致下个主节点很有可能还是拜占庭节点,造成资源的浪费。


技术实现要素:

5.本发明基于上述背景和现有技术所存在的问题,拟设计一种应用于区块链的拜占庭容错共识方法,其提供了一种基于签名的交易分法方法,保证了交易分发过程随机且均匀,而不是集中发送给某个特定节点;一种基于区块高度与轮次的提名节点选取方法,每一轮更换合适的提名节点,保证系统安全;一种锁定和解锁的机制避免分叉的情况发生;引用gossip机制使得全网节点更快达成共识。
6.一种应用于区块链的拜占庭容错共识方法的技术方法,如下:
7.获取到交易信息后,将根据交易的签名分发对应共识节点的交易队列,共识节点根据出块策略出块;
8.将每一区块加入区块链的共识过程分为五个阶段:新高度阶段,提议阶段,预投票阶段,预提交阶段和提交阶段;预提交投票通过后将区块写入到区块链中,通过锁定和解锁机制来避免写入区块过程中可能出现的分叉情况;
9.在提议阶段,从共识节点中选举出一个节点作为提名节点,提名节点发起关于当前区块加入区块链的提议,并向其他共识节点广播所述的提议;
10.在预投票、预提交和提交三个阶段,各共识节点将对提议分别进行投票,在某一阶
段中超过总数2/3的共识节点投票通过了所述提议,将进入对应的下一阶段;
11.当在提议阶段中收到超时代码或合法提议和在预投票、预提交和提交阶段收到总数2/3以上节点投票的情况下,将引起共识节点的状态改变,采用gossip机制使全网中各共识节点尽快达到一致的状态。
12.基于签名的交易分法方法,其具体过程为:取交易签名的最后一位数据转化为整型数字;将得到的整型数字对共识节点的数量进行取模运算,得到余数;所得的余数即为当前交易需要分发的共识节点对象的下标。
13.从共识节点中选举出一节点作为提名节点的具体步骤如下:
14.(1)计算高度偏移量hf:当前高度加一除以每个节点可提的区块数,所得结果的整数部分即为高度偏移量;
15.(2)计算轮次偏移量rf:当前轮次对共识节点总数取余,得到结果即为轮次偏移量;
16.(3)计算提名节点下标pi:将(1)和(2)中所得的高度偏移量hf和轮次偏移量rf求和,讲所得的和对共识节点总数取余,得到结果即为提名节点下标。
17.所述的锁定和解锁机制包含如下内容:
18.在任意一轮中,区块具有的超过2/3的预投票被称作一个polka(波尔卡),超过2/3的空预投票称为nil-polka(空波尔卡);
19.锁定机制:各共识节点记录并维护在节点自身的共识状态中每个轮次中收到了polka的区块,即自己预提交投票签名过的提议,并锁定在所述提议描述的区块中;若当前节点锁定在某一区块,在更高的轮次中,所述节点作为非提名节点只能对该区块进行预投票,作为提名节点只能对该区块发起提议;
20.解锁机制:共识节点收到比自己锁定的区块轮次更高的提议的polka或nil-polka时,可以将自己解锁,并为所述更高轮次的提议进行预提交投票签名。
21.所述的gossip机制,节点之间的数据交互方式有以下三种:
22.(1)通过push的方式,发起信息交换的第一共识节点随机选择联系第二共识节点,并向其发送自己的信息,第二共识节点在收到信息后更新比自己新的数据,一般拥有新信息的节点才会作为发起节点;
23.(2)通过pull的方式,发起信息交换的第一共识节点随机选择联系第二共识节点,并从对方获取信息;无新信息的共识节点会作为发起节点;
24.(3)通过push和pull的方式,发起信息交换的第一共识节点向选择的第二共识节点发送信息,同时从对方获取数据,用于更新自己的本地数据。
25.所述的节点投票,其特征在于:节点投票数据存储结构中包括:
26.(1)节点投票类型,包括提议,预投票,预提交和提交四种,用来标识投票所属的阶段分别为提议阶段、预投票阶段、预提交阶段和提交阶段;
27.(2)节点投票的区块高度,用来标识节点投票提议中区块在的高度;
28.(3)节点当前投票轮次,用来标识节点投票提议中的区块的轮次;
29.(4)节点投票的区块哈希,用来确定节点投票提议中的区块是唯一的;
30.(5)投票节点下标,用来标识投票节点;
31.(6)投票节点的签名,用来保证该投票的唯一确定性。
32.所述的预投票阶段中,共识节点在不断监听是否有新的关于区块加入区块链的提议;各共识节点收到所述的提议后,验证该提议及提名节点的真实性、可靠性和合法性,验证通过后对该提议进行预投票签名,并广播到网络中,如果节点在规定提议时间内没有接收到一个有效的提议,其对该提议的预投票为空,当超过2/3的共识节点通过了该提议,预投票阶段就完成了,进入预提交阶段。
33.所述的预提交阶段中,每个共识节点都在不断接收网络中的预投票;节点如果收集到了共识节点总数2/3以上个预投票,则为这个提议广播预提交投票,并且当前节点锁定在所述提议上,同时释放之前锁定的提议,一个节点只能锁定在一个提议上;节点如果收到了共识节点总数2/3以上个空区块预投票,当前节点将释放之前锁定的所有提议;节点若没有收集到任何类型共识节点总数2/3以上个预投票,那么将不会锁定在任何提议;在预提交阶段后期,如果节点收集到了超过共识节点总数2/3个的预提交投票,那么节点进入到提交阶段,否则到下一轮的提议阶段。
34.所述的预提交阶段中,每个共识节点都在不断接收网络中的预投票;共识节点将对通过预投票提议的区块签名并广播预提交投票,在预提交阶段后期,如果节点收集到了超过共识节点总数2/3个的预提交投票,那么节点进入到提交阶段,否则到下一轮的提议阶段。
35.所述的提交阶段中,每个共识节点都在不断接收网络中的预提交投票;节点如果收集到了共识节点总数2/3以上个预提交投票,则为这个提议广播一个提交投票;节点在不断收集网络中的提交投票,如果收集到了共识节点总数2/3以上个提交投票,会将提交时间设置到当前时间上,并且会进入到新高度阶段,开启新的一轮。
36.在整个共识过程的任何阶段,一旦节点收到共识节点总数2/3以上个预提交投票,那么所述节点会立刻进入到提交阶段。
37.本发明至少包括以下有益效果:
38.1.基于签名的交易分发方法保证了交易分发过程随机且均匀,而不是集中发送给某个特定节点,实现了负载均衡,提升了系统性能;
39.2.提名节点的选举有利于去中心化,防止单点故障,增强系统的鲁棒性;
40.3.预投票、预提交、提交三个阶段投票相比于单阶段投票使得系统更加安全;
41.4.锁定和解锁机制避免了区块加入区块链时分叉情况的发生;
42.5.gossip机制使得全网中的节点更快达到一致的状态。
附图说明
43.图1为基于高度和轮次的出块过程图。
44.图2为共识五阶段流程图。
45.图3为基于签名的交易分发示意图。
具体实施方式
46.为了清晰地阐述本发明,使本发明实施例的目的、技术方案和优点更加清楚,下面结合了本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,以令本领域技术人员参照说明书文字能够据以实施。下面将附图结合具体实施方式对本发明的
技术加以详细说明。
47.如图1所示,基于高度和轮次的出块流程总的来说有五个步骤不断循环执行:
48.第1步:进入新的高度阶段,等待时间后,进入提议阶段。
49.第2步:提议阶段,选举提名节点,然后提名节点提交一个当前区块加入区块链的提议,进入预投票阶段;
50.第3步:预投票阶段,节点对收到的提议进行预投票,当达到2/3的预投票后进入预提交阶段;
51.第4步:预提交阶段,进行预提交投票,当达到2/3的投票后进入提交阶段;未达到重新进入提议阶段,即第2步;
52.第5步:提交阶段,准备好新的高度以及广播新的状态给节点,进入第1步。
53.如图2所示,共识的五阶段流程如下:
54.预投票阶段:
55.1.节点不断监听是否有新的提议区块。
56.2.在每个节点进行预投票阶段的投票之前,需要先判断自己是否锁定在上一轮的提议上:
57.(1)是则继续签名广播上一轮锁定的提议并广播预投票;
58.(2)否则签名广播当前轮提议描述的区块并广播预投票;
59.(3)某些原因导致节点没有锁定或收到任一提议,那么就签名广播一个空的预投票。
60.预提交阶段:
61.1.对于每一个节点不断接收网络中的预投票;
62.2.在预提交开始阶段,节点会收集预投票:
63.(1)如果达到了总数的2/3个预投票,则为这个区块签名广播预提交投票,并且当前节点锁定在此提议上,同时释放之前锁定的提议,一个节点只能锁定在一个提议中;
64.(2)如果其收到了超过2/3的空的预投票,那么释放之前锁定的所有提议;
65.(3)如果没有收集超过任何2/3的预投票,那么其不会锁定在任何提议。
66.提交阶段:
67.1.对于每一个节点不断接收网络中的预提交投票;
68.2.在预提交阶段后期,如果节点收集到超过2/3的预提交投票,那么节点进入到提交阶段,否则进入下一轮的提议阶段;
69.提交阶段分为两个并行的步骤:
70.(1)节点收到了节点总数2/3以上个预提交投票,所述节点会为这个区块广播一个提交投票;
71.(2)节点需要为被全网络预提交投票通过的提议,收集到超过2/3的提交投票。
72.一旦两个条件全部满足了,节点会将提交时间设置到当前时间上,并且会进入新高度阶段,开启新的一轮。
73.在整个共识过程的任何阶段,一旦节点收到超过2/3的预提交投票,那么它会立刻进入到提交阶段。
74.如图3所示,基于签名的交易分发过程如下:
75.第1步:取交易签名最后一位数据,并将这一位数据转化成int类型,即一个整型数字;
76.第2步:将上一步得到的数字对共识节点数量进行取模运算,得到余数;
77.第3步:确定当前交易需要分发的共识节点对象,即标记为1的共识节点。
78.如表1所示,节点的数据存储结构如下:
[0079][0080]
表1节点投票数据存储结构
[0081]
锁定机制:各共识节点记录并维护在节点自身的共识状态中每个轮次中收到了polka(波尔卡)信号的区块,即自己预提交投票签名过的提议,并锁定在所述提议描述的区块中;若当前节点锁定在某一区块,在更高的轮次中,所述节点作为非提名节点只能对该区块进行预投票,作为提名节点只能对该区块发起提议
[0082]
没有锁机制下的问题场景描述:
[0083]
四个共识节点分别a,b,c,d在r轮对区块blockx达成polka信号对应的共识;
[0084]
a由于网络原因没有知晓该polka,于是pre-commit nil,b、c、d则pre-commit blockx;
[0085]
只有d收到了足数的pre-commit,于是d提交blockx,a、b、c进入r 1轮;
[0086]
r 1轮中a、b、c提交了新区块blocky;
[0087]
结果是仅仅因为网络问题,在没有拜占庭节点的情况下就发生分叉;引入锁机制后,b、c锁定在blockx,在r 1轮就不能pre-vote给blocky,blocky无法被共识通过。
[0088]
锁机制避免了节点在前一轮pre-commit了区块a,却又在下一轮pre-vote区块b、促成区块b的polka,同时它带来的结果是某个轮次中一旦出现对某个区块 2/3的pre-commit,网络中的节点就都锁定在该区块,无法在更高轮次中的就新区块达成polka,出现共识不可用的情况(见下面的问题场景描述),因此需要有解锁机制,让节点在满足条件的情况下可以放弃锁定着的区块,进入到更高轮次。
[0089]
解锁机制:共识节点收到比自己锁定的区块轮次更高的提议的polka或nil-polka时,可以将自己解锁,并为所述更高轮次的提议进行预提交投票签名。
[0090]
只有锁定而没有解锁机制下的问题场景描述:
[0091]
r轮中a、b pre-commit给blockx,c、d pre-commit给nil-polka(空波尔卡),无法达成共识,进入r 1轮;
[0092]
r 1轮中提案的区块是blocky,c、d pre-vote给blocky;
[0093]
a是拜占庭节点,尽管锁定在blockx,但也恶意pre-vote给blocky,使得blocky达成polka;
[0094]
b没有知晓blocky的polka,pre-commit给nil-polka;
[0095]
a下线;
[0096]
c、d pre-commit blocky;
[0097]
进入r 2轮,此时b锁定在r轮的blockx,c、d锁定在r 1轮blocky,a离线;
[0098]
后续轮次再也无法达成polka,拜占庭节点少于1/3的情况下就出现了这种局面。
[0099]
有了解锁机制,若a保持离线,c、d pre-vote blocky但达不成polka,apre-vote blockx也达不成polka,所以3个节点等待polka超时(roundstepprevotewait)后在pre-commit阶段都会投票给nil-polka。
[0100]
roundstepprevotewait和roundstepprecommitwait阶段表示收到了对block和对nil-polka的 2/3的投票,但对单独的block或nil-polka都还不能凑足 2/3。
[0101]
上述对实施例的描述是为便于本技术领域的普通技术人员能理解和应用本发明。熟悉本领域技术的人员显然可以容易地对上述实施例做出各种修改,并把在此说明的一般原理应用到其他实施例中而不必经过创造性的劳动。因此,本发明不限于上述实施例,本领域技术人员根据本发明的揭示,对于本发明做出的改进和修改都应该在本发明的保护范围之内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献