CN112104482A - 一种基于并行投票的共识方法 - Google Patents
一种基于并行投票的共识方法 Download PDFInfo
- Publication number
- CN112104482A CN112104482A CN202010801993.8A CN202010801993A CN112104482A CN 112104482 A CN112104482 A CN 112104482A CN 202010801993 A CN202010801993 A CN 202010801993A CN 112104482 A CN112104482 A CN 112104482A
- Authority
- CN
- China
- Prior art keywords
- block
- node
- consensus
- voting
- block group
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L41/00—Arrangements for maintenance, administration or management of data switching networks, e.g. of packet switching networks
- H04L41/04—Network management architectures or arrangements
- H04L41/042—Network management architectures or arrangements comprising distributed management centres cooperatively managing the network
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
- H04L67/104—Peer-to-peer [P2P] networks
- H04L67/1044—Group management mechanisms
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
- H04L67/104—Peer-to-peer [P2P] networks
- H04L67/1044—Group management mechanisms
- H04L67/1051—Group master selection mechanisms
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Theoretical Computer Science (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明适用于互联网技术建设改进领域,提供了一种基于并行投票的共识方法,包括:S1、在系统中从配置文件读取初始化信息,并将初始化信息打包成创世区块组且发布到网络中;S2、网络节点接收到初始化信息后进行投票共识产生多个普通区块组;S3、在生产普通区块组时根据投票共识生成一个特殊区块组;S4、利用创世区块组、普通区块组及特殊区块组的并行处理完成投票共识。并行投票共识PPoV中各个记账节点和投票节点之间的通信负载是相同的,在负载均衡的情况下,可以最大效率地利用带宽资源,提高系统的吞吐量。
Description
技术领域
本发明属于互联网技术建设改进领域,尤其涉及一种基于并行投票的共识方法。
背景技术
中本聪于2008年发表的《比特币:一种点对点的现金系统》白皮书标志着比特币和区块链技术的诞生,数字加密货币热潮的兴起也推动了区块链技术的发展,使其成为计算机技术的一个重要的研究方向。区块链将数据存储在被称为区块的数据结构中,各个区块之间通过hash值连接构成一条通过密码学保证安全性的数据链。区块链具有去中心化、数据内容不可篡改等特点,其核心是共识算法。比特币所使用的共识算法是工作量证明(PoW,Proof of Work)共识算法,运行比特币软件的计算机或者服务器共同构成一个完全去中心化的P2P网络,网络中的各个节点都是对等的。比特币网络通过工作量证明的方式选出记账节点,即每个记账节点在产生区块时给出一个需要通过消耗计算资源的谜题,最早求解出结果的节点获得下一区块的记账权。然而基于工作量证明的共识算法所带来的浪费算力资源、效率低下等问题一直为人们所诟病。为了减少PoW存在的算力浪费问题,研究者对PoW共识算法进行了改进。权益证明(PoS, Proof of Stake)共识算法根据人们持有货币数量的多少调节问题的难度,持币量越多的节点所需消耗的算力越少,这就防止了人们将过多无谓的财富投资在增加算力的设备上。基于PoS和PoW算法的有机结合,研究者相继提出了权益-速度证明(PoSV, Proof of Stake Velocity)等混合共识算法。PoSV将PoS中币龄的增长率由线性函数修改为指数式衰减函数,即币龄大小随时间变化,最后趋于常数。由于新币的币龄比老币增长得更快,因此可以在一定程度上缓解屯币的现象。为了解决PoW共识算法的效率问题,研究者在共识算法中引入了代表机制,通过限制参与共识的核心节点的数量来提高区块链的性能。授权权益证明(DPoS,Delegated Proof of Stake)是最早提出的采用代表机制的共识算法,它通过持币用户的投票产生授权节点负责打包区块、维持系统的运转并获得相应的奖励,避免了算力竞争的问题。该特性也使得DPoS不需要因为区块链节点算力不断增加而不断提高Hash谜题难度。下一代比特币(Bitcoin-NG, Bitcoin NextGeneration)则通过选举Leader产生区块和把产生的区块分类为关键块和微块增加出块速度。Ouroboros也需要选举Leader节点产生区块,但是添加事务的工作则属于当前时间片段的其他参与者们。无论是否当选领导人,所有参与者都平分奖励,因此避免了算力竞争,提高了公平性。
上述共识算法分别对PoW共识算法在算力浪费问题和效率上做出了优化。但他们的设计都基于代币机制,以激励节点成为挖矿节点自愿产生区块。而一般的日志系统通常为单位或个人私有,因此不需要代币机制,也难以和具有代币机制的共识算法融合。不使用代币机制的共识算法较少,其中实用拜占庭容错算法(PBFT, Practical Byzantine FaultTolerance)为典型代表。 PBFT起源于传统的分布式系统,后来被超级账本项目引入到区块链中。PBFT最大的优点是允许分布式系统在不多于三分之一的恶意节点的情况下仍然能够正常工作。由于PBFT算法不依赖于算力,不存在算力竞争和算力浪费的问题,然而其O(n2)的通信复杂度仍然限制了其可扩展性。
投票证明(PoV, Proof of Vote)共识算法设计了特定的角色模型,将区块链网络内的节点分类为委员(Commissioner)、管家(Butler)、候选管家(Butler Candidate)和普通用户(Ordinary User)四种角色。委员是区块链网络中的权威,它们共同对整个区块链进行管理,所有事务需要经过大部分委员同意才可执行。
候选管家可由普通用户申请加入后转变而成。管家则从候选管家中选举产生,当普通用户成为候选管家后,便获得了被选成为管家的资格。选举的过程由委员进行,在投票阶段,每个委员需要对各个候选管家进行投票,获票数较多的Nb个节点将成为管家节点。管家节点主要负责收集事务和产生区块,每一轮的区块产生过程由一个管家负责进行,该管家被称为值班管家,由上一轮产生的区块随机指定。PoV共识算法中还规定了每产生M个普通区块后则需要对候选管家重新进行投票,从而产生出下一任管家,投票信息及其结果存储在第M+1个区块中,称之为特殊区块。在产生特殊区块后即开始下一个区块打包的周期,同时上一周期的管家转变为候选管家,失去产生区块的权力,取而代之的是特殊区块指定的候选管家将转变为管家,负责新一轮区块的打包。
区块产生的共识过程由一个管家和所有委员共同进行,该管家被称为值班管家(Duty Butler),值班管家通过值班管家编号确定。假设委员共有Nc个,分别为C1, C2, …,CNc,管家有Nb个,分别为B1, B2, …, BNb,区块的共识过程如图1所示。PoV把一轮共识划分为Prepare、Ready、Commit和Confirm四个阶段,其中Confirm阶段为区块提交阶段,不需要传递消息。每个区块包含一个区块头和数量不定的事务,在Prepare阶段,值班管家从事务池中取出一定数量的事务并打包产生预区块并将预区块发送给所有委员。预区块和正式区块的区别在于预区块没有时间戳、委员签名和下一个值班管家编号。委员节点需要对接收到的预区块的区块头和事务所包含的信息进行验证,若验证通过则对预区块头进行签名并将签名发送给值班管家。值班管家在收集到超过Nc/2的委员签名后即可将预区块补充完整并发布正式区块。接收到该新发布区块的节点将区块存储在本地区块链中,并对包括值班管家编号在内的相关变量进行更新,从而更换负责进行下一轮共识的值班管家。
对预区块头的信息补充依赖于委员签名,PoV中规定以发布签名最晚的委员签名时间作为区块的产生时间,而下一个管家编号则通过对签名进行哈希等操作产生。这些规定利用了签名的随机性和不可伪造性,由于每个委员节点产生的签名都是随机的,因此计算得到的下一个管家编号也具有随机性。但是这个随机性不是完全随机的,值班管家只需从所有委员签名中选取出超过半数委员的签名即可产生区块,因此值班管家可通过对所获得的委员签名进行多次组合以找出特定的签名组合使得计算出的下一个管家编号符合自己的预期,如使得下一个管家仍然是自己。该恶意攻击方式被称为自私挖矿,尽管这种人为选择不一定能够使得结果达到该节点的目的,也在一定程度上提高了获得想要的下一个管家编号的概率。而对该下一个管家编号选择方式分析的理论结果显示,当管家节点数量Nb大于委员数量Nc的3.6倍时,可确保值班管家通过碰撞方式获得特定的管家编号为小概率事件。
在分区容忍性上,PoV可保证只要网络中存在半数以上正常工作的委员及一个正常工作的管家节点即可保证系统的持续运作,且即使把区块链网络中的节点划分为两个不可相互通信的区域仍可保证区块链不产生分叉。
在安全性上,因为管家产生的区块需要经过半数以上的委员验证并获得其签名后才可以正式发布,因此只要存在半数以上的委员节点正常工作,即可保证区块链数据的正确性。公有链在设计上缺少监管机制,任何节点均能产生区块,因此可能被恶意节点进行双花攻击,即区块中存在两笔不相容的事务。而PoV共识算法由于采取委员监管制度,委员在对区块进行验证时需要对区块中的事务进行验证,因此可避免双花攻击。
和著名的PBFT共识算法相比,PoV定义了委员和候选管家的加入和退出方式,提高了区块链网络的扩展性,同时PoV的网络通信复杂度为O(3Nc),也优于PBFT的O(N2)。
和大多数共识算法一样,PoV共识算法每个共识周期从多个候选节点中选择一个节点作为记账节点并产生区块,因此产生区块的过程是串行进行的,难以支持在大规模集群环境下的高吞吐性能。
发明内容
本发明的目的在于提供一种基于并行投票的共识方法,旨在解决上述的技术问题。
本发明是这样实现的,一种基于并行投票的共识方法,所述基于并行投票的共识方法包括以下步骤:
S1、在系统中从配置文件读取初始化信息,并将初始化信息打包成创世区块组且发布到网络中;
S2、网络节点接收到初始化信息后进行投票共识产生多个普通区块组;
S3、在生产普通区块组时根据投票共识生成一个特殊区块组;
S4、利用创世区块组、普通区块组及特殊区块组的并行处理完成投票共识。
本发明的进一步技术方案是:每一个区块组通过共识产生,每个共识过程依照先后顺序划分为Prepare、Vote、Propose和Commit四个阶段。
本发明的进一步技术方案是:所述步骤S2中包括以下步骤:
S21、启动节点根据当前时间计算回合数,利用回合数计算当时的轮值记账节点编号并执行Commit过程;
S22、判断节点是否为投票节点,若是,则进入Vote过程并执行S23,如否,则执行步骤S24;
S23、判断网络中是否已经产生多个普通区块组,若是,则进行选举投票并执行步骤S24,若否,则直接执行步骤S24;
S24、判断节点是否为记账节点,若是,则进入Prepare过程并执行步骤S25,若否,则返回步骤S21;
S25、判断节点是否为轮值记账节点,若是,则进入Propose过程并返回步骤S21,若否,则返回步骤S21。
本发明的进一步技术方案是:所述步骤S1中包括以下步骤:
S11、加载配置文件判断是否为代理节点,若是,则执行步骤S12,若否,则执行步骤S14;
S12、从配置文件读取Voter_List初始化信息,并生产初始化事务;
S13、将初始化事务打包为区块并将区块打包为区块组,设置区块组头后发布区块组;
S14、等待接收创世区块组;
S15、从创世区块组读取初始化事务并更新内存状态信息后进行共识。
本发明的进一步技术方案是:所述步骤S2中还包括超时处理步骤:
SA1、判断节点是否满足提交的条件,若是,则执行区块组提交操作并进入下一个共识周期,若否,则从一轮共识的开始时刻t0开始直到当前时刻t共经过的最新共识回合数temp=(t-t0)%Tcut并执行下一步,其中Tcut为每个共识回合的时长;
SA2、判断从一轮共识的开始时刻t0开始直到当前时刻t共经过的最新共识回合数temp是否大于系统中记录的从时刻t0开始共经过的共识回合数,若是,则更新系统记录的共识回合数为最新共识回合数temp并执行下一步,若否,则判断节点是否轮值记账节点,若是,则判断接收到的投票是否超过2NV/3,若是,则统计投票并发布区块组头,且返回SA1,若否,则直接返回SA1;
SA3、判断节点是否收到区块组头,若是,则请求缺少的合法区块并返回SA1,若否,则向所有投票节点询问当前最大的区块链高度MaxH并执行下一步;
SA4、判断当前最大的区块链高度MaxH是否比本地高度高,若是,则请求缺少的区块组头并返回SA1,若否,则执行下一步;
SA6、判断该节点是否为投票节点,若是,则产生投票并发送给轮值记账节点且返回步骤SA1,若否,则直接返回步骤SA1。
本发明的进一步技术方案是:所述Prepare阶段,负责产生区块的记账节点分别从自己的事务池中取出一定数量的事务用以产生区块。
本发明的进一步技术方案是:所述Vote阶段,当投票节点接收到记账节点发布的区块,需要将区块存储于内存的共识区块组中;在接收到所有记账节点产生的区块或者等待超时后对区块头和区块体的信息的合法性进行验证,包括区块高度、区块号是否正确、创建节点身份是否正确等,根据验证结果生成对区块的投票并将投票发送给轮值记账节点;区块投票需要包含区块组中每个区块的hash值及其投票意见,此外还需要附上生成者的公钥和签名,防止投票被伪造。
本发明的进一步技术方案是:所述Commit阶段,是所有节点均需执行的阶段,每个节点在该阶段需要执行区块组提交操作,其执行意味着当前轮的结束及下一轮共识的开始。
本发明的进一步技术方案是:所述Propose阶段,轮值记账节点需要收集投票节点产生的Vote_Ticket, 并将其存储在一个Vote_List=< Vote_Ticket1, Vote_Ticket2…>中;在满足统计结果产生条件后,调用投票统计函数产生统计结果VR(Vote_Result);Vote_Result =<<hash1, opinion1>, <hash2, opinion2>, …, <hashNw, opinionNw> >;最后将投票列表和统计结果打包到区块组头中,并在设置好其余变属性变量后将其发布到网络中。
本发明的有益效果是:并行投票共识PPoV将产生区块的操作改为并行进行,在每个共识周期中,所有记账节点均负责产生区块。在PoV中因为由单一记账节点负责产生区块,值班记账节点向所有投票节点发送预区块,并收集所有委员的签名后向网络发布区块,因此在共识过程中的通信负载主要集中在一个记账节点之上,其他记账节点则处于空闲状态。而PPoV中各个记账节点和投票节点之间的通信负载是相同的,在负载均衡的情况下,可以最大效率地利用带宽资源,提高系统的吞吐量。
除了对带宽资源的充分利用,由多个记账节点同时产生区块,当节点在等待接收区块数据的同时可对已经接收到的区块进行处理,可充分利用各个节点的闲置计算资源。尽管数据量的增加必将导致在一次共识过程中数据传输时间和CPU处理时间的增加,但是只要把产生的区块数量控制在一定范围内,这种时间的增加速度将低于存储事务数量的增加,从而带来系统吞吐量的提升。
除了并行产生区块带来的事务打包速度的提升,由于每个记账节点只允许打包部分哈希值的事务,也只接受该部分事务,因此可从根本上解决事务竞争的问题,每个事务只需发送给一个记账节点,减少无用通信,也降低了内存资源的消耗。
此外,允许所有记账节点同时产生区块意味着在一轮共识中所有记账节点均拥有记账权,因此增加了共识算法的公平性,也避免了自私挖矿的风险。
附图说明
图1是PoV共识过程消息传递示意图。
图2是本发明实施例提供的区块链产生区块过程的示意图。
图3是本发明实施例提供的各个身份转换关系的示意图。
图4是本发明实施例提供的区块链存储结构示意图。
图5是本发明实施例提供的不同高度区块组依赖关系示意图。
图6是本发明实施例提供的一个任职周期流程图。
图7是本发明实施例提供的区块组组装过程示意图。
图8是本发明实施例提供的事务上链过程示意图。
图9是本发明实施例提供的创世区块组产生流程图。
图10是本发明实施例提供的共识消息传递过程示意图。
图11是本发明实施例提供的事务分配规则示意图一。
图12是本发明实施例提供的超时处理流程图。
图13是本发明实施例提供的事务分配规则二。
图14是本发明实施例提供的正常阶段程序执行过程示意图。
具体实施方式
本发明提供的基于并行投票的共识方法,期详述如下:
所要解决的技术问题
区块链中除了创世区块的每一个区块都在自己的区块头中引用前一个区块的哈希值,从而保证区块链具有不可篡改的特性。区块链的链式结构使得不同区块之间存在着先后关系,只有高度较低的区块产生结束后才可以产生高度较高的区块,因此通常规定在一个共识周期中只能由一个记账节点产生一个区块。如图2所示,其工作过程可概括为选择记账节点和生成区块两个步骤的交替执行,区块的产生过程即由记账节点记账的过程,因此区块链的数据存储是串行化的。
PoV是一种联盟链共识算法,与PoW、PoS等公有链共识算法相比,抛弃了依赖算力的工作量证明方式,能实现减少出块时间的同时避免算力浪费。与大部分非工作量证明类型的共识算法一样,PoV在每个共识周期内只允许一个管家产生区块,每轮共识只产生一个区块,而其他管家则处于空闲状态,因此其区块产生过程也是串行化的。然而由于PoV的通信复杂度为O(3Nc),Nc为委员数量,值班管家需要把产生的区块发送给所有委员请求签名,因此当委员节点数量增加时,PoV的数据吞吐量将会以线性下降,这给PoV的可扩展性带来不利影响。
此外,由于PoV中的下一个值班管家编号是通过对区块中的委员签名进行计算得到的,而值班管家在收集签名并存放在区块头中时可以对这些签名进行任意的排列组合从而改变下一个值班管家编号,因此存在自私挖矿的可能性。
从对上述性能问题的分析可知,要提高PoV共识算法的可扩展性,关键是使共识算法的记账过程并行化,支持多节点同时记账,从而提高单位时间内存储的数据量。然而PoV共识算法的部分机制使其难以支持多记账节点同时记账。为了实现该目的,需要对下列并行化记账所带来的问题进行适当的考量和设计,以确保共识算法的可用性和正确性。
(1)区块序号:为了对区块进行索引,区块链通常使用一个整数对各个区块进行编号,该编号被称为区块高度。若在一个共识周期中允许多个记账节点同时产生区块,块与高度之间存在着多对一的关系,无法通过单个整数值区分这些区块。
(2)哈希值引用关系:传统区块链中通常需要令区块存储前一个区块的哈希值,从而链接成不可篡改的数据链。若需要并行产生区块,同一周期中的区块没有先后关系,且高度比自己小1的区块也不唯一,通过一个区块对前一个区块进行hash值引用的方式无法保证所有数据都会被后续产生的区块所引用,使区块链存在数据被篡改的可能。
(3)记账节点的数量及选择:在PoV区块链中,在每一轮负责产生区块的值班管家由上一轮共识产生的区块决定。若在一轮共识中允许多个记账节点产生区块,则存在着由多少个记账节点进行记账,该如何对这些记账节点进行选择的问题。
(4)投票及统计规则:在PoV中值班管家需要将区块发送给委员节点请求签名,通过委员的签名证明该区块的合法性,投票决策使区块链系统获得拜占庭容错能力。若允许并行产生区块,不同区块到达投票节点的时间不同,存在着如何对复数个到达时间各异的区块进行投票的问题,另外在对区块进行统计时可能存在只有部分区块被投票通过,而另一部分区块不被通过的情况。
(5)超时处理:现实环境下服务器可能因为各种原因发生故障导致无法正常工作,在多节点并行记账的情况下,可能因为其中的少量记账节点故障导致其他正常节点产生的区块也无法被通过验证和产生。
(6)事务的重复存储:在多记账节点同时记账情况下,由于每个记账节点无法得知其他记账节点的事务池中所存在的事务,因此当不同记账节点的事务池中存在相同事务,有可能导致在一轮共识中将两个相同事务存储至区块链中。
PPoV共识概述
共识算法是使区块链系统正常工作的核心技术,它通过数据交换规则使得网络中各个节点具备数据存储一致性。PPoV共识算法是一种新型联盟链共识算法,它把网络中的节点划分为五种角色,把记账权和决策权分离,所有记账节点均具有记账权,决策权则由投票节点掌控,所有的事务均需经过投票节点的审核才能存储到区块链汇总。投票节点通常有多个,PPoV通过投票证明的机制实现投票节点的去中心化,因此是一种部分去中心化的共识算法。
PPoV共识算法对PoV的主要改进点可概括为如下几点:
(1)采用区块组而不是区块作为基本的共识数据体,由不同高度的区块组构成一条不可篡改的数据链。
(2)对共识流程进行改进,在共识过程的产生区块阶段由所有的记账节点同时产生区块,实现产生区块的并行化。
(3)把产生区块和统计投票分离,由记账节点负责产生区块,轮值记账节点负责汇总和统计投票。
(4)投票节点对所有区块验证后只产生一张投票,该投票中包含该轮所有区块的投票意见。而轮值记账节点在统计后产生的投票结果以数组的形式记录该轮所有区块的投票结果。
(5)由于投票节点需要接收到所有记账节点产生的区块才能投票,因此若任意记账节点故障将导致共识无法进行,因此PPoV设定一个共识超时时间,要求所有投票节点在超时后立即产生投票,轮值记账节点也在接收到一定数量的投票后立即统计并产生区块组头。
(6)通过给每个事务分配一个事务编号,并规定每一个区块只允许存储事务编号和其区块号相同的事务,实现事务和区块绑定,从而避免在不同的区块中存储重复的事务。
该共识算法具有以下特性:
(1)可监管性:投票节点具有对区块链数据和系统运行情况监管的权力和义务,其存在保证了区块链系统的正常运行。
(2)可终止性:超时处理机制的设计保证了当网络中的恶意或者故障投票节点数量不超过投票节点数量的三分之一且具有至少一个正常工作的记账节点的情况下可在有限时间内完成一轮共识。
(3)拜占庭容错性:投票和统计机制的设计保证在网络中的恶意或者故障投票节点数量不超过投票节点总数的三分之一时产生的区块组数据合法。
(4)最终一致性:PPoV共识保证在网络中的恶意或者故障投票节点数量不超过投票节点数量的三分之一时,网络中正常工作的节点在有限时间内数据达成一致。
(5)可扩展性:PPoV允许多个记账节点同时记账,实现数据的并行写入。因此在把区块链应用于大规模网络时,可适当调整记账节点数量从而使得区块链系统在大规模网络情况下仍然具有较高吞吐量。
为了对PPoV的工作过程进行描述,首先对其身份设计和数据结构设计进行介绍。
节点身份设计
在公有链网络中各个节点是平等的,每个节点均可参与区块链共识过程的任意部分,因此实现了完全的去中心化。而联盟链或私有链由于主要应用于联盟环境或者私有环境,各个节点之间可以存在权限的不平等。PPoV共识算法把节点的投票权和记账权分离,共设计了投票节点、记账节点、候选记账节点、轮值记账节点和普通节点共五种身份的节点。下面描述这五种身份在网络中所承担的功能。
投票节点 Voter:PPoV是一种基于投票决策的共识机制,所有事务均需经过投票节点投票同意才可通过验证,因此具备投票权的节点具有区块链网络的最高权力。其特点如下:
(1)投票节点具有投票的权力,每个投票节点在一轮共识中可对区块数据进行投票,所有投票节点投票权重相等,只有获得50%以上赞同票的区块才能够成为合法区块。
(2)投票节点具有网络监管的义务,需要对每个区块数据进行验证,以确保每个区块中所包含数据的正确性。
(3)投票节点具有选举记账节点的义务,它会对记账节点的表现进行评分,如产生区块超时则扣分、产生区块速度快则加分等,在当前的记账节点任期结束后根据候选记账节点的历史评分选举出下一批记账节点团队。
投票节点是区块链网络中具有投票权,负责对记账节点产生的区块合法性进行校验,并对候选记账节点进行选举,从而实现记账节点的更换。网络中通常包含多个投票节点,每个节点具有一张选票,因此各个投票节点之间是平等。投票节点扮演了区块链网络监管者的角色,发现并排除网络中的错误或者潜在威胁,保障区块链系统的正常运作,投票节点数量记为Nv。
任意非投票节点要申请成为投票节点,需要经过如下步骤:
S1:请求超过50%的投票节点签名同意。
S2:将所有签名封装为一个身份转换事务并发送给任意一个记账节点。
S3:等待事务上链,完成身份转换。
记账节点 Worker:记账节点是区块链记账功能的承载者。其所需执行的工作如下:
(1)收集网络节点产生的事务数据,将其存进事务池当中。
(2)把事务打包为区块,并广播给所有节点,其打包的区块需要获得超过50%的投票节点同意才能被最终提交至数据库当中。
和投票节点一样,网络中同时存在多个记账节点,其数量通常设为固定值。同一时刻中所有记账节点集合称为记账节点团队。记账节点团队采用任期制,每个记账节点团队在其任职周期中需要产生固定数量的区块组,在任期结束后由投票节点选举产生下一任记账节点团队。为了达到保证各个节点信息一致性,需要对每个记账节点从0开始进行编号,并把编号信息记录在区块链中,记账节点数量记为Nw,该编号记为记账节点编号(Iw,Index of Worker)。
选举过程如下:
S1:投票节点对候选记账节点进行投票,并将选票发送给轮值记账节点。
S2:轮值记账节点将选票打包为一个身份转换事务,并将该事务存储在其所产生的区块当中。
S3:等待上述事务上链,完成记账节点的更换。
候选记账节点 Worker Candidate:候选记账节点不具备直接参与共识过程的能力,但具有被投票节点选举成为记账节点的资格。为了能够选出足够数量的记账节点,候选记账节点数量需要比记账节点团队数量多。任意的非候选记账节点可申请成为候选记账节点,同时候选记账节点也可自由放弃候选记账节点的身份,候选记账节点数量记为Nwc。
非候选记账节点要转换为候选记账节点,需要经过如下过程:
S1:请求超过50%的投票节点签名同意。
S2:将所有签名封装为一个身份转换事务并发送给任意的记账节点。
S3:等待事务上链,完成身份转换。
轮值记账节点 Duty Worker:在系统运行的任意时刻,存在唯一的轮值记账节点负责收集投票节点产生的投票信息,并进行统计。该节点从记账节点中选出,在每轮共识完成后将由区块组头中Next_Duty_Worker的值确定下一轮共识的轮值记账节点编号。
普通节点 Ordinary Node:当一个新节点加入区块链网络时,由于区块链中并未记录其公钥对应的身份信息,因此不能参与共识的任何过程,只能够接收其他节点区块链数据和发布事务。把此类节点成为普通节点,其加入或者退出区块链网络不会对区块链系统产生任何影响。普通节点可通过发布身份转换的事务从而申请成为候选记账节点或者投票节点,普通节点数量用No表示。
网络中的一个节点可兼具多种身份,同时承担多种功能。各个身份之间的转换关系,如图3所示。
数据结构设计
传统区块链以单一区块作为数据存储的基本单元,即每轮共识只产生一个区块。区块之间通过Hash值连接成链,每个区块通过区块高度进行编号。为了支持并行数据存储,本文以区块组(BG, Block Group)作为共识单元,每轮共识产生一个区块组,每个区块组中包含一个区块集合(BS, Block Set)和区块组头(BGH, Block Group Header)。每个区块组通过高度i进行编号,而其中的每一个区块(B, Block)则通过高度i和区块号(BN, BlockNumber) j来唯一表示,各个区块组通过Hash值连接成链式结构,如图4所示。
根据功能的不同把区块组分为创世区块组、普通区块组和特殊区块组三类区块组。
创世区块组:和传统区块链类似,创世区块组是区块链系统产生的第一个区块组,其作用是对区块链系统进行初始化,保证所有节点的内存变量具有相同值从而实现状态一致。创世区块组中只包含一个区块,该区块中记录系统初始状态下的记账节点、候选记账节点、投票节点和轮值记账节点的公钥,并设置了记账节点数量和记账节点任职周期等系统常量,这些信息存储于一个初始化事务中。
普通区块组:普通区块组中包含Nw个区块,每个区块由一个特定的记账节点产生,其区块号等于产生该区块的记账节点的编号Iw。普通区块组中可记录普通事务和用于身份转换的事务。
特殊区块组:为了保证区块链系统的健康运行,实现投票节点的监管职能,在一届记账节点团队的任职周期结束时需由投票节点投票选举产生下一任记账节点团队成员名单,投票结果将以选举事务的形式存储于任职周期的最后一个区块组中,包含选举事务的区块组称为特殊区块组。
在PPoV中,高度为i的普通区块组由一个区块组头和个区块号为的区块组成,为记账节点数。PPoV的记账节点团队采用任期制,每产生Bw个区块组需要产生一个特殊区块组,特殊区块组中记录下一任记账节点团队的信息。
所有的区块组均采用同样的数据组织结构,如表1所示。
表1 Block Group数据结构
其中每个区块的结构如表2所示。
表2 区块数据结构
为了增加区块链的容错性,PPoV共识算法不要求投票列表中包含所有投票节点的投票,因此轮值记账节点在执行投票统计时对投票的选择具有一定的自由度。然而该自由度为区块链的分叉提供了可能性,若轮值记账节点在产生区块组头时通过对投票进行排列组合产生多个不同的合法投票列表,从而生成多个不同的合法区块,将会导致区块链分叉。对投票的不同选择或者重排可能导致的问题有两个:
(1)包含两个不同投票列表的区块组头的hash值不同,从而导致区块链分叉。
(2)不同投票列表统计得到的投票结果不同,从而导致区块组头hash值不同,并使得不同节点存储的区块集合不同。
对于第一个问题,采取的解决措施是:计算区块组头Hash值时先把投票列表置空,再执行Hash操作。对于第二点问题,通过设计合适的统计条件和超时处理机制保证所有的合法投票列表统计结果均相同。
除了投票列表外,时间戳的自由选择性也可能导致区块链分叉,还可能导致不同节点共识开始时间不一致从而发生难以预估的错误。为了保证时间戳的一致性,轮值记账节点需要依照下列规则设置时间戳:
若投票结果中合法区块数量不为0, 则把合法区块中的时间戳最大值作为区块组头的时间戳。
若投票结果中合法区块数量为0,则把当前轮的开始时间设置为区块组头时间戳。
根据该规则产生的时间戳可确保时间戳具有唯一性,尽管该时间不能代表共识的结束时间,但不会对共识正确性造成影响。因为只要各个节点设置的共识开始时间相同,各个节点的每个回合切换时间和回合数就能保持一致,从而保证共识过程的正常进行。
除了区块组头需要记录前一区块组头的hash值,区块组中的每个区块也需要把前一个区块组头的hash值记录在其区块头中。其引用结构如图5所示。
在每一个共识产生的区块组头中,需要记录负责产生下一个区块组的轮值记账节点编号Next_Duty_Worker,该值可通过把投票结果中所有合法区块的hash值拼接后对记账节点数量取模得到。
本文的区块组设计具有较高自由度,尽管区块组头中包含投票列表,但不同节点所保存的投票列表可能不同。除此之外,由于投票统计结果只记录合法区块的Hash值,因此只保证合法区块不可篡改和数据一致性,节点在对区块组进行存储时可自由选择是否存储非法区块。
PPoV共识工作过程
PPoV区块链以区块组作为数据存储的容器,区块组之间通过哈希值的引用连接成不可篡改的数据链,因此区块链的存储过程即不断产生区块组使区块链高度增加的过程。
假设区块链网络中的投票节点数量为Nv,记账节点数量为Nw,候选记账节点数量为Nwc,普通节点数量为No,总结点数量为Nall。除了创世区块组以外的区块组由Nw个记账节点共同产生。节点担任记账节点的时间称为任职周期,以Tw表示。在任职周期结束后,由候选记账节点竞选产生下一任的记账节点。每一任记账节点在其任职周期内需要产生Bw+1个区块组,其中前Bw个区块组为普通区块组,最后一个区块组为特殊区块组,记录了下一任记账节点的公钥信息及其对应的编号。记账节点编号从0开始递增至Nw-1。在产生特殊区块组后,所有节点即可从中获取下一任记账节点信息,从而完成记账节点的更换。如图6所示。
PPoV把产生一个区块组所需执行的所有操作称为一轮共识,通常要求完成一轮共识的时间不超过一个最大值,该值被称为超时时间,记为Tcut。共识过程由记账节点和投票节点共同完成。每个记账节点在一轮共识开始后各自产生一个区块并广播到网络当中,网络中所有节点均需收集这些区块。投票节点在收集到所有记账节点产生的区块后对这些区块进行验证并向轮值记账节点发送投票,投票中包含了投票节点的签名以及各个区块的哈希值和验证结果。轮值记账节点负责收集和统计投票,获得超过Nv/2验证通过票的区块可成为合法区块可被存储至最终产生的区块组中,获得超过Nv/2验证失败票的区块为非法区块,既不是合法区块也不是非法区块的被视为无效区块。非法区块和无效区块不属于最终产生的区块组的一部分,因此可将其抛弃。轮值记账节点需要将投票列表和投票结果存储在区块组头中,最后将区块组头广播至网络当中。接收到区块头和所有合法区块的节点将其组装为完整的区块组并存储在本地区块链当中,如图7所示。
轮值记账节点在生成区块组头时,需要调用函数生成一个随机数R,0≤R<Nw,并将其作为下一任轮值记账节点的编号并存储至区块组头当中,从而实现轮值记账节点的更换。
由于各种原因,可能存在记账节点无法在Tcut内完成区块的产生,或者轮值记账节点无法在Tcut完成区块组头的产生的情况。为了保证区块链系统可最终达成共识产生出区块组,在一轮共识开始后,每经过Tcut时间所有投票节点均需立即投票,而轮值记账节点只需接收到超过2Nv/3投票即可产生统计结果。在第一次经过Tcut时,轮值记账节点保持不变,在其后每经过Tcut时间,则令当前随机数R=R+1,由编号为R+1的记账节点担任轮值记账节点,当R增加到Nw时,就将R从0开始递增。
记账节点数量Nw是固定的,且存储在创世区块组当中。在当前任期内的记账节点完成Bw个区块组的产生后,投票节点需要对候选记账节点进行选举投票,由轮值记账节点负责收集并统计这些投票,获票数最多的Nw个记账节点当选为下一任记账节点,并记录于特殊区块组当中。
在区块链中,数据以事务的形式存在,通过产生区块组的方式存储于区块链当中,该过程通常被称为数据上链。在PPoV中,任意节点均可产生事务,并将其发送给记账节点,由记账节点存储在事务池当中。在进行共识时,记账节点从事务池取出事务生成区块并通过共识将区块存储在新产生的区块组当中,如图8所示。在共识完成后,每个节点需要遍历新产生的区块组中的每一个事务,并对其调用事务执行函数。该函数以事务为自变量,根据事务的种类及其数据执行不同的操作从而实现不同的功能,如各个节点身份列表信息的更新等,前面所描述的各种身份转换即通过该方式实现。
消息类型
区块链系统中的每一个节点可视为数据驱动的状态机,不同节点通过相互传递消息使得区块链系统可顺利完成共识产生出合格区块组。为了完成共识机制所描述的功能,需要使用下面所列的事务和消息类型。
事务类型:
事务1 Tx_Initial:初始化事务,由产生创世区块组的节点产生,记录了包括初始的投票节点信息、候选记账节点信息、第一任记账节点信息、下一个轮值记账节点编号、记账节点数量Nw和共识超时时间Tcut。
事务2 Tx_Permission:身份转换事务,该事务可细分为五种类型,分别用于申请成为投票节点、申请成为候选记账节点、放弃投票节点身份、放弃候选记账节点身份和记账节点选举。
事务3 Tx_Define:自定义事务,可根据具体应用需求对该事务功能进行扩充,从而使区块链与不同的应用场景结合,如日志系统等。
消息类型:
消息1 Msg_Block:区块消息,记账节点产生区块后需要广播的消息,包含了其所产生的区块主体。
消息2 Msg_Vote:区块验证投票消息,由投票节点产生,包含对该轮共识所有区块的哈希值及其验证结果,还需附上投票节点的签名。
消息3 Msg_BlockGroupHeader:区块组头消息,由轮值记账节点产生,包含了3.2.2节中所描述的所有内容。
消息4 Msg_Genesis_Block_Group:创世区块组发布消息,包含了创世区块组的所有信息。
消息5 Msg_Request_Height:高度请求消息,用于请求区块链的高度。
消息6 Msg_Request_Block_Group:区块组请求消息,用于请求特定高度的区块组。
消息7 Msg_Request_Block_Group_Header:区块组头请求消息,用于请求区块组头。
消息8 Msg_Request_Block:区块请求消息,用于请求指定高度和区块号的区块。
创世区块组
创世区块组是区块链中的第一个区块组,其高度为0。因为区块链的节点身份等信息均存储于区块链当中,在创世区块前区块链不存在数据,因此也没有关于节点身份的信息。共识的执行依赖于这些身份的相互配合,为了使区块链系统可正常工作,创始区块承载着系统初始化的功能。尽管创世区块组作用特殊,且只需产生一个,其产生方式可由实现者自行定义,但无论采用何种实现方式,都必须包含如下信息:
(1)投票节点列表 Voter_List:该列表中以数组的形式记录了系统初始的投票节的公钥。
(2)记账节点列表 Worker_List:该列表中以数组的形式记录了记账节点编初始记账节点的编号及其公钥。
(3)候选记账节点列表 Worker_Candidate_List:列表中以数组的形式记录了各个候选记账节点的公钥。
(4)下一个轮值记账节点编号Next_Duty_Worker:负责产生第一个普通区块组的轮值记账节点的编号。
(5)时间戳Te:时间戳用于保证所有节点的第一轮共识开始时间都相同。
(6)记账节点数量Worker_Amount:在创世区块中设置的记账节点选举数量是一个常量,在区块链系统的整个生命周期内都不会发生改变。
(7)任职周期 Worker_Period:该值设定了每一任记账节点在其任期内需要产生的区块组数量。
(8)共识截止时间Tcut:该值为共识的超时时间,假设Tstart为一轮的共识时间,各个节点需要在(Tstart, Tcut)时间内产生出一个合格区块组,否则将发生超时并执行超时处理。
将这些数据保存在一个初始化事务Tx_Initial当中,并把该事务存储在创世区块组中。由于区块链是一个不可篡改的分布式账本,网络中的每个节点都具有该账本的一个副本,因此无论这些节点在何时启动和加入网络,只要依照高度顺序遍历执行一次区块链上的事务,即可保证其状态变量和网络中的其他节点相同。创世区块的作用是对节点的初始状态进行初始化,通过把数据写入区块链保证网络中各个节点的初始化状态一致,只有各个节点状态一致,区块链系统才可以正常运行。由此可看出在PPoV区块链的运行依赖的状态变量只有8个,其中记账节点数量、任职周期和共识截止时间是常量,其余5个为变量,随着区块链系统的运行而改变。
尽管实现方式不唯一,为了更具体描述创世区块的产生过程,本文仍提供一种创世区块组的产生方式,如图9所示。把产生创世区块组的节点称为代理节点(Agent Node),初始化信息通常记录在一个配置文件上,区块链节点通过读取配置文件得知自己是否代理节点。若为代理节点,则需继续从配置文件读取Voter_List、Worker_List、Worker_Candidate_List等初始化状态信息,并将其存储在一个初始化事务中。为了和其他的区块组结构兼容,代理节点需要先将初始化事务存放在一个区块中,再把该区块存储在区块组当中,最后将其广播到网络中。接收到创世区块组的区块在读取初始化事务并更新内存状态信息后,即可进入正常共识阶段。
普通区块组和特殊区块组
除了创世区块组以外的所有区块组都需要通过投票节点和记账节点共识产生,且共识过程基本相同。和PoV一样,为了令所有节点对提交的区块组达成一致,PPoV也采用隐式二阶段提交的方式进行共识提交区块组。区别是PoV在每个区块生成周期中只由一个管家产生一个区块,而PPoV则由个记账节点共同执行区块产生的过程,每个周期产生一个区块组。区块组中的每个区块需要在区块头中记录了生成该区块的记账节点编号(, Indexof Worker)及其公钥。特殊区块组与普通区块组的区别仅在于特殊区块组中包含了一个记录了下一任记账节点名单的的身份转换事务,该事务由轮值记账节点对投票节点的投票进行统计后产生,在产生区块时将其打包进区块当中。
Prepare阶段:在Prepare阶段,负责产生区块的记账节点分别从自己的事务池中取出一定数量的事务用以产生区块。在产生区块后,各个记账节点将区块发布到网络中。的Prepare阶段的开始时间为提交完成的时间。因为网络延迟等原因,各个节点接收到区块的时间是不一致的,因此不同节点进入生成下一区块组的Prepare阶段的时间也会有差别,但是由于轮值记账节点的选择与时间相关,为了保证各个节点的共识阶段开始时间一致,PPoV把前一区块组头部的时间戳作为当前共识轮的起始时间,从而保证了在时钟同步的条件下各个节点关于当前超时轮数是一致的。PPoV中产生的区块包含区块体(body)和区块头(header)两部分,区块体中以一定的顺序封装了各个事务,而区块头则包含生成该区块的记账节点的编号(, Index of Worker)及其公钥、前一个区块组哈希值等信息。
Vote阶段:当投票节点接收到记账节点发布的区块,需要将区块存储于内存的共识区块组中。在接收到所有记账节点产生的区块或者等待超时后对区块头和区块体的信息的合法性进行验证,包括区块高度、区块号是否正确、创建节点身份是否正确等,根据验证结果生成对区块的投票并将投票发送给轮值记账节点。区块投票需要包含区块组中每个区块的hash值及其投票意见,此外还需要附上生成者的公钥和签名,防止投票被伪造。本文将投票记为Vote_Ticket=<<<hash1, opinion1>, <hash2, opinion2>, …, <hashNw,opinionNw>>, timestamp, sig>。
Propose阶段:在Propose阶段,轮值记账节点需要收集投票节点产生的Vote_Ticket,并将其存储在一个Vote_List=< Vote_Ticket1, Vote_Ticket2…>中。在满足统计结果产生条件后,调用投票统计函数产生统计结果VR(Vote_Result)。Vote_Result =<<hash1, opinion1>, <hash2, opinion2>, …, <hashNw, opinionNw> >。最后将投票列表和统计结果打包到区块组头中,并在设置好其余变属性变量后将其发布到网络中。区块组头包含的属性,可见前文所述。接收到区块组头的节点需要对区块组头的正确性进行验证,包括前一区块组hash值、每个投票的签名以及投票结果正确性。下面将对投票统计方法及统计结果产生条件进行详细描述。
投票结果统计:生成一个和记账节点长度相同的数组作为最终投票结果,数组中包含对应编号的区块的hash值及其同意、反对或者无意见三种结果,分别用1、-1和0表示。统计时,因为可能存在恶意节点向不同投票节点发送不同的区块的情况,所以可能存在各个投票中对于某个编号的区块的hash值不相同的情况。假设对于第p个区块,对其进行的投票共包含m个不同的hash值,把这些hash值分别编号为[1,2,3,…,m],对于编号为i的hash值,为方便起见,用三元组(, , , )表示与其对应的赞同票数、反对票数和无意见票数的组合。在超时发生前,投票节点只可能对一个区块投赞成票或反对票,因此在超时前不存在意见为0的投票。
对于第p号区块,当满足以下任一条件时,将产生对p号区块投票的结果:
否则继续等待直至超时,在此情况下轮值记账节点需要在收集到超过2Nv/3的投票后,对区块组中的每一个区块进行统计并生成统计结果,若 任意一个编号的区块,存在一个hash值赞同票超过Nv/3即可视为同意产 生区块,否则被视为反对产生区块。算法1中展示了投票统计的计算方法。
Commit阶段:Commit阶段是所有节点均需执行的阶段,每个节点在该阶段需要执行区块组提交操作,其执行意味着当前轮的结束及下一轮共识的开始。
当节点满足以下条件时即可执行提交操作:
接收到与当前轮共识高度相同的区块组头且对区块组头的信息验证通过。
接收到所有通过投票的区块。
提交操作主要包括存储区块组和更新内存变量两个操作:
存储区块组:把当前轮的区块组存储至数据库或文件当中,使其真正成为区块链的一部分。
更新内存变量:该操作需要根据区块组的每个合法区块的事务更新内存状态,如向投票节点列表增加新的投票节点等,该过程也被称为事务的执行。除了执行事务外,还需根据区块组头更新下一轮共识的开始时间、下一个轮值记账节点编号、当前共识高度等变量。
若在限定时间内无法满足区块组提交条件,则需要进行超时处理。
超时处理
由于真实网络的可能存在不稳定性,网络中的节点可能出现因故障无法正常工作的情况,从而导致其他节点处于长期等待消息的状态使得区块链系统运行停滞,本文通过引入超时处理机制解决该问题。可能对共识过程直接造成影响的只有记账节点、轮值记账节点和投票节点三类节点,因此本文针对这三类节点失效时对区块链系统产生的影响进行分析。
投票节点:投票节点是区块链系统中具有最高权力的节点,通过对记账节点产生的区块投票从而决定合法与不合法的区块。投票节点失效造成的影响与轮值记账节点的统计条件和统计方式相关,如上文所述,轮值记账节点只需要对共识区块组中的每一个区块均接受到超过的赞成票或反对票即可产生同意或者反对该区块的统计结果,若出现无论赞成票和反对票均不可能超过时将产生无法生成区块的统计结果。然而当网络中存在失效投票节点时,可能存在上列三种条件均无法满足的情况。此时轮值记账节点将处于长期等待统计条件满足的状态,而网络中的节点也将处于长期等待区块组头的状态。
记账节点:由于投票节点需要接收到所有记账节点产生的区块才可以产生投票,记账节点失效将导致投票节点长期处于等待区块的状态。
轮值记账节点:若轮值记账节点失效无法产生区块组头,将导致所有节点处于等待区块组头的状态。
为了处理这些节点失效的情况,本文在共识算法中增加了超时机制:
在一轮共识中,共识结束的条件是满足区块组提交条件,即:
接收到该轮共识的区块组的区块组头。
接收到所有投票通过的合法区块。
如果在一个epoch内无法满足提交条件,则该轮共识超时,需要进行超时处理。如图12所示,超时处理分为以下两种情况进行:
已经接收到合法区块组头,但没有接收到足够的合法区块。
已经产生区块组头表明共识已经完成,没有接收到足够的合法区块可能是因为网络故障等原因造成,因此需要向其他节点请求缺少的区块。
没有接收到合法区块组头。
没有产生出区块组头可能是因为轮值记账节点发生故障,也可能是因为部分的记账节点故障,所以无法产生出足够多的区块。此时需要进行以下超时处理:
(1)所有节点向所有投票节点请求其区块链高度,并维护各个投票节点的在线状态。若存在投票节点区块链高度比本地区块链高度高,则向该节点请求比本地高度高的区块组并结束超时处理。否则继续执行下列超时操作。
(2)所有投票节点立刻执行投票操作,若已经接收到的区块则按照正常方式投票,还没有接收到的区块则把结果设置为0(无意见),并设其hash值为空。产生的投票需要发送给下一个epoch的轮值记账节点。
(3)轮值记账节点在接收到超过的投票后,对区块组中的每一个区块进行统计并生成统计结果,此时统计方式为:若任意一个编号的区块对于任意一个hash值获得的赞同票超过,即可视为同意产生区块,其将其投票结果置为1,否则被视为反对产生出区块,将其投票结果设置为-1。
(4)若Nepoch >1,即超时两次以上,则需更换轮值记账节点,若超时前记账节点的编号为n,则当前轮值记账节点的编号为(n+1)%Nw。
该处理规则保证了在一个共识轮中必然能够产生出一个合法的区块组。超时处理是对共识过程的补充和完善,增加了区块链的鲁棒性,使区块链网络在遇到异常情况时也能正常运行并产生区块。
事务分配规则
在PoV区块链网络中,网络中的节点为了尽可能加快事务被打包进区块的速度,通常将生成的事务发送给所有管家,因此不同管家的事务池中存在着大量相同的事务,当管家在接收到新发布的区块后,需要从事务池中移除重复的事务。而PPoV的一个共识轮由多个记账节点同时产生区块,若不对事务进行筛选,由于不同记账节点的事务池可能存在重复事务,单个事务可能被存储在多个区块中。因此本文给每个事务Tx指定一个编号,并规定每个记账节点产生的区块中只允许包含事务编号和记账节点编号相同的事务,从而使每个区块组中不同区块所包含的事务的交集为空,如图13所示。事务编号的计算方式为:
其中digest(Tx)为事务Tx的摘要,Hash为hash函数,可由人为选定。
除了避免事务重复存储的问题外,对每个区块允许打包的事务进行约束还可以大大提高区块链系统存储事务的效率。因为每个记账节点只能产生包含和自己编号相同的事务的区块,因此也只需要接收同编号的事务,这将减少事务池中的事务量,提高事务查询效率。对于用户节点而言,因为所有记账节点将同时产生区块,因此不需要为了加快事务被处理的速度而发送给所有记账节点,另外即使把事务发送给和事务编号不同的记账节点也会被拒绝接受,所以发送事务给和对应编号不同的记账节点对用户节点而言没有任何好处,每个用户节点只将事务发送给对应的记账节点,减少网络的通信量,并提高事务存储的效率。
PPoV共识算法小结
前文通过图示对PPoV区块链的概要设计和各部分细节进行了介绍,下面将通过伪代码及流程图对PPoV区块链系统的整个工作流程进行详细的描述。
PPoV区块链系统可看作一个用于产生区块组的机器,网络中不同身份的节点通过数据交换完成共识,从而将事务数据存储至新产生的区块组中。从区块组产生的过程看,区块链系统的区块组产生过程可概括为下列三个过程:
S1:产生一个创世区块组,跳转至S2。
S2:产生Bw个普通区块组,跳转至S3。
S3:产生一个特殊区块组,跳转至S2。
创世区块组由系统初始化时的任意一个节点负责产生,该节点通常由人为设置。创世区块组的产生过程较为简单,可简单概括为从配置文件读取初始化信息,把初始化信息打包成创世区块组并发布到网络中两个步骤。其余的每一个区块组都需要经过共识过程产生,一个共识过程依照先后顺序划分为Prepare、Vote、Propose和Commit四个阶段。本文采用状态机的机制对区块链节点的运行过程进行建模,通过流程图描述其在正常运行阶段(非生成创世区块阶段)的运行过程。如图14所示,节点通过一个死循环重复执行Prepare、Vote、Propose和Commit操作。
这些操作由不同身份的节点完成,下面通过伪代码分点叙述各个操作的执行过程。
Prepare:每一个记账节点从事务池中取出若干事务,对其进行排序后 打包成一个区块Block,把区块的区块号BN设置为自己的记账节点编号, 最后将该区块发布至网络中。所有接收到区块的节点需要将其存储至内存 当中,其伪代码如算法2所示。
Vote:Vote阶段的任务由投票节点完成,其伪代码如算法3所示。
在接收到记账节点产生的区块时,投票节点需要对区块的正确性进行验证,并记录下验证结果。当所有区块号的区块都验证完毕后,即可生成投票Vote_Ticket,并发送给轮值记账节点。轮值记账节点需要将Ticket存储在内存投票列表Vote_List中。在Nepoch=0,即超时前,如果没有接收到所有区块需要一致等待。但当Nepoch>0时,投票节点需要立即执行投票操作。在每个Epoch只能执行一次投票操作,执行完毕后只能等待直到下一次超时才能再次执行投票操作。
Propose:轮值记账节点需要对Vote_List调用VoteListStatistic函数,如 算法1所示,该函数会返回成功或失败两个结果。若成功,则产生出投票 结果Vote_Result,此时轮值记账节点即可产生出包含Vote_List和 Vote_Result的区块组头,并将该区块组头发布到网络当中,从而完成 Propose的过程。若函数返回失败的结果,则需继续等待直至函数返回成功 或者超时,在超时后统计方式有所改变。经过两次超时后开始进行轮值记 账节点的轮换,从而避免因为轮值记账节点故障导致系统无法运行。
Commit:所有节点在接收到区块组头和所有经由投票同意产生的合法 区块后,需要执行区块组提交操作。该操作包括把区块组数据存储至数据 库和更新内存相关变量两个步骤。在执行完提交操作后,节点即进入下一 轮共识的流程。如果一致无法满足Commit执行条件,在等待直至超时后 调用TimeoutProcess函数执行超时处理。其伪代码如算法5所示。
每个区块组头中所存储的Next_Duty_Worker指定了负责进行下一轮共识的轮值记账节点的编号,而时间戳Te则为下一轮共识的开始时间Start_Time。通过共识截止时间Tcut和系统时间可确定当前的回合数Nepoch,在时钟同步情况下,可保证所有节点的Nepoch在任意时刻均相同。
PPoV共识算法规定每任记账节点在其任职周期内只能负责产生Bw+1个区块组。在每完成Bw个区块组的产生后,需要产生一个特殊区块组。此时投票节点需要对候选记账节点进行,并将选票发送给轮值记账节点。而轮值记账节点需要收集这些投票产生一个记录了选举结果和选票列表的身份转换事务打包到其所产生的区块中。因此该轮共识产生的区块组中包含了一个身份转换事务,可用于确认下一任记账节点的名单。完成区块组提交的节点也对记账节点列表进行更新并由新一任记账节点产生后续的Bw+1个区块。
PPoV将产生区块的操作改为并行进行,在每个共识周期中,所有记账节点均负责产生区块。在PoV中因为由单一记账节点负责产生区块,值班记账节点向所有投票节点发送预区块,并收集所有委员的签名后向网络发布区块。因此在共识过程中的通信负载主要集中在一个记账节点之上,其他记账节点则处于空闲状态。而PPoV中各个记账节点和投票节点之间的通信负载是相同的,在负载均衡的情况下,可以最大效率地利用带宽资源,提高系统的吞吐量。
除了对带宽资源的充分利用,由多个记账节点同时产生区块,节点在等待接收区块数据的同时可对已经接收到的区块进行处理,可充分利用各个节点的闲置计算资源。尽管数据量的增加必将导致在一次共识过程中数据传输时间和CPU处理时间的增加,但是只要把产生的区块数量控制在一定范围内,这种时间的增加速度将低于存储事务数量的增加,从而带来系统吞吐量的提升。
除了并行产生区块带来的事务打包速度的提升,由于每个记账节点只允许打包部分哈希值的事务,也只接受该部分事务,因此可从根本上解决事务竞争的问题,每个事务只需发送给一个记账节点,减少无用通信,也降低了内存资源的消耗。
此外,允许所有记账节点同时产生区块意味着在一轮共识中所有记账节点均拥有记账权,因此增加了共识算法的公平性,也避免了自私挖矿的风险。
本发明技术设计了一种新的数据组织方式,采用区块组而不是区块作为基本的共识数据体,由不同高度的区块组构成一条不可篡改的数据链。区块组包含区块组头和区块集合两部分,区块集合中的每一个区块之间不存在相互依赖关系,因此可并行的产生。
设计了包含Prepare、Vote、Propose和Commit四个阶段的共识流程,在一轮共识中由所有的记账节点同时产生区块,实现数据存储的并行化,充分利用记账节点和投票节点的闲置带宽和计算能力,增加共识算法的数据吞吐量。同时也避免了因为选择记账节点带来的不公平问题。
设计了超时处理机制,该机制使得只要网络中存在一个正常工作的记账节点和不超过1/3Nv的故障投票节点,区块链系统即可持续产生区块,增加了系统的鲁棒性和容错性。
设计了事务分配规则,避免事务重复存储的问题,并提高区块链系统存储事务的效率。因为每个记账节点只能产生包含和自己编号相同的事务的区块,因此也只需要接收同编号的事务,这将减少事务池中的事务量,提高事务查询效率。对于用户节点而言,因为所有记账节点将同时产生区块,因此不需要为了加快事务被处理的速度而发送给所有记账节点,避免了事务存储速度的竞争。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种基于并行投票的共识方法,其特征在于,所述基于并行投票的共识方法包括以下步骤:
S1、在系统中从配置文件读取初始化信息,并将初始化信息打包成创世区块组且发布到网络中;
S2、网络节点接收到初始化信息后进行投票共识产生多个普通区块组;
S3、在生产普通区块组时根据投票共识生成一个特殊区块组;
S4、利用创世区块组、普通区块组及特殊区块组的并行处理完成投票共识。
2.根据权利要求1所述的基于并行投票的共识方法,其特征在于,每一个区块组通过共识产生,每个共识过程依照先后顺序划分为Prepare、Vote、Propose和Commit四个阶段。
3.根据权利要求2所述的基于并行投票的共识方法,其特征在于,所述步骤S2中包括以下步骤:
S21、启动节点根据当前时间计算回合数,利用回合数计算当时的轮值记账节点编号并执行Commit过程;
S22、判断节点是否为投票节点,若是,则进入Vote过程并执行S23,如否,则执行步骤S24;
S23、判断网络中是否已经产生多个普通区块组,若是,则进行选举投票并执行步骤S24,若否,则直接执行步骤S24;
S24、判断节点是否为记账节点,若是,则进入Prepare过程并执行步骤S25,若否,则返回步骤S21;
S25、判断节点是否为轮值记账节点,若是,则进入Propose过程并返回步骤S21,若否,则返回步骤S21。
4.根据权利要求3所述的基于并行投票的共识方法,其特征在于,所述步骤S1中包括以下步骤:
S11、加载配置文件判断是否为代理节点,若是,则执行步骤S12,若否,则执行步骤S14;
S12、从配置文件读取Voter_List初始化信息,并生产初始化事务;
S13、将初始化事务打包为区块并将区块打包为区块组,设置区块组头后发布区块组;
S14、等待接收创世区块组;
S15、从创世区块组读取初始化事务并更新内存状态信息后进行共识。
5.根据权利要求4所述的基于并行投票的共识方法,其特征在于,所述步骤S2中还包括超时处理步骤:
SA1、判断节点是否满足提交的条件,若是,则执行区块组提交操作并进入下一个共识周期,若否,则从一轮共识的开始时刻t0开始直到当前时刻t共经过的最新共识回合数temp=(t-t0)%Tcut并执行下一步,其中Tcut为每个共识回合的时长;
SA2、判断从一轮共识的开始时刻t0开始直到当前时刻t共经过的最新共识回合数temp是否大于系统中记录的从时刻t0开始共经过的共识回合数,若是,则更新系统记录的共识回合数为最新共识回合数temp并执行下一步,若否,则判断节点是否轮值记账节点,若是,则判断接收到的投票是否超过2NV/3,若是,则统计投票并发布区块组头,且返回SA1,若否,则直接返回SA1;
SA3、判断节点是否收到区块组头,若是,则请求缺少的合法区块并返回SA1,若否,则向所有投票节点询问当前最大的区块链高度MaxH并执行下一步;
SA4、判断当前最大的区块链高度MaxH是否比本地高度高,若是,则请求缺少的区块组头并返回SA1,若否,则执行下一步;
SA6、判断该节点是否为投票节点,若是,则产生投票并发送给轮值记账节点且返回步骤SA1,若否,则直接返回步骤SA1。
6.根据权利要求5所述的基于并行投票的共识方法,其特征在于,所述Prepare阶段,负责产生区块的记账节点分别从自己的事务池中取出一定数量的事务用以产生区块。
7.根据权利要求6所述的基于并行投票的共识方法,其特征在于,所述Vote阶段,当投票节点接收到记账节点发布的区块,需要将区块存储于内存的共识区块组中;在接收到所有记账节点产生的区块或者等待超时后对区块头和区块体的信息的合法性进行验证,包括区块高度、区块号是否正确、创建节点身份是否正确等,根据验证结果生成对区块的投票并将投票发送给轮值记账节点;区块投票需要包含区块组中每个区块的hash值及其投票意见,此外还需要附上生成者的公钥和签名,防止投票被伪造。
8.根据权利要求7所述的基于并行投票的共识方法,其特征在于,所述Commit阶段,是所有节点均需执行的阶段,每个节点在该阶段需要执行区块组提交操作,其执行意味着当前轮的结束及下一轮共识的开始。
9.根据权利要求7所述的基于并行投票的共识方法,其特征在于,所述Propose阶段,轮值记账节点需要收集投票节点产生的Vote_Ticket, 并将其存储在一个Vote_List=<Vote_Ticket1, Vote_Ticket2…>中;在满足统计结果产生条件后,调用投票统计函数产生统计结果VR(Vote_Result); Vote_Result =<<hash1, opinion1>, <hash2, opinion2>,…, <hashNw, opinionNw> >;最后将投票列表和统计结果打包到区块组头中,并在设置好其余变属性变量后将其发布到网络中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010801993.8A CN112104482B (zh) | 2020-08-11 | 2020-08-11 | 一种基于并行投票的共识方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010801993.8A CN112104482B (zh) | 2020-08-11 | 2020-08-11 | 一种基于并行投票的共识方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112104482A true CN112104482A (zh) | 2020-12-18 |
CN112104482B CN112104482B (zh) | 2021-06-29 |
Family
ID=73753535
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010801993.8A Active CN112104482B (zh) | 2020-08-11 | 2020-08-11 | 一种基于并行投票的共识方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112104482B (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113114613A (zh) * | 2020-12-29 | 2021-07-13 | 上海能链众合科技有限公司 | 一种区块链容错共识的流水线处理方法 |
CN113347007A (zh) * | 2021-08-03 | 2021-09-03 | 南京金宁汇科技有限公司 | 一种可以对多个提案进行共识的共识方法 |
CN113723962A (zh) * | 2021-11-04 | 2021-11-30 | 中国信息通信研究院 | 区块链权限管理方法和区块链系统 |
WO2022127424A1 (zh) * | 2020-12-16 | 2022-06-23 | 中兴通讯股份有限公司 | 区块组头的获取方法及装置,存储介质及电子装置 |
CN114723444A (zh) * | 2022-01-21 | 2022-07-08 | 佛山赛思禅科技有限公司 | 一种用于并行投票共识的数据分片方法 |
CN114820183A (zh) * | 2021-09-08 | 2022-07-29 | 佛山赛思禅科技有限公司 | 一种消除并行投票证明共识算法中分叉问题的方法及系统 |
CN115470292A (zh) * | 2022-08-22 | 2022-12-13 | 深圳市沃享科技有限公司 | 区块链共识方法、装置、电子设备及可读存储介质 |
WO2023016428A1 (zh) * | 2021-08-12 | 2023-02-16 | 清华大学 | 一种拜占庭容错方法、装置、电子设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20170323392A1 (en) * | 2016-05-05 | 2017-11-09 | Lance Kasper | Consensus system for manipulation resistant digital record keeping |
CN109447810A (zh) * | 2018-11-29 | 2019-03-08 | 杭州秘猿科技有限公司 | 并行区块链共识方法、系统、电子设备和计算机可读存储介质 |
CN109964242A (zh) * | 2018-05-25 | 2019-07-02 | 北京大学深圳研究生院 | 一种基于信任关系的区块链共识方法 |
CN109964446A (zh) * | 2018-06-08 | 2019-07-02 | 北京大学深圳研究生院 | 一种基于投票的共识方法 |
CN110945853A (zh) * | 2018-12-07 | 2020-03-31 | 北京大学深圳研究生院 | 基于联盟链投票共识算法产生及管理多模标识网络的方法 |
-
2020
- 2020-08-11 CN CN202010801993.8A patent/CN112104482B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20170323392A1 (en) * | 2016-05-05 | 2017-11-09 | Lance Kasper | Consensus system for manipulation resistant digital record keeping |
CN109964242A (zh) * | 2018-05-25 | 2019-07-02 | 北京大学深圳研究生院 | 一种基于信任关系的区块链共识方法 |
CN109964446A (zh) * | 2018-06-08 | 2019-07-02 | 北京大学深圳研究生院 | 一种基于投票的共识方法 |
CN109447810A (zh) * | 2018-11-29 | 2019-03-08 | 杭州秘猿科技有限公司 | 并行区块链共识方法、系统、电子设备和计算机可读存储介质 |
CN110945853A (zh) * | 2018-12-07 | 2020-03-31 | 北京大学深圳研究生院 | 基于联盟链投票共识算法产生及管理多模标识网络的方法 |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2022127424A1 (zh) * | 2020-12-16 | 2022-06-23 | 中兴通讯股份有限公司 | 区块组头的获取方法及装置,存储介质及电子装置 |
CN113114613A (zh) * | 2020-12-29 | 2021-07-13 | 上海能链众合科技有限公司 | 一种区块链容错共识的流水线处理方法 |
CN113114613B (zh) * | 2020-12-29 | 2023-05-02 | 上海零数众合信息科技有限公司 | 一种区块链容错共识的流水线处理方法 |
CN113347007A (zh) * | 2021-08-03 | 2021-09-03 | 南京金宁汇科技有限公司 | 一种可以对多个提案进行共识的共识方法 |
WO2023016428A1 (zh) * | 2021-08-12 | 2023-02-16 | 清华大学 | 一种拜占庭容错方法、装置、电子设备及存储介质 |
CN114820183A (zh) * | 2021-09-08 | 2022-07-29 | 佛山赛思禅科技有限公司 | 一种消除并行投票证明共识算法中分叉问题的方法及系统 |
CN114820183B (zh) * | 2021-09-08 | 2023-01-31 | 佛山赛思禅科技有限公司 | 一种消除并行投票证明共识算法中分叉问题的方法及系统 |
CN113723962A (zh) * | 2021-11-04 | 2021-11-30 | 中国信息通信研究院 | 区块链权限管理方法和区块链系统 |
CN113723962B (zh) * | 2021-11-04 | 2022-02-22 | 中国信息通信研究院 | 区块链权限管理方法和区块链系统 |
CN114723444A (zh) * | 2022-01-21 | 2022-07-08 | 佛山赛思禅科技有限公司 | 一种用于并行投票共识的数据分片方法 |
CN115470292A (zh) * | 2022-08-22 | 2022-12-13 | 深圳市沃享科技有限公司 | 区块链共识方法、装置、电子设备及可读存储介质 |
CN115470292B (zh) * | 2022-08-22 | 2023-10-10 | 深圳市沃享科技有限公司 | 区块链共识方法、装置、电子设备及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112104482B (zh) | 2021-06-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112104482B (zh) | 一种基于并行投票的共识方法 | |
Lashkari et al. | A comprehensive review of blockchain consensus mechanisms | |
CN109426952B (zh) | 一种区块链架构 | |
CN109964446B (zh) | 一种基于投票的共识方法 | |
CN111382456B (zh) | 提案消息处理方法、装置、设备以及存储介质 | |
Li et al. | PoV: An efficient voting-based consensus algorithm for consortium blockchains | |
CN112541758A (zh) | 基于区块链的多轮投票式容错排序共识机制与方法 | |
Singh et al. | A survey and taxonomy of consensus protocols for blockchains | |
CN110611701A (zh) | 一种基于区块链的参数配置和交易处理方法 | |
JP7288264B2 (ja) | トランザクションシーケンスコンセンサス方法及びシステム | |
CN113407632A (zh) | 一种基于pbft的委托权益证明区块链共识算法 | |
EP4222677A1 (en) | Distributed ledger network implementing a synchronous trust consensus model | |
CN110855432A (zh) | 基于可验证随机函数分配验证者奖励的异步bft&dpos共识机制 | |
Xu et al. | Microchain: A hybrid consensus mechanism for lightweight distributed ledger for IoT | |
CN113568972A (zh) | 一种面向图式区块链的混合共识实现装置及实现方法 | |
Pupyshev et al. | Gravity: a blockchain-agnostic cross-chain communication and data oracles protocol | |
Bai et al. | On parallel mechanism of consortium blockchain: Take pov as an example | |
Wels | Guaranteed-TX: The exploration of a guaranteed cross-shard transaction execution protocol for Ethereum 2.0. | |
Singh et al. | Understanding the public, private and consortium consensus algorithms in blockchain technology | |
Cachin et al. | Blockchains and consensus protocols | |
Himanshu | An overview of blockchain technology: Architecture and consensus protocols | |
Bashir | Blockchain Age Protocols | |
Drakatos et al. | Rapid Blockchain Scaling with Efficient Transaction Assignment | |
Djari et al. | Yggdrasil: Secure state sharding of transactions and smart contracts that self-adapts to transaction load | |
CN114820183B (zh) | 一种消除并行投票证明共识算法中分叉问题的方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |