黄建华,夏 旭,李忠诚,李建华,郑 红
(华东理工大学 信息科学与工程学院,上海 200237)
通讯作者:黄建华,E-mail:jhhuang@ecust.edu.cn
自2008 年比特币[1]诞生伊始,比特币的底层技术——区块链技术开始进入人们视野.这种加密公共账本技术具有去中心化、防篡改和可追溯等特性,激发了业界对于区块链技术的研究热情,由此也产生了众多的数字货币加密技术,如以太币(Ether)[2]、点点币(PPCoin)[3]等,以及衍生出来的用于区块扩容的闪电网络(lightning network)[4].2015 年,Linux 基金会发起HyperLedger 项目,其中最著名的是Fabric 项目,Fabric 中没有挖矿机制,也没有使用代币作为激励机制,它是有准入资格授权的私有区块链网络,Fabric 的成员要在会员服务提供商进行注册[5].文献[6]详细介绍了基于区块链的平行社会发展趋势,讨论了智能合约的理念、应用和意义.针对第三方机构利用大量用户隐私数据来提供个性化定制服务导致用户个人隐私泄露的问题,文献[7]提出了基于区块链的个人数据保护系统,使用户能够在享受个性化定制服务的同时保护个人信息.但是,在点对点网络中面临着广播带来的网络开销较大问题,各个节点所观察到的交易事务先后顺序不可能完全一致.因此,区块链系统需要设计一种机制,对在一定时间内发生事务的先后顺序进行共识,这种对事务的先后顺序达成共识的算法就是共识机制.区块链分为公有链、联盟链和私有链:公有链主流的共识机制是工作量证明(proof of work,简称PoW)和权益证明(proof of stake,简称 PoS),私有链或者联盟链的共识机制以实用型拜占庭容错协议(practical Byzantine fault tolerance,简称PBFT)为主.以PoW 为基础的加密货币可能会遭受双重支付攻击,为了降低风险,交易通常需要等待一定数量的确认区块(6 个).但是,这使得拒绝服务攻击(DoS)有了实现的可能,例如,攻击者可以发起很多低价值的交易来冲击网络.2015 年7 月,就有一次针对比特币网络的洪泛攻击[8].比特币系统的另一问题就是能耗巨大,2017 年,整个比特币系统至少消耗2.55GW 电力,并且未来可能达到7.67GW,与奥地利全年耗电量相当[9,10].PoW 机制高昂的计算代价使其难以满足一些每秒高达数万笔交易的系统需求.目前,比特币社区正在尝试使用闪电网络等解决方案,以改善网络的吞吐量并降低耗电量.为了提高区块链网络交易吞吐量,King 于2012 年创立了点点币,这是第1 种基于PoS 的加密货币.PoS 的提出虽然提高了网络吞吐量,但是带来了诸如短程攻击(贿赂攻击)、币龄累积攻击等新问题.PBFT 虽然可以每秒支持数千笔交易,但较低的节点可扩展性和较高的网络开销也使得PBFT 在公有链领域应用范围有限.但是PBFT 在联盟区块链方面应用广泛,典型的应用有腾讯公司发布的可信区块链平台TrustSQL 以及Linux 基金会发起的Hyperledger Fabric 项目.
本文分析了PoW 机制和POS 机制的优点和不足,提出基于信任度证明的共识机制(proof of trust,简称PoT),旨在解决权益证明机制中存在的易受贿赂攻击、币龄累积攻击以及工作量证明机制中存在的自私挖矿问题,并对PoT 性能以及安全性进行了测试和分析.结果表明,PoT 的效率较PoW 有较大提高.同时,对于贿赂攻击、权益粉碎攻击以及权益累积攻击,比PoS 有更高的防范能力.
共识机制的目标是使所有的诚实节点保存一致的区块链视图,在尽可能短的时间内建立安全和不可篡改的去中心化系统.目前存在的共识机制主要分为PoW 和PoS,其中,PoW 是区块链最早使用的共识机制,PoS 的概念则是由2012 年出现的点点币引出的.
比特币系统是区块链技术的首个应用,其采用的PoW 机制使得区块的产生具有计算方面的难度.比特币系统平均每10 分钟产生一个区块,每个节点都收集新的交易数据,并试图根据这些交易生成新的区块.PoW 解决共识问题的基本思路是寻找随机数(nonce),该随机数要使得给定区块的哈希值前部分出现所需的足够数量的0,而找到这个nonce 所需要的工作量与0 的数目呈指数增长.矿工节点进行循环的SHA-256 计算,最先找到这个nonce 的节点向全网广播其工作量证明和新产生的区块,其他节点验证成功后就接受该区块,然后跟随在该区块的末尾制造新的区块,计算出结果的节点获取比特币作为奖励.虽然这种机制截至目前为止被证明是安全的,但是任何拥有巨大算力(超过51%算力)的组织或者国家都有可能制造一个更长的区块链.尤其是在攻击者购买算力更强的矿机(ASIC)[11]之后,他将获取比一般矿工更强的算力.
针对比特币系统的一个可能的攻击就是自私挖矿(selfish mining)[12],目的是获得更大利润.自私挖矿的攻击者挖到新区块后不在第一时间公布,其他诚实矿工因为不知道新区块的存在,会继续在旧区块基础上挖矿.等到攻击者挖到第2 个区块后,便会同时公布手中藏着的两个区块,这时,区块链就出现了分叉.只要攻击者比诚实矿工多挖一枚区块,攻击者所在的分叉就是最长链.自私挖矿的攻击者只需要拥有全网1/3 的算力,就可以保证自己获得更多的收益,相比51%攻击,自私挖矿显得更容易.作为矿工,在比特币规则中一般都会采用有利于自己的自私挖矿策略.事实上,当有节点拥有超过25%算力的时候,比特币的安全性就不能简单地以51%为阈值来考虑[13],因为不能保证此时所有的矿工都遵守规则.但是在本文提出的PoT 机制中,产生区块不需要投入过多的算力资源,这种攻击反而变得没有效率.
权益证明的核心思想是产生区块的难度与节点在网络中所占权益成反比,即:所持权益越多,越容易产生区块.这是一种效率更高的共识算法,使区块链无需高昂的硬件和电力挖矿成本就能正常运行.
权益证明主要有两大类:一种是基于链的权益证明,其模仿工作量证明机制,随机地为权益人(stakeholder)分配创建区块的权力,典型的有PPCoin、黑币(blackcoin)[14]、活动链(CoA)[15]、DPoS[16]和PoA[17];另一种是基于拜占庭容错的权益证明,在该机制中,只要有超过2/3 的节点遵循协议,无论网络延时如何,协议都可以正常运行,典型的有Tendermint[18]和Casper[19].
在基于链的权益证明机制的虚拟币PPCoin,Clockcoin[20]和Novacoin[21]中,区块的创建是通过消耗币龄(coin age)来完成的.该协议被诟病的地方就在于:即使节点没有连接到网络,币龄也会增加.当前的系统事实上鼓励节点滥用这一机制,它们平时保持离线,只在累积了可观的币龄以后才连线以获得利息,然后再关闭连接.攻击者可以利用这一点,当其所持权益足够大时,对区块链进行分叉并达成双花.区块生成后,币龄就会归零,攻击者必须再次累积币龄才能继续攻击.VeriCoin[22]使用基于币龄的权益时间(stake time)来对节点所持权益进行度量,并且当节点不再参与共识时,其权益时间就开始衰减.Ouroboros[23]使用了一种新的奖励机制来增加对节点诚实行为的奖励,同时还使用了安全多方计算来保持节点中领导者的不可预测性,但是这种方法需要网络中验证节点之间的协调.
文献[24]基于可信执行环境(trust execution environments)提出了共识机制proof of luck,该机制运行在支持SGX 的CPU 上,用来抵御挖矿对于能源的消耗,但是算法的执行依赖于Intel 的特制CPU,违背了区块链的去中心化思想.文献[25]尝试用一种空间证明(proof of space)的概念来取代PoW,并且已经在区块链的框架背景下进行了专门研究.在空间证明中,证明者希望运用计算机存储资源代替PoW 中的算力资源进行证明.空间证明虽然利用了一定的硬件资源,但是随着时间的推移,对硬件资源的消耗量会减少.类似地,文献[26]也提出了时空证明(proof of space-time)算法,但无论是空间证明还是时空证明都需要昂贵的硬件资源,到最后都会出现硬件资源集中化的现象.文献[27]提出了一种有趣的燃烧货币机制PoB(proof of burn),该算法通过将代币转移到不可逆转的地址上以销毁代币,节点燃烧的代币量与被选中挖到下一个块的概率成正比.在PoB 中,随着时间的推移,节点在系统中所持的份额可能会减少,这会驱动节点燃烧货币来获取更多的挖矿机会.这种机制虽然是一个不错的尝试,但是造成了代币资源的浪费,并且挖矿的能力会逐渐被那些掌握更多资源并且愿意燃烧代币的人所掌控.文献[28]提出了一个重要性证明(proof of importance)算法,该算法运行时,节点需要提供自己的重要性才能获取出块权.在重要性证明下,节点所持权益不再是重要性的主要因素,取而代之的是节点的交易量以及交易双方的关系.在重要性证明中,根据钱包的交易次数和货币资产来评估节点的重要性.但是该协议可能会鼓励节点之间相互串通互刷交易量,同时,大资产节点的频繁交易也会造成重要性中心化的问题.
公有链假定所有节点都是不可信的,产生区块的策略主要有两种:基于算力的PoW 机制和基于权益的PoS机制.在PoS 中,每个节点的可信度与它本身所持的资源(比如加密货币数量)呈正相关,这就决定了该节点在网络中所占的权重(以票数计).这种机制会带来许多严重后果,最直接的就是权益粉碎攻击[29,30].PoS 的一大优势就是所持权益越多者越愿意维护系统,反之,所持权益越少责任也就越少.假设矿工只有1%的权益,其成功的概率只有1%,那么该节点可以尽可能尝试分叉,因为在PoS 中分叉并不消耗任何资源.在比特币系统采用的PoW机制中,创建分叉得不偿失,因为必须为此付出大量算力资源.目前,比特币网络每10 分钟产生一个区块并奖励12.5 个比特币,即使耗费大量电力,挖矿仍然是一件有利可图的事情,但是每产生21 万个区块后,收益会减半.当收益不足以维持挖矿所耗费的电力成本时,矿工们就不再有足够的动机去维持区块链的一致性.这就是经济学领域所说的公地悲剧[31].中本聪预见到这个事情的发生,提出了交易费率的解决办法[1].但是在公地悲剧中,参与者有机会自行其是,以牺牲他人的代价来实现自己的利益最大化,所以希望其他节点支付相应费用.每一个理性的矿工总是会采取这样的行动,因为它只寻求自身最优解.如果网络中每一个个体都表现得很自私,那么整个网络环境安全性的下降就在所难免.
迄今为止,权益证明仍然是对区块链公地悲剧的唯一解决方案.为了避免公地悲剧以及权益粉碎攻击带来的网络安全问题,本文提出了基于信任度证明的PoT 共识机制.由于采用PoW 共识的区块链网络因其计算上的难度而不易受到攻击,因此,PoT 中引入了少部分的工作量证明以避免权益粉碎攻击.有别于工作量证明机制中的低吞吐量和巨大的资源耗费,以及纯权益证明机制中币龄累积所造成的权益中心化和易受权益粉碎攻击,PoT 旨在建立一个高吞吐量、安全和低资源消耗的去中心化区块链网络.
PoT 的运行从时间上被划分为一系列周期(epoch),每一个epoch 又被划分为多个时隙(slot),一个slot 内产生一个区块,权益的计算以每个epoch 开始前的历史计算.在每个epoch 开始时,矿工节点都会计算生成一个满足当前难度的空区块,通过这个空区块衍生出一组参与者(participants)集合{P1,P2,P3,…,PT},然后,每个slot 均从这些Participants 集合中随机选取N个节点作为基本权益代表(stakeholder),这些代表用集合{S1,S2,S3,S4,…,SN}表示,这里N logistic 回归模型在对数增长期节点的信任度的增长是相当快的,不利于合理地判断节点信任的增长.为了避免出现这种情况,本文提出了对logistic 回归模型产生的信任度进行修正的算法,根据节点当前信任度和上一轮投票时的信任度,对在投票时的信任度进行权重均衡.最终进行投票时的信任度度量公式如下: 其中,h表示当前epoch 内第h个slot.节点在第t个epoch 中的第1 个slot 开始时的信任度与第t-1 个epoch 的最后一个slot 结束时的信任度相等,即,并且.通过β可以对信任度的增加速率进行修正,使其增长不会太快,避免在网络初期阶段的信任度中心化.初始时,β值为1,因为刚开始并不知道节点是否会有作恶倾向. β的变化基于累计偏差,具体变化算法由公式(3)确定: 同样地,在第t个epoch 开始时的信任度累积偏差与第t-1 个epoch 的最后一次参与共识时的信任累积偏差相等,即,并且.参数c是用户定义的参数,用于控制对节点的最近行为的反应权重.threshold是为了防止β过于饱和趋近于1 而设置的阈值,其初始值为0.25(在社会学范畴中,对于人的历史信任度比当前信任度能更好地分析人的信誉.threshold初始值设为0.25 可以在防止β过于饱和趋近于1 的同时,也能让不会过分倚重当前信度函数直接评价所得的信任度).表示信任度的偏差,其计算方法见公式(4). 在第t个epoch,节点对第h个slot 进行共识时的信任度偏差等于当前信任度与对第h-1 个slot 进行投票时的投票信任度的绝对值之差.最终的累积偏差见公式(5). 从公式(5)可以看出:c值越大,说明用户给予的最近的信任度偏差的权重比之前累积信任度偏差要高. 传统的共识机制单纯依靠提高准入门槛,比如算力或者权益来维护区块链网络的稳定与安全,但是算力和基于币龄的权益都会使区块链网络倾向于中心化.本文提出了一套完整的对于节点行为的判别策略,通过对节点运行机制的检测与判别,以识别恶意的节点,并进行信任度惩罚. 本文将节点行为定义为#good 和#bad 两种. · #good:每一个stakeholder 对于区块的签名被认为是对该区块的投票,投票时使用自己的私钥进行签名,可以用公钥去验证.只要节点参与生成的区块的签名合法,满足当前难度,具备竞争上链资格,则将其行为定义为#good; · #bad:如果前N-1 个stakeholder 发现它要签名的区块存在问题,那么根据协议就不予签名.如果仍要签名,那么具有区块打包权的第N个stakeholder 在将区块打包之前完全可以决定是否打包区块.如果不打包,则认为该区块无效,所有对该区块进行的签名操作都被视为无效,这将消耗这些stakeholder 的信任度.如果打包成功并且与其他区块一起进行信任度竞争,网络中的其他节点会对区块的签名进行验证.如果区块中有的签名是非法的或者区块头哈希不正确,则认为该区块非法.对该区块进行签名操作的所有stakeholder 均被认为是恶意的,使用相应的惩罚机制进行信任度惩罚. 基于经典的PBFT 的2/3 原则,可以设定一个投票上链的阈值.只有在区块中拥有超过2/3 的stakeholder 投票的情况下才具有上链资格.节点成为stakeholder 的概率由公式(6)计算: 在PoT 中,区块的产生过程被一分为二:首先,通过简单难度的工作量证明产生一个空区块;然后,通过stakeholder 的投票来确定该区块是否有上链资格.在区块产生过程中引入计算以求规避权益粉碎攻击,在将交易放入区块打包广播到网络的过程中,引入基于链的权益证明机制,所持信任度高的区块相比于其他区块上链机会更大.相比于单纯基于算力的竞争,这种方法可以大幅度提高网络的吞吐量,减少网络的资源消耗.其具体架构如图1 所示. 其中,stakeholder 由PoT 的跟随币机制衍生出来.在其产生后对其认可的空区块进行私钥签名,最后一个stakeholder 即stakeholderN将其认可的交易进行打包,满足要求的区块被打包之后上就可以上链. PoT 共识机制产生区块的过程如下. (1)首先,每个矿工都尝试去产生一个区块头,这个区块头中包含了先前区块的哈希(Bprev)、矿工地址(Adressminer)、该区块在区块链中的索引(height)以及一个随机值(nonce).同时,区块头中不能包含任何交易.进行工作量证明计算.当矿工生成区块头之后,如果符合当前网络难度目标,就向全网广播该区块头; (2)所有节点将这个区块头的散列值作为确定T个participants 的数据.具体算法是:通过将T个固定的值与区块头的散列值进行哈希运算,得到的第i个结果x将被用来确定第i个participant.这个过程就是在PoT 中引入一个跟随币机制,有意向成为participant 的节点将所有未花费的输出(UTXO)按照字典的方式进行排序,这里假设UTXO 不为空,具体格式为{NodeID,Coin},其中,NodeID为节点的公钥地址,Coin表示节点所持币的数量.同时,CurrentID表示当前participant 的序号,并且CurrentID≤T.具体过程如下:节点选取一个其值介于1 和系统中UTXO 总数量之间的随机数x,为了找到第x个币的持有者,节点找到一个最小的i,使得列表从最开始到i的节点所持UTXO 代币数量不小于x.这样,第i个地址就是第x个币的拥有者; (3)在确定了T个participants(参与者)之后.在每一个slot 中,都会从中随机选取N个节点作为stakeholder参与共识,这里N (4)第N个stakeholder 向网络广播打包后的区块,当其他节点收到这个区块并验证是有效时,这些节点将该区块认为是区块链的合法扩展.考虑到以后的网络会拓展得很大,所以如果有两个区块同时在全网传播,那么两个区块就进行基于链的权益证明竞争上链.当区块被扩展到了链上,则给该区块签名的所有stakeholder 的行为均被定义为#good; (5)区块产生之后的奖励由第N个stakeholder 收集,并且将之分享给矿工和前N-1 个stakeholder. Fig.1 Proof of trust framework basedon dynamic authorization图1 基于动态授权的信任证明机制 共识生成区块的伪代码算法见算法1. 算法1.Proof of Trust Consensus. Input:Bprevprevious block;Adressminer:The miner’s public address;Height:Height relative to the genesis block;Nonce;CurrentID:The index of the stakeholder;M:User-defined parameters;D:The degree of difficulty that the network needs to satisfy;UTXO_List:The dictionary which is defined with {NodeID:Coin}; Output:A block with transactions. 信任度是节点诚实参与区块生成而获取的奖励,同时也是节点信誉的表现形式.为了保持网络中在线节点的数量,PoT 中引入了信用消耗机制.同时,因为logistic 回归模型的特性,节点的信任度是有信用上限的. (1)信用消耗 信用消耗是为了保证节点的参与度而设置,而不是为了让节点以消耗信用度的方式参与区块的生成.因为当网络中的stakeholder 过少时,网络的安全与稳定就得不到保证.在本机制中,节点的信用度会随着时间的推移而降低.即使节点不是stakeholder,为了保证网络安全,它也要参与区块的验证.只要参与区块的验证,就不会产生信用消耗.节点i的信任度具体消耗算法如公式(7)所示: 其中,ΔB表示区块间隔,即上次参与生成的区块与当前区块之间的间隔(从0 开始),算法如下: 如果刚好两个区块是连续的,则ΔB=0.此时,节点以当前信任度继续参与区块生成,信任消耗函数就不会执行,这就最大程度地保证了网络中节点积极在线参与区块的验证.D值表示当前一段时间内网络的难度值,D的值越大,就表示越需要多次地反复尝试才能找到有效的区块.D的值根据网络中的出块速率进行动态调节,最终将网络的出块速率维持在一个稳定的水平.难度的提升,意味着区块上链需要更多的信任度加权,上链成本就会增加,理性节点可能会选择暂时不参与区块生成,以寻求网络难度更低、机会更大的时候参与区块生成.当节点参与度过低时,恶意节点成功的概率也就越大.因此,在网络难度提高的同时,也增大对于不参与区块生成的节点的信任消耗,将有助于提高节点的参与度,维护区块链网络的运行安全. (2)信用上限 PoT 中的节点可以不通过自身所持资源来确定其拥有的投票权重,并且其所持信任度上限最高为1,一定程度上解决了原始PoS 协议中的币龄累积导致的中心化问题.传统的PoS 机制中,投票权重的增长是线性的,PoT中信任度增长呈非线型的,信任度的提升速率随着时间的推移会下降,最后趋近于0,因此不会造成单一节点信任度过高导致的网络中心化问题. 在PoT 中,原先的基于币龄或者加密货币所有权的权益被修改为基于节点自身的信任度的权益,不再依赖于节点自身所持资源.stakeholder 通过对于区块的签名来赋予区块信任度,信任度越高,则得到哈希结果的速度就越快,计算公式见公式(9). 这里,Bprev是节点投票区块的前置区块;投票节点的地址是A,它的信任度为trust(A);Blockcur是stakeholderN打包后的区块;t是世界标准时间(UTC)的时间戳;M∈[1,D]是一个常数,可以根据网络实时状况动态变化;D值代表难度;δt则是从Bprev创建以后所经过的时间.当一个区块被上传到整个网络之后,最初区块满足公式(9)的可能性是很低的;但是随着时间的推移,成功概率将逐渐增加,首先计算出来的区块才能成为区块链的合法扩展. 对于地址为A的stakeholder 节点,其信任度是被锁定的,即该节点一次只允许投票一次.基于所提供的地址A和上述公式的时间戳t,stakeholder 就能保证其签名的有效性. 传统双花攻击场景如下. (1)攻击者发起一个之后会被他自己撤销的一个交易; (2)在该交易之后,攻击者在该交易所在区块之前的那个区块上开始建立侧链; (3)当新交易进入区块并且获得了足够的确认数目(6 个区块)且攻击者的侧链长度超过主链时,攻击者的侧链就成为了主链,攻击者发起的第1 笔交易被判定为无效,双花攻击成功. 要想成功地进行双花攻击,攻击者必须在整个攻击过程中控制超过50%的网络资源(PoW 算力、PoS 权益).相对于控制51%的算力,控制51%的流通代币是非常困难的[3].但是这并不意味着在权益证明中就无法展开攻击,攻击者可以提供报酬给那些愿意在他指定的区块上铸造新区块的节点.如果攻击失败,参加攻击的用户并不会遭受太多损失.对于攻击者而言,只要贿赂的金额小于商品交易价格,那么总是有利可图的. 在PoT 中,如果要进行贿赂攻击是不可行的,因为每次生成区块的stakeholder 都不相同,并且在区块产生之前stakeholder 是不确定的.一旦被发现参与恶意投票,对于信任度的惩罚是极高的,而且只有第N个stakeholder具有对交易进行打包的权力.除非攻击者提前找到第N个stakeholder,一旦stakeholderN对无效交易进行打包操作,就将受到信任度惩罚.因惩罚系数γ的存在,高昂的信任度惩罚对其来说是不可承受的.证明过程见公式(10)~公式(12). 公式(10)是节点i诚实参与共识所获取的信任度,公式(11)是节点i在诚实投票之后进行恶意投票被系统识别后更新的信任度,公式(12)是节点i诚实投票后进行恶意投票的信任度与之前诚实投票的信任度所占比例. 假设t=2,γ=2,ϑx=τx=α=1 时,.在epoch 的第2 个slot 中,在诚实参与共识一次之后,恶意攻击者进行恶意投票被系统识别后的信任度只有之前的36%.并且这种信任度惩罚会随着轮数以及时间的递增而快速上升,α越大,惩罚越重.这种惩罚力度的存在,对任何理性节点都是难以接受的. 累积攻击最原始的版本是币龄累积攻击,是针对PPCoin 和其他使用币龄作为用户权益的系统而发起的攻击.在后来的PPCoin 版本中,UTXOs 的币龄都以90 天为限制.在Novacoin 和BlackCoin 中,对于币龄同样也有限制.然而,通过限制币龄来大幅降低攻击的可能的同时,也减弱了以币龄作为权益的好处. 在PoT 中,信任度的累积不是线性的,而是基于非线性的logistic 回归模型.在PoT 中,如果想要进行累积攻击,就需要对信任度进行累积.本文提出的修正logistic 算法使得信任度的累积变得十分漫长,并且节点恶意行为一旦被发现,对节点的信任度惩罚力度将是任何理性节点都不可承受的,因此在PoT 中,想要通过积累信任度发起攻击的收益不足以抵消其遭受的信任度惩罚损失.如果攻击者要绕过信任度,仅通过自身所持权益生成区块与其他区块进行上链竞争,其成功的概率也是相当低的. 证明:首先,攻击者想要控制stakeholder 进行2/3 投票.在拥有n个stakeholder 节点的网络中,攻击者必须要控制至少2/3 的stakeholder 节点;同时,攻击者还需要最后一个stakeholder 将自己捏造的虚假交易打包进区块中,即攻击者控制的stakeholder 中必须有一个是交易打包者.因此,攻击者成功的总概率为 p表示成为stakeholder 的概率.假设一个拥有6 个stakeholder 的网络,攻击者持有20%的总权益,那么攻击者绕过信任度,成功上链竞争.那么他成功的概率为 相比其拥有的20%的权益,区区1%的成功率实在是微不足道的. 权益粉碎攻击是针对PoS 特有的攻击方式,其具体场景如下:在运行PoS 协议的网络中,如果某个节点所持权益很低(比如1%),那么它成功生成区块的概率也就是1%.任何一个理性的节点都愿意去尝试分叉,因为在纯PoS 协议中,分叉不需要消耗任何资源,唯一消耗的就是币龄.如果该区块没有被接受,则币龄也不会消耗.尽管这样会造成整个网络的加密货币价值降低,但是因为该节点所占权益很少,所以它们并不在乎. 在PoT 中,只有随机生成的N个stakeholder 有权利扩展区块链,矿工只负责生成区块供stakeholder 进行签名,并没有决定权.在制定决策时就很清楚,不会有二义性,具有很强的治理能力.正常情况下是不会经历任何分叉,因为N个stakeholder 是合作生产区块而不是竞争. 基于提出的PoT 机制,在Docker version 18.03.0-ce,build 0520e24 中实现了原型系统,实验环境为Intel I7-4702MQ CPU 2.20GHz 和16G 内存,操作系统为64 位Win10.通过搭建原型验证模型,验证PoT 协议的共识时延能否随着时间的增长而降低以及对恶意节点的惩罚,并对节点信任度增长与消耗进行实验. 原型系统信任度增长采用改进后的logistic 线性回归模型.网络中一共有10 个矿工节点,其中4 个作为stakeholder.因为stakeholder 节点每次的选取都是随机的,所以在每一个slot 中,参与共识的stakeholder 不尽相同,网络中节点信任度增长过程如图2 所示.投票结果统计公式中常量threshold=0.25,用户自定义常量c值分别为0.1,0.5,0.9. Fig.2 Trust increase in network nodes图2 网络节点信任度增长 图2 表明:不同c值的信任度增长速率是不同的,但是最后都趋近于上限.c值越大,即说明用户给予的最近的信任度偏差的权重比累积信任度偏差要高,从而最近时间片内的信任度增长率在总体信任度增长率中占比升高.经过多轮共识,网络中节点的信任度均会维持在一个恒定的水平,因此不会产生单个节点权益过大而导致的权益中心化问题. 假设原型系统中所有stakeholder 在其信任度到达高峰时保持离线状态,不再参与共识,整个网络将会变得不再安全,其总体信任度下降过程如图3 所示. 可以看出:如果网络中被选出的stakeholder 都不参与区块的生成过程,开始几轮其总体信任度还能保持基本稳定,但从第5 轮开始,信任度明显下降,并呈现非线性的下降过程,在17 轮后逐渐趋于0. Fig.3 Trust consumption in network nodes图3 信任度消耗 原型系统搭建了拥有10 个节点的分布式网络,stakeholder 节点有4 个.投票结果统计公式中常量的取值为:难度D=4,5,M=2,一共进行25 轮共识,并且对最终的时延结果进行了最小二乘曲线拟合,结果如图4 所示. Fig.4 Time delay in consensus图4 共识时延对比图 图4 表示在难度值D分别为4 和5 时,经过25 轮之后,PoT 协议与的PoW 协议的共识时延变化情况.共识时延表示区块链网络中的出块时间,即区块上链所经过的时间,时延单位为秒(s).虚线部分是PoW 的共识时延变化过程,实线是PoT 的共识时延变化过程.在此基础上分别进行了拟合,因为哈希计算的随机性,PoW 时延波动性很大,但是拟合的结果趋于稳定.这说明实验平台的算力是稳定的.相反,PoT 协议的共识时延随着共识轮数的增加而降低,最终会维持在稳定的水平. 图5 表示在D=4 时,网络中stakeholder 节点数量的不同对于共识时延的影响.参与共识的stakeholder 节点数量分别取N=5,N=6,N=8. 由图5 可知:随着网络中stakeholder 节点数量的增加,网络共识时延会有所下降,最终会维持稳定的水平.但是stakeholder 数量的增加不能是无限制的,当网络中stakeholder 节点数量过多时,节点被攻击者贿赂的概率也将上升.同时,如果网络中stakeholder 节点过少,网络共识时延将增大,导致stakeholder 暴露时间过长,增大了stakeholder 节点被攻击者贿赂的概率.图中曲线的波动是因为网络中每次参与共识的stakeholder 的不确定造成了区块信任度的波动,从而最终导致共识时延的波动,但是共识时延都是呈下降趋势. Fig.5 Effect of the number of stakeholder on time delay in consensus图5 stakeholder 数量对时延影响 图6 表示在D=4,stakeholder 数量增长到7 时,网络中节点数量的变化对于共识时延的影响.一共进行了30轮共识,普通节点数量分别为20,50 和100. Fig.6 Effect of the number of nodes on time delay in consensus图6 节点数量对时延影响 由图6 可知:随着网络中节点数量的增加,共识时延并没有发生特别大的改变.这是因为在PoT 中,只有stakeholder 才能决定区块是否上链,区块产生的难易程度与普通节点的数量没有直接关系.这也说明PoT 具有一定的节点可扩展性,出块效率并不因普通节点数量的变化而变化. 惩罚系数测试分别对节点行为所占不同比重以及不同惩罚系数下,节点在经过恶意投票之后信任度的下降比例进行实验验证,结果如图7(a)~图7(d)所示.在一个epoch 中,当节点诚实行为占比较大时,比如图7(a)中诚实行为占70%,恶意行为占30%,惩罚系数对于信任度下降比的影响很大:当惩罚系数较低时,如γ=1,节点仍然可以通过进行诚实投票来努力恢复自己的信任度;但是随着惩罚系数的增大,如γ=3 时,节点越来越难以恢复到作恶前的信任度.并且随着诚实行为所占比越来越少,例如当诚实行为仅占50%时,信任度最高也只能维持在恶意投票之前的50%.随着恶意投票行为占比的扩大,节点信任度下降速度也会随之增大. 由图7(c)和图7(d)可知:当恶意行为所占比重很大时,惩罚系数对于节点信任度的惩罚使得节点信任度下降极快,经过两至三个epoch 信任度就下降为0.因此,无论诚实行为所占比重如何,一旦被检测有恶意行为发生,其信任度的下降速率将是极快的,对于任何理性节点而言这都是难以承受的下降速率. Fig.7 Trust penalty in network nodes图7 信任度惩罚 区块链是近年来研究的热点,许多行业在使用区块链技术进行行业内的技术革新.然而针对不同的应用场景,单一的共识机制是不足以满足所有业务需求的,不同业务场景采用的共识机制也不尽相同.本文针对现有共识机制中存在的问题进行了研究与改进,解决了权益证明机制中存在的易受贿赂攻击、币龄累积攻击以及工作量证明机制中存在的自私挖矿等问题.与PoW 相比,在保证网络安全的前提下,PoT 降低了共识时延.本文提供了一种共识机制的改进思路,并且通过实验对改进的共识机制的可行性和性能进行了分析和验证.结果表明:在共识时延方面,PoT 相比PoW 有较大优势;在预防贿赂攻击、累积攻击以及权益粉碎攻击方面,相较于PoS 也有着显著优势.此外,PoT 还可以实现维护网络拓扑结构、保持在线节点数量以及更高效的资源利用.2.1 节点行为判别策略
2.2 区块生成
2.3 信用消耗
2.4 投票机制
3 攻击成本分析
3.1 贿赂攻击
3.2 累积攻击
3.3 权益粉碎攻击
4 实验分析
4.1 信任度增长
4.2 信任度惩罚
4.3 共识时延
4.4 节点数量对共识时延的影响
4.5 惩罚系数
5 结束语