基于节点分组的权益证明共识机制
2022-07-07葛云生
张 旺 葛云生
(桂林理工大学信息科学与工程学院 广西 桂林 541006)
0 引 言
区块链技术是2008年由中本聪在白皮书《比特币:一种点对点的电子现金系统》[1]中提出的。区块链系统中由于其特殊的链式结构以及所有节点共同记账的特性,使得区块链拥有数据一旦上链则难以更改、数据透明可追溯等特点。在区块链2.0版本中引入的智能合约,将文本合约转换为代码程序,让区块链不仅仅局限于数字货币的交易。区块链系统是由多种算法和技术组合而成,包括共识机制、哈希算法、智能合约等。其中共识机制在区块链系统中起到了关键性作用,让所有节点能够拥有且共同维护同一账本。当前使用较多的共识机制有工作量证明(PoW)、权益证明(PoS)、股权证明(Delegated Proof of Stake,DPoS)等[2]。当前比特币系统使用的共识机制是PoW,即所有矿工同时求解一个数学难题,当某个矿工节点率先正确解决问题并广播给其他节点且验证无误后,该矿工节点挖矿成功并获得相应奖励。由于PoW的工作机制需要所有节点挖矿而只有一个节点能够获取报酬,同时数学难题的难度较大且只能通过蛮力[3],需要耗费大量的算力而导致资源浪费。基于PoW的问题,在2012年Sunny等[4]提出了PoS,引入了币龄的概念,减少了算力的浪费,但是同时也带来了新的问题。由于币龄越大越容易挖矿成功,节点富愈富而导致权益中心化,以及虽然引入了币龄但是实质上还是需要全体挖矿导致算力浪费等问题。PoS算法改进可以由两个方向进行,一个是与PoW类似引入币龄调整节点挖矿难度[5],仍然需要进行挖矿;另一个则是根据各节点自身权益对出块节点进行投票[6]。
本文针对PoS共识机制存在的问题,从第一个方向进行改进,提出节点分组权益共识(Node grouping PoS,Ng-PoS)。引入虚拟币龄解决在区块链系统运行初期,节点无币无法累积币龄而不能参与竞争的情况。提出节点分组使节点竞争过程更加公平,改善目前节点富愈富的现象。大幅减少算力浪费,提高低币龄节点挖矿成功概率。
1 相关工作
1.1 区块链技术
区块链技术包含多个技术相互配合而成,主要包括共识算法、数字签名、非对称加密、哈希算法等。区块链是由区块为基础且由哈希值为指针连接而成。区块分为区块头和区块体两部分,区块头中有版本号、前区块哈希、时间戳、梅克尔树根、难度值、随机数等[7],而区块体中包含了由矿工从交易池中打包的多笔交易,详细区块链结构如图1所示。
图1 区块链结构
1.2 PoS共识机制
区块链系统中共识机制有着重要的作用,决定节点间数据如何达成一致。比特币系统中使用PoW来进行共识,每一轮的共识都需要解决一个数学难题来竞争记账权,节点对区块进行哈希运算需要满足的条件可用式(1)表示。
Hash(Block) (1) 式中:Target为区块链系统全网节点哈希运算的目标值。只有最快正确解出难题的节点能够获得记账权以及相应的报酬。PoW机制下所有节点都需要挖矿,而只有一个节点能够获胜,导致大量的算力以及电力资源的浪费[8]。PoW节点共识过程如图2所示。 图2 PoW节点工作流程 基于PoW资源浪费以及高能耗[9]的问题提出了PoS。在PoW的基础上引入币龄的概念如式(2)所示。 Hash(Block) (2) 式中:coinage为代币币龄,币龄是节点账户中代币乘以代币保留时间,每一个代币每天就积累一币龄且币龄越高对应挖矿难度越小,出块的概率也就越高[10]。节点在成功出块后,币龄将清零重新开始累积币龄。由于币龄的引入代替了PoW中需要的大量矿机,减少了资源的浪费。但是同时也带来了一些新的问题,由于PoS的运行需要币龄的支持,然而在运行初期只有创世区块中拥有代币,其他节点中没有,也就无法参与竞争。其次PoS虽然引入了币龄但是其实质还是需要挖矿,依旧有PoW遗留的问题。同时由于币龄影响挖矿的难度,高币龄节点会不断获得更多收益,就会出现节点富愈富的局面导致代币的流动性降低,甚至导致权益中心化从而控制系统[11]。PoS节点共识过程如图3所示。 图3 PoS节点工作流程 采用PoS共识机制的区块链系统,需要币龄的积累,在系统启动初期只有创世区块中有代币,其他节点无法进行币龄累积。peerCoin的设计思想是在前期依旧使用PoW,节点通过挖矿获取代币,后期再替换为PoS。虽然可以解决在前期节点无币的问题但是采用PoW就会造成大量资源浪费。此处引入虚拟币龄(Virtual_coinage),在没有真实代币的情况下各节点可以通过累积币龄后参与竞争从而获得代币,如式(3)所示。 Hash(Block) (3) 此时虚拟币龄并没有真实代币而是默认为1的虚拟代币与时间的乘积。由于PoS共识时间较短且为了能够更快地获取真实代币进行正式的共识,虚拟币龄设定每10分钟累积一次币龄代替PoS的一天一次的方式。为了产生虚拟币龄上的差距,只有在线的节点才能累积币龄。在虚拟币龄出块期间获得的真实代币以及一天为一个周期所累积的真实币龄不计入虚拟代币中,以保证所有节点在前期都有机会成功出块并获得奖励。当虚拟币龄使用至少一天即产生的真实代币拥有币龄时以及至少51%的节点拥有代币时就停止使用虚拟代币,而恢复使用PoS共识机制,重新按照获得的真实代币进行币龄的累积,币龄累积过程如图4所示。 图4 币龄累积过程 该区块链网络运行前期,利用虚拟代币赚取真实代币,而真实代币不计入虚拟代币中,用以保证前期所有节点的虚拟代币不变而不影响币龄的累积,使所有节点都有相同的币龄累积速度,保证前期竞争的公平性。同时由于默认的虚拟代币不变,也就不存在51%攻击的可能,进一步保证了虚拟币龄运行期间的安全性。各节点的币龄相近则该阶段无须分组,减少分组时的时间消耗,提高运行效率。 使用虚拟代币同时产生的真实代币也在按天累积币龄,节点在进入正式PoS共识阶段时可以立刻使用真实币龄加入竞争而不必等到正式阶段才开始累积,系统从虚拟币龄向真实币龄能够流畅且稳定转换。为了防止节点在正式进入PoS共识后作恶而必须保证至少51%的节点在前期拥有代币,以避免作恶节点掌握较多代币使区块链遭受51%攻击。 节点分组是为了让所有节点更加公平地参与竞争且在PoS的基础上进一步节省资源而设计的分组共识方案。 使用PoS机制的区块链网络中各个节点的持币量不同,币龄也相差较大。各节点能出块的难度也随着币龄大小变化,当全网所有节点都处在同一网络却在不同难度下进行出块竞争,这对于币龄较小的节点来说是极不公平的,这类节点也很难获得出块的权力以获取收益。通过对节点按币龄排序后分组,无论是高币龄节点还是低币龄节点都只需要与各所属小组内币龄相差较小节点竞争出块。对于组内,相对于全网同时在相差较大的难度下共同竞争,组内节点出块难度相差更小甚至都将处于同一难度下,对于低币龄节点来说大大提升了在分组前出块的概率。 通过对节点进行均等的分组,分组的数量是Ng-PoS共识的关键,分组数量过少则分组效果不明显,同样出现PoS中的问题。分组数量过多则组内节点数量过少,具有节点中心化的风险。 Ng-PoS共识,将节点按币龄大小进行排序分组,节点按分组分别在组内进行竞争。逐组竞争,所有小组都至少参与一次称为一整轮共识。其余小组只需验证结果而无须参与竞争,Ng-PoS分组及共识过程如图5所示。 图5 Ng-PoS共识过程 首先对参数定义:l为共识轮次,tl为当前轮次竞争节点最短耗时,G为全网节点数,n为分组数,gn为当前分组节点数。为了与PoS做对比,则需要Ng-PoS所有小组都至少参与一次共识则共识次数要大于或等于分组数。Ng-PoS的全网节点总耗时如式(4)所示。 (4) PoS每次共识需要所有节点参与竞争则PoS的耗时如式(5)所示。 (5) 以共识过程中单次共识全网节点总消耗作为评价指标,在总节点数量一致的情况下,以1 000节点为例,改变分组数。根据Ng-PoS各小组节点币龄对应难度所需耗时与PoS的耗时对比如图6所示。可以看出Ng-PoS在分为9组时的耗时开始小于PoS,差距不断增加且组内节点数量较多而不会中心化。 图6 Ng-PoS、PoS共识全网耗时比较 Ng-PoS记账权的竞争不再是全体节点共同参与而是按照小组顺序依次进行,结构如图7所示。小组内部币龄接近的节点间进行竞争,分组后竞争及共识过程如下: (1) 第一小组组内使用Ng-PoS进行记账权的竞争。 (2) 获胜者将区块广播全网。 (3) 其余节点验证区块,验证成功后写入账本。 (4) 获胜者获得收益并清空币龄。 (5) 所有小组依次重复以上步骤,直到所有分组都有一个节点成功打包区块。 (6) 暂停共识,重新分组。 图7 节点分组的Ng-PoS结构 由于是按照币龄大小顺序排序,每个小组中节点的币龄相差不大,通过分组有效提升低币龄出块而降低高币龄节点出块概率。由于有分组轮流竞争机制的控制,不会出现低币龄节点出块概率异常提升甚至超过其他节点的情况。对于各小组,轮流竞争使小组参与机会均等,保证了小组间的公平性。所有节点的出块概率只会因为分组而将趋于稳定与均衡,使得区块链网络中的每一个节点都会有相近的出块机会。 每次共识各分组内都会有一个节点的币龄被清除,它可能权益较高以至于成功概率较高,经过币龄清零,重排序分组后补位的节点与该组其余节点币龄相近,对小组内其余节点的影响较小,保持了重分组前后的竞争公平性。 一整轮共识结束后,每个小组产生一个零币龄节点,总共产生n个零币龄节点,在重排序分组时这些节点并不会参与而是被放置进一个无币龄分组。如果无币龄节点参与排序分组,则在最后一组中将会有大量无币龄节点,这样就大大增加了该分组中其余有币龄节点的成块概率,对于其他分组来说不公平。 每共识一整轮就将产生一个无币龄分组,分组顺序进入队列,同时由于队列先进先出的性质,这些分组中的节点需要等到产生币龄并在重排序分组间隙再按照顺序依次加入,无币龄队列如图8所示。 图8 无币龄队列 由于被清空币龄的节点可能有较多的代币,其累积币龄的速度也较其余节点快,引入队列主要作用是在节点进入无币龄分组后,就算代币较多也需要等到队列靠前的节点全部加入后再加入。有效控制高代币节点的竞争以及出块频率,给小代币节点更多的机会以及更加公平的竞争环境,无币龄队列工作流程如图9所示。 图9 无币龄队列工作流程 在区块链系统运行过程中不断会有节点的退出和加入,所有节点都需要通过币龄排序分组。新节点不能一加入系统就立即开始参与共识,而需要等待一整轮共识结束后与当前无币龄小组一同加入。 通过出块而被清除币龄的节点进入无币龄队列后,若无节点重新加入共识,能参与共识的节点数量虽然会减少,由于是分组共识则币龄的清除也是分组的,其节点的分布是均匀的,不会影响小组节点的正常出块概率。每一个币龄累积周期都会有大量节点进入队列中等待币龄累积,同时也有大量已经累积有币龄的节点退出队列以及新加入网络的节点参与共识,所以退出与加入队列的节点数量是能够互补的,参与区块链共识的节点数量是稳定的,不会因为队列的存在而使参与共识的节点不断减少甚至导致节点中心化。 本文分别通过不同币龄段节点出块概率、20次共识耗时、共识全网节点耗时对改进后的Ng-PoS算法与传统PoS算法进行对比实验。根据上文对分组数量的研究,此次实验将节点分为10组。币龄段不同挖矿时间也不同,则需要所有节点都参与进来以后进行对比。所有节点都依次参与竞争则需要10轮共识,实验设置20次共识实验,Ng-PoS共识所有小组及节点都会参与2次。 由于币龄不同所对应的难度也不同,也就是通过哈希运算后哈希值前面0的个数不同,难度越大需要计算0的个数则越多。设定当前全网目标值为3 000,模拟生成50 000个节点且币龄依次0到1 000,完整哈希值为8位的情况下,根据式(2)不同币龄对应目标值以及难度如表1所示。 表1 币龄对应目标及挖矿难度 由表1得到所有节点中不同币龄节点挖矿难度,也代表了能成功出块的概率,根据节点币龄范围对应难度得到图10。而Ng-PoS共识先按币龄分组再在组内通过币龄控制组内难度,由于每组每整轮都会有一个节点出块即可得到图11。通过图10可以看出只有币龄较大的节点有更多机会出块而获得收益,而图11中通过对节点分组,虽然分组间币龄相差较大但组内节点只须与小组其余币龄相近节点竞争,且各分组在整轮共识中都会有一个节点成功出块,分组竞争的方式使得小币龄节点出块概率大幅提升。 图10 原PoS出块概率 图11 Ng-PoS出块概率 实验不考虑节点间延迟以及各节点处理速度等因素,哈希计算的内容也是相同,只需调整随机数的情况下,Ng-PoS与PoS分别进行20次共识,记录两种共识算法每次共识消耗的时间。实验将预设好的需要哈希的值与随机数连接,采用SHA-256算法对其进行计算,依次递增随机数值,通过设定哈希值前0的个数计算所需花费时间,哈希计算如式(6)所示。 T=strcmp(hash(1:z),′N′) (6) 式中:strcmp为比较函数;N表示z个0。将哈希值前0的个数z与N比较,直到满足条件,对比结果如图12所示。 图12 共识耗时对比 通过20次重复实验,Ng-PoS在20轮次共识中一共耗时17.661 4 s,PoS共耗时2.013 3 s。由于Ng-PoS中存在低币龄分组,这类小组节点面临的运算难度较大,在出块上则需要花费更多的时间,其余小组时间花费则与原PoS接近。 不断运行就会有电力资源的消耗,在设定各节点平均每小时资源消耗相同的情况下,运行时间越长则所需的资源消耗越多。Ng-PoS每轮共识单个小组进行竞争,其余节点只须等待验证,时间消耗如式(7)所示。 (7) 而PoS每一轮共识都需要全网节点参与竞争,无论是否有机会成功出块,时间消耗如式(8)所示。 (8) 在有50 000节点参与的情况下,分别采用Ng-PoS以及PoS进行20轮共识记录每轮共识全网节点时间消耗对比如图13所示。 图13 每轮全网节点总消耗时间对比 经计算Ng-PoS与PoS在20次共识实验中共识总时间以及全网节点花费总时间对比如表2所示,实验结果表明,Ng-PoS虽然较PoS在整轮共识中节点耗时更多但是全网节点在共识中相较于PoS花费更少的时间,因为原PoS需要全网所有节点参与出块竞争,每一轮共识节点都需要花费大量时间及资源。Ng-PoS通过分组,每一轮竞争无须全网节点参与而只需要在当前轮次的单个小组内节点间进行,其余小组只需要等待验证并共识区块。由于单次共识全网同时参与竞争节点的减少,花费的总时间越少,消耗的资源也就越少。 表2 Ng-PoS、PoS时间消耗对比 单位:s 本文提出基于节点分组的Ng-PoS共识机制,通过 节点拥有币龄对节点进行排序并分组。同时提出虚拟币龄以及无币龄队列,旨在解决PoS运行初期节点无币、改善原PoS中大权益节点频繁出块而小权益节点出块几率低以及资源高消耗的问题。根据各币龄范围出块概率以及节点共识总时间对比实验结果,Ng-PoS相较于原PoS有效提升了低币龄节点出块概率,虽然每整轮节点共识时间较长但是全网耗时更短,显著节省了节点能源消耗,对低币龄节点更加友好。目前仍然还有需要改进和提升的地方,在不影响效率以及不损失去中心化情况下,如何对节点更加合理地分组以及虚拟币龄的累积周期的设置在将来需要继续研究和优化。2 PoS的改进
2.1 虚拟币龄
2.2 节点分组
2.3 无币龄队列
3 与原PoS对比
3.1 各节点出块概率
3.2 共识时间
4 结 语