钟 增 胜
(1.中南大学 计算机学院,长沙 410083; 2.重庆工商大学 招生就业处,重庆 400067)
化名“中本聪”的学者在2008年发表了《比特币:一种点对点的电子现金系统》[1]论文后,在2009年1月开发出比特币系统。比特币系统通过算法实现了价值转移,不需要通过中介机构。2010年5月有人用1万比特币(BTC)购买价值为25美元的商品,确定了比特币最初单价为0.002 5美元[2],在数字货币交易市场上,比特币价格在2017年12月达到2.0万美元,2021年2月达到5.8万美元[3]。
比特币的底层支撑技术是区块链,“中本聪”巧妙地将相关技术结合在一起构成区块链的核心技术,包括了P2P网络技术、哈希运算技术、非对称加密技术和PoW共识算法等,比特币是区块链系统目前最成功的应用,越来越多的商业应用场景引入区块链技术。
共识机制的核心是在共识算法保障下,在一定的时间内,解决分布式系统中状态的一致性问题,使得各节点承认且不可篡改。在区块链系统中,主要解决分布式场景下各节点交易数据和交易状态的一致性问题,实现去中心化的多方互信,共识算法是区块链的核心技术,是实现互联网从信息互联到价值互联的关键技术。
区块链按节点权限可分为公有链和许可链。公有链是指区块链节点没有准入机制,参与节点能随时加入或退出,代表性的共识算法主要有两种:一是工作量证明(Proof of Work,PoW),通过消耗算力去获取记账权的概率,算力越大概率越高,优点是随机性强、公平性好,缺点是耗能、共识效率低。二是权益证明(Proof of Stake,PoS),通过持有资产去获取记账权的概率,资产越多概率越大,优点是节能环保,缺点是权力集中。许可链指参与的节点需要授权,未经授权的节点无法接入区块链,代表性的共识算法有RAFT(Replicated and Fault Tolerant),优点是效率高、容易理解,缺点是不能容纳作恶节点。
文献[4]研究了共识算法的演化历程,分析了PoW的优缺点,比较了不同共识算法的特点,但未提出如何解决性能问题的建议。文献[5]将不同共识协议分步骤进行解耦比较,进行了一定的性能分析,缺乏对PoS深入分析。文献[6]对Raft算法进行了改进,但未研究与PoS融合。已研究的成果对PoS共识算法的安全和性能进行过分析,但改进研究较少。
采用PoS共识算法的区块链生成区块的时间具有随机性,有些情况下区块间隔时间过长,不能满足商业应用场景需要。Silkworm算法能弥补PoS共识算法的性能局限,同时提升区块链的安全性和健壮性。
使用PoW作为共识机制典型的公有链有比特币(Bitcoin)[1]、以太坊(Ethreum)[9]等。
比特币系统中通过不断重试nNonce值,nNonce的范围为0~232,若满足不等式(1),即满足生成区块条件,寻找到nNonce符合条件的该节点可以打包交易记录并组装到区块中,再通过P2P网络将区块发往其他节点验证。
SHA256(SHA256(version+prev_hash+merkle_root+ (1) 其中,SHA256为生成256位消息摘要的哈希算法[10],version为版本号,prev_hash为前一区块哈希值,merkle_root为当前区块交易树根哈希值,ntime为时间戳,nbits为当前难度值,x为区块填充信息,TARGET为目标值。 比特币系统通过前2 016个区块的生成区块时间和单个区块的难度计算新的TARGET,以保证系统生成区块时间动态维持在10 min。 为避免PoW算法造成大量的算力资源浪费,PoS算法以节点持有代币的数量和时间表示权益,权益越大越容易获得生成区块条件。 Hash(nStakeModifier+txPrev.block.nTime+ (2) 其中,Hash为哈希算法,nStakeModifier为权重修正因子,txPrev.block.nTime、txPrev.offset、txPrev.nTime、txPrev.vout.n为未花费的交易支出(Unspent Transaction Outputs,UTXO)属性,nTime为时间戳,bnTarget为目标值,bnCoinDayWeight为币龄。 节点通过不断重试所持有的UTXO,若满足不等式(2),即可以打包交易记录并组装到区块中,再通过P2P网络将区块发往其他节点验证。 Raft共识算法的整体原理框架是一个基于Log复制机制的状态机[6]。所有节点有3种状态:领导者(Leader)、跟随者(Follower)和参与者(Candidate),具体流程如图1所示。 图1 节点状态转换图 (1) 起始状态:节点刚启动时自动进入Follower状态。 (2) 发起选举:选举定时器到期后,节点切换为Candidate状态发起选举。 (3) 新选举:在一次选举超时到来前若还没有Leader,则保持在Candidate状态开始新选举。 (4) 收取选票:收到超过半数节点选票,切换状态为新的Leader。 (5) 发现领导者:若收到Leader或更高任期消息,切换回Follower状态。 (6) 发现更高任期领导者:若收到更高任期消息,切换回Follower状态。 每一个节点状态中都保存当前任期号(Current Term),节点在进行通信时都会带上本节点的当前任期号。如果一个Candidate或者Leader状态的节点发现自己的当前任期号已经小于其他节点了,那么将切换到Follower状态。 衡量区块链性能的指标一般有平均每秒处理的交易数(Transaction Per Second,TPS)、平均生成区块时间等,采用PoS共识算法的数字货币,最早有点点币(Peercoin)[7],TPS为7左右,平均生成区块时间为600 s,量子链(QTUM)[8,11],TPS为70左右,平均生成区块时间为128 s。 以量子链为例,它结合了比特币和以太坊的优势,打通了比特币的UTXO模型和以太坊的智能合约生态,在5 000个区块前使用PoW算法,其后一直使用PoS算法。 根据量子链官方微信公众号发布的数据[8],2019年9月1日—10月15日区块438 439~465 623时间间距分布如图2所示。 图2 量子链438 439~465 623区块间隔时间图 通过量子链官方浏览器[12]拉取了2020年12月1日区块743 647~743 683实时数据,如图3所示。 图3 量子链743 582~744 257区块间隔时间图 从图2和图3可以看出:量子链的最快生成区块时间16 s,最慢生成区块时间752 s,平均生成区块时间为128 s,16 s内生成的区块数量占比9%,128 s内生成的区块数量占比58%。 PoS共识算法生成区块时间间隔有较大幅度的变动,而商业应用场景与区块链结合,对单笔交易而言,往往要求生成区块时间间隔小且稳定。因此,改进PoS共识算法的目标是减小区块间隔,更快速地确认链上交易和实现价值转移。 利用智能合约定义参数,通过投票选举出主节点(Leader),主节点判断PoS是否在约定时间范围内生效,若生效则会清空内存交易池由PoS节点打包生成区块,若未生效则主节点进行打包生成区块。改进后的算法定义为Silkworm共识算法。 定义区块产生的最小间隔时间SwMinInterval,默认为12 s,定义区块产生的最大间隔时间SwMaxInterval,默认为360 s。将智能合约部署到区块链生效后得到参数合约ID。 若要改变最小或最大间隔时间,重新部署智能合约可得到新的参数合约ID。 定义选举任期间隔时间SwElectionInterval,如24 h。 定义节点参与条件,如持有代币达到5万或线下评审(考虑节点综合实力等),将合约部署到区块链生效后得到选举合约ID。 符合条件的节点调用智能合约进入Follower列表。Follower节点定时调用智能合约竞选Leader。 定义是否启用Silkworm算法标志SwEnabled,默认为True。定义选举合约ID。定义区块高度SwHeight 1,参数合约ID 1,区块高度SwHeight 2,参数合约ID 2。 区块高度SwHeight 1和SwHeight 2用于切换新老参数合约,以便实现平稳过渡。 Silkworm共识算法流程如图4所示: 图4 Silkworm共识算法流程图 步骤1 任意节点均有单独的进程执行共识算法进行区块打包循环,首先查找主控智能合约,判断启用标志SwEnabled是否为True,查找主节点选举智能合约,判断本节点是否Leader状态。 步骤2 若步骤1不符合,则按PoS共识算法规则,满足条件就由PoS节点生成区块,组装交易出块并清空区块链节点的内存交易池。 步骤3 若步骤1符合,则取智能合约参数,判断当前时间戳与前一区块的时间差,是否大于等于最小间隔时间SwMinInterval。 步骤4 若步骤3不符合,则忽略,若步骤3符合,判断当前内存交易池是否存在交易,若存在交易,主节点直接生成区块,组装交易出块并清空区块链节点的内存交易池。 步骤5 若步骤4中没有交易,而当前时间戳与前一区块的时间差,大于等于最大间隔时间SwMaxInterval,主节点也直接生成区块,保证区块的后续确认不受影响。 4.1.1 源代码改造 从https://github.com/qtumproject/qtum下载量子链源码,开发环境采用vmware+utuntu18.04+Qt5.12.3,按下列步骤改造为一条新的区块链。 步骤1 修改src/chainparams.cpp中的Create GenesisBlock函数,计算出的创世纪块符合预设值。 步骤2 修改src/chainparams.cpp中pchMessage Start网络字节值和src/chainparamsbase.cpp中rpc端口,使其不用于QTUM链。 步骤3 适当修改其他配置文件,将源码编译通过,生成Linux版本的客户端。 4.1.2 服务器 在阿里云开通10台2vCPU8GB内存的服务器,操作系统为Ubuntu18.04 64位,网络互通。所有服务器部署改造后的新区块链客户端并启动成功。 4.1.3 初始化区块 使用rpc命令generate初始化5 000个区块,这些区块是通过PoW共识算法生成的,检查10个服务器的区块是否同步正常。再等待24 h,新区块链自动使用PoS共识算法生成675个区块。 4.1.4 部署智能合约 (1) 根据第3.1节、第3.2节、第3.3节部署相关智能合约。 (2) 根据第3.4节修改src/miner.cpp源码,重新编译发布。 为方便观察实验结果,人工指定Leader节点。 在不启用主节点的情况下,2 h内随机发送交易,观察产生区块结果,共进行3组。 在启用主节点情况下,2 h内随机发送交易,观察产生区块结果,共进行3组。 实验数据对比情况如表1所示。在不启用主节点的情况下,PoS共识算法生效,区块产生的间隔时间最大、最小和平均与QTUM相近,说明新区块链工作状态正常,交易越频繁,对生成区块间隔平均时间略增。 表1 在不同条件下发送交易的比对情况Table 1 Comparison of transactions sent under different conditions 在启用主节点的情况下,Silkworm共识算法生效,因为时间参数智能合约中规定了区块间隔时间的最大值为360 s,最小值为12 s,在有交易时,区块生成区块间隔时间恒定在12 s,在没有交易时,生成区块间隔时间有变化,最大不会超过360 s,平均时间在128 s左右。 从实验结果可以看出:Silkworm共识算法使区块链的性能达到了预期的目标,也能够满足商业应用场景的使用。若有必要,也可以通过智能合约调小生成区块间隔时间,但不能低于4 s。 在区块链没有交易的情况下,为避免更快生成更多的空块,节约存储资源,Silkworm共识算法自动不生效,由PoS节点起主导作用。在主节点因网络等原因失效的情况下,PoS节点仍然发挥作用,保障了区块链的稳定性和安全性。 给出了一个PoS共识算法的改进方法,该方法通过智能合约治理区块链的网络参数,对最快生成区块时间和最慢生成区块时间进行定义,结合Raft算法选举主节点,实现了在有交易的情况下,当PoS共识算法未在定义的最快时间内生成区块时,Silkworm算法确保由主节点自动快速生成区块;在无交易情况下,当PoS共识算法未在定义的最慢时间内生成区块时,Silkworm算法也由主节点生成区块。而当主节点关闭或出故障时,PoS共识算法仍然正常生成区块。 通过实验验证,启用主节点使用Silkworm共识算法,能保证交易在规定的最快时间内生成区块,没有交易时自动降低区块生成速度,节约存储资源,这种区块链更能满足商业应用场景的要求。 Silkworm共识算法还存在一些不足,当主节点频繁生效时,PoS节点生成区块的概率有可能会降低,效率上比纯许可链更低。 区块链共识算法还在不断发展中,Silkworm共识算法在基于公有链PoS共识算法上进行改进,还需要在安全性、孤立块和分叉方面进行更深入的验证。
ntime+nbits+nNonce+x))1.2 PoS算法原理
txPrev.offset+txPrev.nTime+txPrev.vout.n+nTime)<
bnTarget*bnCoinDayWeight1.3 Raft算法原理
2 PoS算法区块链性能问题
3 PoS共识算法的改进
3.1 部署时间参数智能合约
3.2 部署主节点选举智能合约
3.3 部署主控智能合约
3.4 Silkworm运行流程
4 实验验证
4.1 实验准备
4.2 实验步骤
4.3 实验结果分析
5 结束语