[0001]
本发明属于区块链网络技术领域,具体涉及一种基于分片技术提升区块链吞吐量的方法。
背景技术:[0002]
区块链是一个信息技术领域的术语,从本质上讲,它是一个共享数据库,存储于其中的数据或信息,具有“不可伪造”、“全程留痕”、“可以追溯”、“公开透明”、“集体维护”等特征,基于这些特征,区块链技术奠定了坚实的“信任”基础,创造了可靠的“合作”机制,具有广阔的运用前景。
[0003]
区块链技术在近些年有着突飞猛进的发展,但是也有着许许多多的局限性。区块链技术的主要特点有去中心化、防篡改、交易公开透明化以及可追溯等,基于这些特点,区块链正在被越来越多的用户所关注,但区块链技术也是存在问题的,其中最受到关注的有两个方面:存储容量问题、交易吞吐量问题。
[0004]
吞吐量是指对网络、设备、端口、虚电路或其他设施,单位时间内成功地传送数据的数量,在虚拟货币中即每秒交易的处理量(tps,transaction per second),对于最开始的比特币来说,它的交易吞吐量为每秒7笔交易(tps),而以太坊为每秒15笔交易(tps),而和现有的付款系统相比,如国际贸易支付工具paypal,它们的平均吞吐量都为115笔交易每秒,即,现有常规的区块链吞吐量已经不足以满足贸易支付结算时所需要的吞吐量要求了,所以如何提升区块链的吞吐量是一个急需要解决的问题。
技术实现要素:[0005]
本发明针对上述时间同步需求,提供了一种将分片技术应用到区块链中、将区块链网络分为多个子网络,每个子网络代表一个片,根据片的不同分别处理交易从而提高交易吞吐量的方法。
[0006]
本发明所公开的一种基于分片技术提升区块链吞吐量的方法,其特征在于,包括以下步骤:步骤1,区块链中每个节点在加入区块链时,均在区块链创建新节点源码中加入非对称加密算法,从而在本地生成一对非对称密钥,分别为公钥pk和私钥sk;步骤2,将步骤1中每个节点生成的公钥pk和私钥sk,汇合节点在区块链中可验证的参数信息输入到vrf_pos算法中,vrf_pos算法中的vrf算法随机函数按照设定的随机数值范围,为每个节点生成一个中间结果proof和一个随机数res,然后通过vrf_pos算法中的pos权益证明算法的来证明每一个节点的随机数res是正确的,以达成加入区块链的所有节点对其他节点的随机数res形成共识;步骤3,整个区块链中只允许有一个领导节点,一级节点和二级节点都有多个,通过步骤2中得到的每个节点的随机数res,结合对整个区块链网络的分片数,对应判断每个节点属于哪个分片以及是二级节点还是一级节点还是领导节点,完成子网络分片;
步骤4,完成子网络分片后,每个二级节点负责打包交易生成merkle子树,并将merkle子树的根提交给一级节点;一级节点继续打包merkle子树根,并生成各自分片的merkle根,并提交给领导节点;领导节点则负责整合每个分片所提交的merkle根并打包生成完整的merkle根并写入新区块。merkle树和merkle根都是原区块链中的数据结构,所以打包和生成方式根据原区块链中的方法即可,唯一不同的就是原区块链全节点都只构建一棵merkle树,而经过分片后,每个分片中都会生成merkle树,最终每个分片的merkle根提交给领导节点进行汇总。
[0007]
因为本发明是需要对区块链中的n个节点进行网络分片,所以需要一个定义一个能容下所有节点的范围[0,n),而每个节点都需要被映射进这个范围,且每个节点所映射到范围中的数是各不相同的,这就需要一个随机算法来将每个节点最终映射到这个范围中,且每个节点映射的随机数都不相同,这里可以使用传统vrf算法中的随机函数来完成。而当每个节点都获取到各自的随机数过后,只有自己知道各自的数,别人都不知道。为了让所有节点都知道每个节点是什么随机数,这里使用传统pos权益证明算法的来证明该节点的随机数是正确的,以达成所有节点的共识。vrf_pos算法就是将上面两个算法中的随机数算法、范围映射和共识证明结合起来的算法。通过vrf_pos算法最终返回的是res,es是通过vrf_pos算法产生的一个随机数,proof相当于一个中间结果,这是其他节点需要验证随机数是否属于该节点的一个值,通过proof和该节点的公钥就可以完成验证。
[0008]
所述步骤2中,节点在区块链中可验证的参数信息,是指在区块链中,为其他所有节点都知道的参数信息,优选地的,如当前区块高度。
[0009]
所述步骤2中,设定的随机数值范围是根据加入区块链的节点个数n确定的,即随机数值范围为[0,n),则每个节点生成随机数res都映射在设定的随机数值范围[0,n)内。这个范围最大值为当前参与分片节点的个数,当每个节点将各自的私钥以及所有节点都知道的信息(比如当前区块高度)输入vrf_pos算法,最终会返回一个随机数res,这个随机数就一定会是最开始设置[0,n]里面的值。
[0010]
所述步骤2中,设定的随机数值范围是根据区块链中每个节点用户的token确定映射随机数的范围,只将token>0的节点的可验证的参数信息输入到vrf_pos算法,得到每个节点的随机数res。
[0011]
所述步骤3中,判断每个节点属于哪个分片,具体的,整个区块链网络的分片数为n,则除领导节点之外,其他节点通过随机数res%4取余的方式来划分每个节点所属的分片数。
[0012]
所述步骤3中,判断每个节点是二级节点还是一级节点还是领导节点,具体的,设定领导节点的res值,将随机数res对应该res值的节点判定为领导节点,将剩下的节点,根据每个节点的随机数res与该节点自身的资产w做除法,如果值小于1则为一级节点,剩下的作为二级节点。
[0013]
与现有技术相比,本发明的技术方案根据vrf_pos算法得出属于每个节点的随机数,并根据该随机数确定该节点的职位(即领导节点、一级节点、二级节点);并根据交易发起节点的账户地址来确定该交易属于哪个网络分片,这样能使同账户发起的交易能整合在一个网络分片中,也可以有效的检测双花交易而不需要复杂的跨分片的通信。对不同网络分片中的节点并行处理不同交易,提升区块链的交易吞吐量。理论上分片越多,吞吐量提升
越大。
[0014]
并且通过vrf_pos算法还能抵御女巫攻击,vrf_pos算法是通过各自节点的私钥来生成的随机数,因此一个节点无法产生多个私钥,而女巫攻击是一个节点通过伪装成多个身份而让其他节点认为这些伪装节点都是不同节点的攻击,因此抵御女巫攻击的方案就是节点证明,只要能证明这些伪装节点都是同一节点即可破解女巫攻击,所以该算法能够抵御女巫攻击。
[0015]
分片技术最早是在数据库中出现的,它的原理是将数据库分成一个个可处理的部分,从而让不同的部分做不同的事情,这样能大大提升效率,响应时间也能极大缩短。分片(sharding)是数据库分区的一种,它将大型数据库分成更小、更快、更容易管理的部分,这些部分叫做数据碎片,互联网协议允许ip分片,这样的话,当数据包比链路最大传输单元大时,就可以被分解为很多的足够小片段,以便能够在其上进行传输,链路层具有最大传输单元mtu这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值,以太网的mtu是150,如果ip层有数据包要传,而且数据包的长度超过了mtu,那么ip层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于mtu。例如我们假设要传输一个udp数据包,以太网的mtu为1500字节,一般ip首部为20字节,udp首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。分片技术最早是在数据库中出现的。它的原理是将数据库分成一个个可处理的部分,从而让不同的部分做不同的事情,这样能大大提升效率,响应时间也能极大缩短。
[0016]
将分片技术应用到区块链中,即将区块链网络分为多个子网络,每个子网络就代表所分的一片。虽然不同的片中都在处理交易,但是现在它们所处理的交易会根据片的不同而有所划分。通俗地讲引入分片技术之前是单核处理交易,而现在是双核甚至多核并行处理交易,因此交易吞吐量会大大提升。理论上来说分的片越多那么交易吞吐量就会越大。
附图说明
[0017]
本发明的前述和下文具体描述在结合以下附图阅读时变得更清楚,附图中:图1是本发明vrf_pos算法流程图;图2是本发明网络分片中节点身份认定及功能流程图;图3是本发明网络分片判定分片结果流程图;图4是本发明包含4个分片的交易分片场景示意图;图5是本发明交易分片流程图。
具体实施方式
[0018]
下面通过具体的实施例来进一步说明实现本发明目的技术方案,需要说明的是,本发明要求保护的技术方案包括但不限于以下实施例。
[0019]
实施例1本实施例公开了一种基于分片技术提升区块链吞吐量的方法,如图3,包括以下步骤:步骤1,区块链中每个节点在加入区块链时,均在区块链创建新节点源码中加入非对称加密算法,从而在本地生成一对非对称密钥,分别为公钥pk和私钥sk。
[0020]
步骤2,将步骤1中每个节点生成的公钥pk和私钥sk,汇合节点在区块链中可验证
的参数信息输入到vrf_pos算法中,vrf_pos算法中的vrf算法随机函数按照设定的随机数值范围,为每个节点生成一个中间结果proof和一个随机数res,然后通过vrf_pos算法中的pos权益证明算法的来证明每一个节点的随机数res是正确的,以达成加入区块链的所有节点对其他节点的随机数res形成共识。
[0021]
其中,节点在区块链中可验证的参数信息,是指在区块链中,为其他所有节点都知道的参数信息,优选地的,如当前区块高度。
[0022]
具体的,设定的随机数值范围是根据加入区块链的节点个数n确定的,即随机数值范围为[0,n),则每个节点生成随机数res都映射在设定的随机数值范围[0,n)内。这个范围最大值为当前参与分片节点的个数,当每个节点将各自的私钥以及所有节点都知道的信息(比如当前区块高度)输入vrf_pos算法,最终会返回一个随机数res,这个随机数就一定会是最开始设置[0,n]里面的值。
[0023]
或者,设定的随机数值范围是根据区块链中每个节点用户的token确定映射随机数的范围,只将token>0的节点的可验证的参数信息输入到vrf_pos算法,得到每个节点的随机数res。
[0024]
步骤3,整个区块链中只允许有一个领导节点,一级节点和二级节点都有多个,通过步骤2中得到的每个节点的随机数res,结合对整个区块链网络的分片数,对应判断每个节点属于哪个分片以及是二级节点还是一级节点还是领导节点,完成子网络分片。
[0025]
具体的,判断每个节点属于哪个分片,整个区块链网络的分片数为n,则除领导节点之外,其他节点通过随机数res%4取余的方式来划分每个节点所属的分片数。
[0026]
而判断每个节点是二级节点还是一级节点还是领导节点,具体的,设定领导节点的res值,将随机数res对应该res值的节点判定为领导节点,将剩下的节点,根据每个节点的随机数res与该节点自身的资产w做除法,如果值小于1则为一级节点,剩下的作为二级节点。
[0027]
步骤4,完成子网络分片后,每个二级节点负责打包交易生成merkle子树,并将merkle子树的根提交给一级节点;一级节点继续打包merkle子树根,并生成各自分片的merkle根,并提交给领导节点;领导节点则负责整合每个分片所提交的merkle根并打包生成完整的merkle根并写入新区块。merkle树和merkle根都是原区块链中的数据结构,所以打包和生成方式根据原区块链中的方法即可,唯一不同的就是原区块链全节点都只构建一棵merkle树,而经过分片后,每个分片中都会生成merkle树,最终每个分片的merkle根提交给领导节点进行汇总。
[0028]
因为本发明是需要对区块链中的n个节点进行网络分片,所以需要一个定义一个能容下所有节点的范围[0,n),而每个节点都需要被映射进这个范围,且每个节点所映射到范围中的数是各不相同的,这就需要一个随机算法来将每个节点最终映射到这个范围中,且每个节点映射的随机数都不相同,这里可以使用传统vrf算法中的随机函数来完成。而当每个节点都获取到各自的随机数过后,只有自己知道各自的数,别人都不知道。为了让所有节点都知道每个节点是什么随机数,这里使用传统pos权益证明算法的来证明该节点的随机数是正确的,以达成所有节点的共识。vrf_pos算法就是将上面两个算法中的随机数算法、范围映射和共识证明结合起来的算法。通过vrf_pos算法最终返回的是res,es是通过vrf_pos算法产生的一个随机数,proof相当于一个中间结果,这是其他节点需要验证随机
数是否属于该节点的一个值,通过proof和该节点的公钥就可以完成验证。
[0029]
实施例2要将分片技术应用到区块链上主要分别两个板块,一个是网络分片,另一个是交易分片。网络分片主要是将区块链中节点根据一定规则进行随机分片的策略,交易分片是将不同交易划分到不同网络分片中,让不同的分片同时处理不同交易,这样来提升交易吞吐量的方法。
[0030]
具体的,网络分片的思想是将整个区块链网络划分为多个子网络,每个子网络中都包含一部分节点,使得交易能由不同子网络的节点并行处理,而恶意节点是每个网络中不可避免的,为了防止某个子网络被大量恶意节点控制,最好的方式就是进行随机性分片。
[0031]
本实施例通过改进的vrf(verifiable random function)算法来实现对区块链中所有节点的映射。比如有1000个节点,则所有节点通过改进的vrf算法会随机映射到0-999之间的某一个数,且各节点的映射数均不相同。虽然节点自身映射出了某个数,但是其他节点不知道,所以需要一个算法让全网节点达成共识,认同每个节点的映射值这里使用pos权益证明算法。本方案中随机数的映射以及达成全网共识是一起完成的,所以定义vrf_pos算法,传统vrf算法能够由私钥(sk)以及消息(info)产生一组可验证的伪随机字符串(result)以及证明(proof),任何人都可以通过vrf_verify函数来验证这个随机字符串是否是该公钥对应私钥持有者的。
[0032]
如图2,首先证明者生成一对公私钥,分别为pk和sk,然后证明者把pk,sk和证明消息(比如区块链网络的前一区块哈希值或区块高度)以及证明者持有的tokens作为vrf_pos算法的输入,接下来,如图3,证明者在本地计算vrf_hash和vrf_proof函数,分别得到结果是结果res和证明proof。接下来就是本文改进传统vrf算法的主要做法,分为证明者和验证者。
[0033]
证明者:第一步,把vrf计算的结果res通过空间映射函数,把res值映射到值域范围[0,value]的范围内,假设最终映射到的结果值是result;第二步,再把这个result值与证明者持有tokens值做除法操作,就会得到证明者在网络分片中的身份。
[0034]
验证者:第一步,计算proof与res是否相匹配,如果不是,就表示验证失败,否则进行第二步;第二步,验证者获得证明者的公钥pk和消息info,再验证res确实通过该证明者和输入消息info计算出来的,即验证通过,最后验证者再次验证res与result是否匹配,即验证result是否是通过res做空间映射函数计算得出,若匹配成功,就输出result,res和true,否则,输出false,算法结束。
[0035]
vrf_hash和vrf_proof函数与传统vrf算法中一致,token可以理解为节点必须要有一定余额,不然无法参加分片;vrf_pos算法与传统vrf算法的不同点在于会将res映射为result,该result作为一个随机数以决定该节点的身份。
[0036]
如图4,若网络分片m=4,则每个节点由vrf_pos算法生成的result mod m得到分片号si,分片号si为s0,s1,s2,s3号分片即分别表示0,1,2,3号分片。
[0037]
对于节点的身份,主要分为领导者,一级节点和二级节点。
[0038]
领导者功能:验证每个分片内一级节点提交的merkle子树哈希结果和签名,打包最终的区块并发布。
[0039]
一级节点功能:提出交易,打包属于本分片内的交易,组成merkle子树哈希结果并
签名,完成共识。
[0040]
二级节点功能:提出交易,协助共识即完成对merkle子树哈希结果签名。
[0041]
对于领导者,可以规定为result结果<1的节点作为领导节点,对于非领导节点还需要自身资本w,使用各自的result/w,若结果小于1,则该节点为一级节点,剩下的为二级节点。
[0042]
而关于交易分片方案设计,由于网络分片是其他所有分片的基础,因此交易分片的前提是先进行网络分片。网络分片是把整个区块链网络划分为不相交的子网络,每个子网络同时处理不同的交易,即接下来进行的就是交易分片,交易分片主要涉及的问题是未确定的交易应该按照特定的属性被分配到特定的分片中进行处理。
[0043]
交易分片的思想是把不同属性的交易分配到特定的网络分片中处理。例如,假设网络分片总共m个分片,其中m=2
k
,那么交易分片也为m个分片,即可以按照发起交易账户地址的二进制前k位分为m个交易分片,使得账户地址二进制前k位不同的账户发起的交易在不同的网络分片中并行处理。
[0044]
如图5,交易分片采用基于账户系统的分片机制:首先,网络分片后每个分片有唯一的编号,对每笔交易的账户号进行sha256运算后,取其账户二进制地址的前k位映射到分片中,例如,网络分片分为4片,则取每个发起交易账户号的前2位映射到分片中,这样保证同一账户号的所有交易都在同一分片内处理,防止双花交易出现)。
[0045]
每个分片能够将一个存储交易的merkle树拆分为2
k
棵子树(对应2
k
个分片,即2
k
个网络分片)。
[0046]
每个分片的节点将打包一棵merkle子树而不是一个完整的区块。
[0047]
每个分片发布给leader节点的子树merkle root哈希值都需要签名,防止非法节点以及非法merkle root哈希值;同一分片内的节点都对一级节点发布的子树merkle root哈希值进行验证和签名。
[0048]
leader节点验证子树merkle root哈希值的签名,如果其他签名节点的资本大于发布子树merkle root哈希值节点资本的三分之二,则领导者节点认为此子树merkle root哈希值合法;否则,拒绝此值。
[0049]
如果某个分片没有形成merkle子树,那么最终领导者节点收到的merkleroot值为奇数个,领导者节点将最后一个merkle root哈希复制一份保证偶数个叶子节点。
[0050]
最终由领导者节点发布区块并签名。