-
区块链作为一种分布式数据库,最基本也是最核心的要求是所有的节点能对所保存的数据达成一致,因此共识机制一直是被研究的重点。区块链共识算法[1-3]主要有工作量证明算法(proof-of-work, PoW)、权益证明算法(proof of stake, PoS)、股权权益证明算法(delegated proof-of-stake, DPoS)及拜占庭容错算法(practical Byzantine fault tolerance, PBFT)。其中,PBFT算法不适用于节点规模庞大的公共链;DPoS算法存在周期过长、不能及时清理恶意节点的问题;PoW算法存在大量算力浪费及电力浪费的问题,同时在交易吞吐量、延迟、确认时间等方面有较大缺陷;PoS算法在一定程度上减轻了PoW算法资源浪费、出块时间长等问题,但“币龄”[4]的出现也带来了“富者愈富”的问题,同时该算法对代币有较大依赖。
现有的区块链可以分为公有链、私有链及联盟链3类。在公有链中,节点可以自由地加入或退出,无需身份审核,如比特币、以太坊等平台。私有链搭建在本地,不做公开用途。联盟链的节点接入需要获得许可,能在一定程度上保证网络中节点的可靠性。但现有的区块链平台几乎都是相互独立的,每一个平台之间的数据不能相互传递,形成事实上的“信息孤岛”,不仅造成资源浪费也不利于区块链整体行业的发展,跨链因此成为区块链研究的一个重点方向。
针对上述情况,本文提出了一种基于信用投票共识机制(proof of vote and trust, PoVT)的跨链方案,并进行了测试,结果表明PoVT的交易处理性能有较大提高,同时对权益粉碎攻击、贿赂攻击及自私挖矿攻击等都有较好的防御能力。本文的主要工作有:1) 构建了一个主从多链的分层跨链模型,实现了从链与从链之间的数据跨链;2) 提出了一种基于信用投票机制的共识算法(PoVT),解决了PoS共识可能出现的权益粉碎攻击、“富者愈富”问题以及通过投票和随机选择出块者的方式解决了通过算力竞争记账权的问题;3) 从链的所有区块信息在主链上通过PBFT算法完成共识,保证了从链区块信息的安全性和不可篡改性,实现从链到主链的单向数据传递。
-
本文提出了PoVT共识算法。该共识通过引入投票机制和信用值,提高了共识效率的同时保证了系统的安全性。在此基础上,构建了一个从链基于PoVT共识,主链基于PBFT共识的主从多链分层跨链模型。
-
模型中的节点被分成4种角色:普通节点No、投票节点Nv、生产节点Np、候补节点Nc、代表节点Nm。同时将时间划分为一个个时间片段,每一个时间片为一个时隙,从链在每个时隙完成校验、出块到上链的全过程,而一个周期则由许多个时隙组成,此外在每一个周期的最后一个时隙结束后,代表节点将该周期所有已确认的区块数据上传至主链网络中。在每一个周期开始前会根据节点的权益以及信用值(STrust值)从希望参与共识的节点中选择一些节点组成一个共识节点集合N={(A1, S1, STrust1), (A2, S2, STrust2), ···, (An, Sn, STrustn)}。该集合中的节点由生产节点、投票节点、候补节点3种角色组成。其中生产节点从交易池中取出交易并打包组装成区块;投票节点对数据进行验证并投票;候补节点负责在生产节点或投票节点因为某些原因无法继续提供服务时,递补成为该角色继续行使使命,保证了系统的安全性与稳定性。在集合N形成后,通过PoVT共识来决定每一个时隙产生区块的生产节点编号,同时在这个过程中通过运行梅森旋转算法[8]生成一个伪随机数来产生组成主链的代表节点的编号。集合N中的节点允许同时拥有主链和从链的双重身份,主链节点负责将其所在主体每一周期内已被确认的区块数据上传至主链网络中,主链节点之间再通过PBFT算法对数据达成共识,形成一条主链。系统的结构如图1所示。
-
在集合N={(A1, S1, STrust1), (A2, S2, STrust2), ···, (An, Sn, STrustn)}中,节点的个数|N|=Nump+Numv+Numc,A为节点的公钥地址,S为节点的权益,STrust值为节点的信用值,Nump为生产节点的个数,Numv为投票节点的个数,Numc为候补节点的个数。将集合中的节点进行编号,编号1~Nump的节点成为生产节点,编号Nump+1~Nump+Numv的节点为投票节点,剩下的个数为Numc的节点成为候补节点,普通节点No不参与共识但需同步最新数据块至本地。
-
PoVT共识中的投票机制[9]避免了节点之间的算力竞争,引入的信用机制能够保证参与共识的节点的可靠性,同时降低权益对记账权分配的影响,从而增大对系统发起权益粉碎攻击、双花攻击、自私挖矿攻击等的难度。
1)共识流程
网络中的普通节点产生交易数据,① 在周期开始前,根据节点的权益及STrust值形成一个共识节点集合。② 在集合中从范围为(1, 2, ···, Nump)的生产节点中选择编号与随机数R相同的节点成为出块节点,该节点从交易池中取出一些交易打包并组装成区块,随后将区块广播给投票节点并准备接受投票节点的反馈消息。在这一阶段,如果要产生的区块是创世区块的话,则R为1。如果为非创世区块的话,随机数由上一生产节点在生成新区块的过程中产生。③ 投票节点在收到生产节点发出的区块验证请求后,对区块中的数据进行验证,验证无误后签名并加盖时间戳(timestamp),并广播确认信息。若发现数据有误,则广播一个拒绝消息。④ 生产节点在收到Numv /2+1个投票节点的确认消息后则表明已对该区块达成共识,生成一个记录此时时间的时间戳,然后对该区块进行后续的签名、广播等操作。反之,若网络中存在超过Numv /2+1个投票节点发出拒绝消息则判定该生产节点有恶意行为,立即取消该节点的共识资格并由编号为R+1的生产节点继续进行共识流程(若R+1>Nump,则从第一个生产节点开始),同时在候补节点中根据编号顺序递补成为新的生产节点。⑤ 每个被选择的生产节点都被要求在一个时间Tb内完成出块,若超过这个时间还没能完成出块则由编号为R+1(若R+1>Nump,则从第一个生产节点开始)的生产节点继续完成下一个区块的产生。⑥ 在每一轮周期结束后,成功参与共识的节点会获得STrust值奖励。相应地,有恶意行为的节点也会受到降低STrust值的惩罚,则该节点后续想要参与共识的难度增加。共识流程如图2所示。
2)随机数R的产生
除了生成创世区块的R值默认为1之外,每一个生产节点生成区块的同时也产生一个记录在区块中的随机数R来决定谁是下一个生产节点,随机数R生成的过程如下:
生产节点在向投票节点提交区块后同时收集投票节点的反馈消息,即Signature[i](1≤i≤Numv),同时根据时间戳TimeStamp由式(1)得到Rsource:
$$ \begin{split} &{\rm{Rsource}} = {\mathop \oplus \limits_{i = 1}^k {\rm{Signature}}[i] \oplus {\rm{TimeStamp}}} \\ &\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;{{\rm{Nu}}{{\rm{m_p}}}/2 < k < {\rm{Nu{m_v}}}} \end{split}$$ (1) 式中,⊕表示异或操作,然后对得到的Rsource进行哈希运算,取字符串的后32位将其转化成整数,得到R',如式(2):
$$ R' = {\rm{StrToInt}}\left( {{\rm{SubStringEnd32}}\left( {{\rm{Hash}}\left( {{\rm{Rsource}}} \right)} \right)} \right) $$ (2) 由式(3)可得随机数R:
$$ R = R'\boldsymbolod {\rm{Nu{m_p}}} \;\;\;{1 \leqslant R \leqslant {\rm{Nu{m_p}}}} $$ (3) 通过这种方式随机地选择生产节点,避免了当前生产节点出于利益考虑而干扰下一生产节点的选择,能够有效地预防节点之间地共谋攻击,也保证了共识过程的公平与稳定。
-
信用机制通过综合考虑一个节点的有效出块数、有效投票数、参与度等因素,使用STrust值来定量地描述一个节点的可信度,再结合节点本身的权益来决定节点是否能够参与共识过程。
1) 节点有效出块数。即生产节点在整个周期内生成的有效区块的数量。若一个生产节点在属于它的时隙内成功生成一个通过验证的区块,则认定该节点生成一个有效区块。反之,为无效区块。节点有效投票数
$ \gamma $ 表示为:$$ \gamma = a \sum\limits_{s = 1}^n {\frac{1}{{{2^{c t}}}}} B_i^s $$ (4) 式中,
$ {B}_{i}^{s} $ 表示节点i在第s个时隙内是否成功生成区块,若成功生成区块则为1,否则为0;t是节点生成区块的时间,$ \gamma $ 随着t的增大而减小;c(c∈[0,1])是时间系数,可根据系统的实际考虑调节出块时间对系统的影响;a是权重,可根据系统实际需要调节$ \gamma $ 对系统的影响。2) 节点有效投票数。即节点在整个周期内投出的有效票数。若节点在正确验证区块及数据无误后按要求签名确认则认定为有效投票。与此同时,若节点对某一区块投出了确认票,但在该时隙内网络中存在超过Numv /2+1个拒绝消息,则认定该节点的此次投票无效。节点的有效投票数表示为:
$$ \omega = b \sum\limits_{s = 1}^n {\frac{1}{{\sqrt {\dfrac{m}{n}} }}} V_i^s $$ (5) 式中,
$ {V}_{i}^{s} $ 表示节点i在第s个时隙内是否投出有效票,若是则为1,不是则为−1;m为该周期内总的时隙数;n为节点$i$ 在该周期内实际参与的时隙数;b(b∈[0,1])为权重。3) 节点参与度。即节点参与交易的情况。节点参与度
$\lambda $ 可表示为:$$ \lambda = f \sum\limits_{s = 1}^n {{\rm{tra}}{{\rm{n}}_s}} $$ (6) 式中,trans表示的是节点i在第s个时隙内产生的区块中参与的交易数,若节点i是交易发送者或接收者其中一方则为1,否则为0;f(f∈[0,1])为权重。
4) 历史信用影响度。节点的历史信用影响度是指节点的信用值受其历史信用值与权益的影响。节点的历史信用影响度
$\varepsilon $ 可表示为:$$ \varepsilon = g \ln ^{{{\rm{stake}} \times {\rm{trust}}_i^{h - 1}}} $$ (7) 式中,stake表示节点所拥有的权益;
${{\rm{trust}}}_{i}^{h-1}$ 表示节点i在第h个周期之前的信用值;g(g∈[0,1])是权重;ε的值随着${{\rm{trust}}}_{i}^{h-1}$ 的值增大而增大,目的是降低节点权益的影响占比。5) 惩罚因子。为确保系统能够安全稳定地运行,需要采取措施对节点的一些恶意行为进行惩罚。惩罚因子
$ {\rm{\theta }} $ 表示为:$$ \theta = c \sum\limits_{s = 1}^n {b_i^s + d \sum\limits_{s = 1}^n {V_i^s} } $$ (8) 式中,
$ {b}_{i}^{s} $ 表示节点i在第s个时隙内是否产生了无效的区块,若是则为1,否则为0;$ {V}_{i}^{s} $ 表示节点i在第s个时隙内是否发出了无效的投票,若是则为1,否则为0;c和d分别为对应的权重,可根据系统实际需要灵活调整对无效块和无效票的惩罚力度。6) 节点信任度更新公式
周期结束后,系统会根据公式评价共识节点的行为,更新其信用值。信用值更新公式可表示为:
$$\begin{aligned} &{\rm{trust}}_i^h =\\ &\left\{ {\begin{aligned} &{{\rm{trust}}_i^{h - 1} + \sum\limits_{s = 1}^n {(\gamma + \omega + \lambda - \theta ) + \varepsilon\;\;\;\;\; i \in \left[ {1,{\rm{Nu{m_p}}} + {\rm{Nu{m_v}}}} \right]} } \\ &{{\rm{trust}}_i^{h - 1} + 1 \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;i \in \left[ {{\rm{Nu{m_p}}} + {\rm{Nu{m_v}}} + 1,|N|} \right] } \end{aligned}} \right. \end{aligned}$$ (9) 式中,
${{\rm{trust}}}_{i}^{h}$ 表示节点i在第h个周期的信用值,为提高节点参与共识的积极性,若节点被选入集合N中但实际未参与共识(如候补节点),系统也会给予这些节点信用值奖励。同时,若节点因为作恶而导致STrust值降至系统设定的阈值以下,则会被限制为每隔若干个周期才能参与一次共识,且若节点持续作恶直至STrust值降为0,则该节点将会永久丧失参与共识的资格。
-
主链节点从集合N中选择,利用从链生产节点计算随机数R的过程中得到的中间数据R'作为梅森旋转算法(MT19937-32)的种子得到一个随机数Rm,再从集合N中选择编号与Rm相同的节点作为代表节点构成主链。Rm的计算过程如下:
首先将R'作为种子赋值给MT[0],根据式(10)递推得到剩下的623个状态,完成全部624个状态的填充。
$$\begin{split} &\qquad\qquad{\rm{MT}}[i] = {\rm{lowest32bitsof}}\\ &\left( {f \left( {{\rm{MT}}[i - 1] \oplus \left( {{\rm{MT}}\left[ {i - 1} \right]} \right) > > 30} \right) + i} \right) \end{split}$$ (10) 然后对得到的旋转链进行遍历并根据式(11)对每一个状态位进行处理:
$$\begin{aligned} {\rm{MT}}[i] = &{\rm{MT}}[i + m] \oplus ( {\rm{uper}}\_{\rm{mask}}\left( {{\rm{MT}}[i]} \right)||\\ &{\rm{lower}}\_{\rm{mask}}\left( {{\rm{MT}}[i + 1]} \right) )A \end{aligned}$$ (11) 式中,m的取值为397;||表示将MT[i]的高1位和MT[i+1]的低31位组合,设组合后的数字为x,则xA的运算规则为:
$$ x_A = \left\{ {\begin{aligned} &{x > > 1 \;\;\;\;{x_0} = 0} \\ &{\left( {x > > 1} \right) \oplus a\;\; {x_0} = 1} \end{aligned}} \right. $$ (12) 式中,a的取值为0x9908B0DF;x0表示的是该数的最低位。然后再经过式(13)的处理,得到一个伪随机数
$ R_m^{'} $ :$$ \begin{split}& {y = x \oplus \left( {\left( {x > > u} \right)\& d} \right)} \\ &\;{y = y \oplus \left( {\left( {y < < s} \right)\& b} \right)} \\ &\;{y = y \oplus \left( {\left( {y < < t} \right)\& c} \right)} \\ &\;\;\;{R_m^{'} = y \oplus \left( {y > > l} \right)} \end{split} $$ (13) 式中,令x=MT[0],(u, d)=(11, FFFFFFFF16),(s,b)=(7, 9D2C568016),(t, c)=(15, EFC6000016),
$l = 18$ 。最后将$ R_m^{'} $ 取模处理后得到Rm:$$ {R_m} = R_m^{'}\boldsymbolod \left| N \right|\;\;\;\;\; {1 \leqslant {R_m} \leqslant \left| N \right|} $$ (14) 式中,|N|是指集合N中生产节点、投票节点、候补节点的数量总和。选取节点编号与Rm相同的节点成为主链节点,再由主链节点构建一条主链,完成主链上的事务处理。
-
在从链的生产节点生成了随机数Rm后将之写进新生成的区块中,在每一周期最后一个从链区块产生后,集合N中所有编号与写入各区块中的Rm相同的节点成为代表节点,代表节点将自己所在从链中已确认的区块数据上传至主链网络中,随后参与共识并将主链区块保存至本地。为了保证主链上保存的从链区块数据都是真实完整、未被篡改的,代表节点在打包之前会检查被上传的从链区块数据的上传次数,只有被不少于其所在从链中一半以上的代表节点上传过的从链区块数据才能被主链节点打包上链。当主链节点确保所打包信息都符合要求后,在主链上通过PBFT共识算法达成共识,完成信息在主链上的完整上链过程。
-
如图1所示,每一周期被选择成为主链节点的各从链代表节点(P1、P2)会将自己所在从链本周期产生的区块(A1、B1、C1、D1)上传至主链网络中,同时参与主链共识,在共识完成后各代表节点同样保存主链区块至本地网络中,每一个代表节点(P1、P2)保存的主链区块中都包含来自不同从链的区块数据(A2、B2、A3、B3···)供其所在从链其余节点(A1、B1、C1、D1)查询,从而完成不同从链之间的数据跨链。
-
在PoS网络中,拥有较低权益的节点挖出区块的可能性同样很低。另一方面,拥有较低权益的节点就更有可能去尝试分叉,因为在PoS网络中节点产生区块并不需要投入大量的算力等资源,即使分叉失败也只是损失较小的权益,而一旦攻击成功则能获取大量利益。在PoVT中,生产者只负责组装区块,还要经过投票节点的确认才能发布区块,且一个时隙内一个生产者最多只被允许产生一个区块,所以攻击者是无法发起权益粉碎攻击的。
-
自私挖矿的攻击者在挖出区块后选择不将挖出的区块发布出去,而是在已挖出的区块上继续挖出新的区块,当自己的秘密分叉超过主链的长度时,就将秘密分叉发布出来取代原来的主链成为新的最长链,使自己获得更多的收益。这种攻击不仅严重损害了原来主链上的诚实矿工的权利,而且还会造成数据丢失等危害区块链稳定性的情况。但在PoVT机制下,出块者是在生产节点中通过投票机制随机选择出来的,同时生产节点的选择则受到STrust值的影响,且生产节点如果不能在规定的时间内产生区块的话不仅得不到STrust值的奖励反而STrust值会下降,这样导致节点之后成为共识节点的概率降低,从而使攻击难以成功:
$$ \mathop {\lim }\limits_{n \to \infty } \frac{{{\rm{trust}}_i^{h - 1} + m}}{{{\rm{trust}}_i^{h - 1} + n}} = 0 $$ (15) 式中,分母为节点正常出块的信用值;分子为节点自私挖矿时的信用值增长。
${n}=\displaystyle\sum\limits _{s=1}^{n}({\rm{\gamma }}_1+{\rm{\omega }}_1+{\rm{\lambda }}_1-{\rm{\theta }}_1)+ $ $ {\rm{\varepsilon }}_1$ ,而由于节点被检测出自私挖矿行为,${\rm{\gamma }}_2$ =0,$ {\rm{\lambda }}_2 $ <$ {\rm{\lambda }}_1 $ ,${\rm{\varepsilon }}_2$ <${\rm{\varepsilon }}_1$ ,${\rm{\theta }} _2$ >${\rm{\theta }}_1$ ,${m}=\displaystyle\sum\limits _{s=1}^{n}({\rm{\omega }}_2+{\rm{\lambda }}_2-{\rm{\theta }}_2)+{\rm{\varepsilon }}_2$ 。节点的历史信用值$ {{\rm{trust}}}_{i}^{h} $ 因为攻击行为而随着周期数的增加而下降,正常出块的节点则保持增加,因此自私挖矿攻击对于任何理性节点而言都是得不偿失的行为。 -
双花攻击是所有区块链网络都必须要解决的威胁。传统的双花攻击的步骤是:1) 攻击者发起一个交易;2) 在交易上链后,攻击者在该交易之前的一个区块上建立一个包含新交易的分叉;3) 而当分叉的长度超过原主链时,攻击者将其发布从而取代原主链成为新的最长链,此时原交易被新的交易所取代。而在主从多链分层跨链系统中,从链的区块数据不仅会被保存在从链节点上,还会通过代理节点上传至主链中,在经过主链共识后形成主链区块保存至主链节点中。若想发起双花攻击,不仅需要改变从链的区块信息,同时还要改变相应的主链节点上的区块信息,成本巨大,攻击难以实现。
A Master-Slave Multi-Chain Hierarchical Cross-Chain Model Based on Credit Voting Consensus
-
摘要: 该文提出了一种适用于联盟链的基于信用投票机制的共识算法(PoVT)。该算法通过引入投票机制来决定记账权的归属,避免了节点之间的算力竞争,使系统中的节点能够公平地获得记账权;通过给节点赋予信用值,减小权益对系统的影响,同时对节点的行为进行量化评价能够更好地约束节点的行为,使其对恶意行为产生顾虑;此外,在PoVT的基础上提出了一个主从多链的分层跨链模型,对其性能进行了实验分析,结果表明系统的效率有了提高,且对双花攻击、自私挖矿、权益粉碎等攻击手段都有一定的防御能力。Abstract: This paper proposes a consensus algorithm based on the credit voting mechanism for alliance chain, named proof of vote and trust (PoVT). This algorithm introduces the voting mechanism to decide the ownership of the accounting privilege, avoids the competition of the computation power among nodes, and makes all nodes in the system get the accounting privilege fairly. By assigning credit value to nodes, the influence of both rights and interests on the system can be reduced. Meanwhile, quantitative evaluation on the behavior of nodes can better prevent nodes conducting malicious behaviors. Based on the proposed PoVT, a master-slave multi-chain layered cross-chain model is constructed and the performance is evaluated through experiments. The results show that the efficiency of the system is improved, and the system has a certain defense capability against attack methods such as double spending attack, selfish mining, and nothing-at-stake attack.
-
Key words:
- blockchain /
- consensus algorithm /
- cross chain /
- trust values /
- voting mechanism
-
[1] LAMPORT L. The part-time parliament[J]. ACM Transactions on Computer Systems, 1998, 16(2): 133-169. doi: 10.1145/279227.279229 [2] ONGARO D, OUSTERHOUT J. In search of an understandable consensus algorithm[C]//The 2014 USENIX Conference on USENIX Annual Technical Conference. [S.l.]: USENIX Association, 2015: 305-320. [3] LAMPORT L, SHOSTAK R, PEASE M. The Byzantine generals problem[J]. ACM Transactions on Programming Languages and Systems, 1982, 4(3): 382-401. doi: 10.1145/357172.357176 [4] LARIMER D. Transactions as proof-of-stake [EB/OL]. [2020-06-10]. https://bravenewcoin.com/assets/Uploads/TransactionsAsProofOfStake10.pdf. [5] EYAL I. The miner's dilemma[C]//2015 IEEE Symposium on Security and Privacy. SanJose: IEEE, 2014: 89-103. [6] HAN X, YUAN Y, WANG F Y. A fair blockchain based on proof of credit[J]. IEEE Transactions on Computational Social Systems, 2019, 6(5): 922-931. doi: 10.1109/TCSS.2019.2938841 [7] LEE S B, HWANG D Y, KIM J, et al. Proof of lottery: Design for block producing algorithm based on PoS for scalability[C]//International Conference on Information Networking(ICOIN). Barcelona: IEEE, 2020: 666-669. [8] MATSUMOTO M, NISHIMURA T. Mersenne twister: A 623-dimensionally equidistributed uniform pseudo-random number generator[J]. ACM Transactions on Modeling and Computer Simulation(TOMACS), 1998, 8(1): 3-30. doi: 10.1145/272991.272995 [9] LI K J, LI H, HOU H X, et al. Proof of vote: A high-performance consensus protocol based on vote mechanism & consortium blockchain[C]//The 19th International Conference on High-Performance Computing and Communications. Bangkok: IEEE, 2017: 466-473.