首页 / 专利库 / 银行与财务事项 / 分布式账本技术 / 区块链 / 区块头 / 一种适用于能源区块链的区块生成与交易验证方法

一种适用于能源链的区块生成与交易验证方法

阅读:131发布:2020-05-08

专利汇可以提供一种适用于能源链的区块生成与交易验证方法专利检索,专利查询,专利分析的服务。并且本 发明 涉及 能源 区 块 链 领域,具体为一种适用于能源区块链的区块生成与交易验证方法。针对 电能 源交易有明显的热点账户,原有的区块生成方式使得区块链验证交易是否合法对于每个账户都需要相同的计算与存储成本,本发明通过对电能源交易场景进行针对性优化,通过改造merkle树组织形式,使得优先级高的账户在形成区块时距查询的根结点最接近,能够更快速地查找到,相较于 现有技术 ,能够达到降低计算成本的目的,具有灵活简单,高实用性的特点。,下面是一种适用于能源链的区块生成与交易验证方法专利的具体信息内容。

1.一种适用于能源链的区块生成方法,其特征在于,包括以下步骤:
步骤1:在所有参与能源交易的节点中在各选举周期内选举出唯一一个的记账节点;
步骤2:记账节点在记账周期到达时,统计当前待打包的区块所涉及的所有交易的账户状态,通过查找之前区块中的状态树对交易的合法性进行验证,剔除所有不合法交易后,将合法交易的账户的状态进行更新,将当前区块所涉及的账户的当前状态以各账户的公钥为键以梅克尔帕特里夏树的形式生成状态树,并将各账户的当前状态存储至数据库;所述状态包括交易的优先级、账户的余额、记录上一次该账户状态变动的区块的高度;
步骤3:记账节点对当前待打包的合法交易以交易接收方分组,每组内的交易按照优先级由高到低排序,将交易信息存储至当前区块,并更新状态树中的账户状态为交易后的账户状态;
步骤4:记账节点对每组内的交易按照优先级由低到高排序生成各交易接收方的交易链表:对组内优先级最低的交易计算第一个哈希Hash值,之后将后一个优先级的交易与最新已计算出的Hash值一起再计算Hash值,直至组合所有交易均参与完成hash值的计算;
步骤5:记账节点生成交易树:
5-1)记账节点取出所有交易链表中最后一个Hash值作为森林中的一个根结点,每一个根结点为一颗树;
5-2)在森林中选出优先级最小的两个根结点更新为一棵新树的左、右子树的子结点生成新树,且新树的根结点优先级为其左、右子树的子结点优先级之和,新树的根结点的Hash值为左、右子树的Hash值拼接后再计算Hash值;
5-3)判断当前森林中是否仅有一个根结点,如否,返回步骤5-2),如是,将最终生成的树与各交易链表来共同形成交易树;
步骤6:将状态树的根结点Hash值、交易树的根结点Hash值、当前区块的区块头哈希值、上一区块的区块头哈希值、时间戳写入当前区块的区块头,并将本地生成的完整的交易树和状态树写入到本区块,完成此次记账周期的区块生成。
2.如权利要求1所述方法,其特征在于,步骤1中通过工作量证明POW机制选出记账节点。
3.如权利要求1所述方法,其特征在于,步骤2中记账节点通过查找之前区块中的状态树对交易的合法性进行验证,具体的验证方法为,通过首先从上一区块的状态树中找涉及的交易发送方和接收方状态,如果上一区块没有找到,则从更上一级区块中的状态树中找,直到找到记录上次变动的状态树的区块,从中获取变动之后的状态信息,当交易双方的账户余额满足本次交易要求则判断为合法交易,否则为不合法交易。
4.基于如权利要求1所述区块生成的交易验证方法,其特征在于,包括以下步骤:
步骤1:客户端从记账节点处获取交易所在区块的区块头,并根据区块头从数据库中获取账户的状态,获取需要验证的接收方账户的所有涉及交易;
步骤2:根据账户状态中的优先级找到交易树的验证路径,并获取交易树中所涉及的Hash值,从叶子结点到根节点进行验证,当有结点被篡改,则重新获取该结点所对应的交易信息及其之后的交易信息。

说明书全文

一种适用于能源链的区块生成与交易验证方法

技术领域

[0001] 本发明涉及能源区块链技术,尤其涉及非对等的区块链数据交易验证技术。

背景技术

[0002] 能源行业中的交易与比特币等传统去中心化的交易系统相比,有着大量交易集中发生在少数用户之间的特点,加之能源行业对安全性的严格要求,每一笔交易都需要足够信赖的用户背书,提供信用背书的用户被访问频率远远大于普通用户。传统的区块链交易系统中,每一个用户都是完全对等的,验证每一笔交易都需要同样的验证路径,这种结构难以适应能源行业交易集中化的特点。并且,传统区块链交易系统难以快速合并交易,一旦交易发生错误,难以定位,从而导致运维困难。

发明内容

[0003] 本发明所要解决的技术问题是,提供一种适用于能源系统的区块链的,在分布式交易系统中,体现关键色的地位,在保证系统稳定的前提下,提高交易的验证效率以及减少存储资源的浪费的区块生成与交易验证方法。
[0004] 本发明为解决上述技术问题所采用的技术方案是,一种适用于能源区块链的区块生成方法,包括以下步骤:
[0005] 步骤1:在所有参与能源交易的节点中在各选举周期内选举出唯一一个的记账节点;
[0006] 步骤2:记账节点在记账周期到达时,统计当前待打包的区块所涉及的所有交易的账户状态,通过查找之前区块中的状态树对交易的合法性进行验证,剔除所有不合法交易后,将合法交易的账户的状态进行更新,将当前区块所涉及的账户的当前状态以各账户的公钥为键以梅克尔帕特里夏树的形式生成状态树,并将各账户的当前状态存储至数据库;所述状态包括交易的优先级、账户的余额、记录上一次该账户状态变动的区块的高度;
[0007] 步骤3:记账节点对当前待打包的合法交易以交易接收方分组,每组内的交易按照优先级由高到低排序,将交易信息存储至当前区块,并更新状态树中的账户状态为交易后的账户状态;
[0008] 步骤4:记账节点对每组内的交易按照优先级由低到高排序生成各交易接收方的交易链表:对组内优先级最低的交易计算第一个哈希Hash值,之后将后一个优先级的交易与最新已计算出的Hash值一起再计算Hash值,直至组合所有交易均参与完成hash值的计算;
[0009] 步骤5:记账节点生成交易树:
[0010] 5-1)记账节点取出所有交易链表中最后一个Hash值作为森林中的一个根结点,每一个根结点为一颗树;
[0011] 5-2)在森林中选出优先级最小的两个根结点更新为一棵新树的左、右子树的子结点生成新树,且新树的根结点优先级为其左、右子树的子结点优先级之和,新树的根结点的Hash值为左、右子树的Hash值拼接后再计算Hash值;
[0012] 5-3)判断当前森林中是否仅有一个根结点,如否,返回步骤5-2),如是,将最终生成的树与各交易链表来共同形成交易树;
[0013] 步骤6:将状态树的根结点Hash值、交易树的根结点Hash值、当前区块的区块头哈希值、上一区块的区块头哈希值、时间戳写入当前区块的区块头,并将本地生成的完整的交易树和状态树写入到本区块,完成此次记账周期的区块生成。
[0014] 一种基于上述区块生成的交易验证方法,包括以下步骤:
[0015] 步骤1:客户端从记账节点处获取交易所在区块的区块头,并根据区块头从数据库中获取账户的状态,获取需要验证的接收方账户的所有涉及交易;
[0016] 步骤2:根据账户状态中的优先级找到交易树的验证路径,并获取交易树中所涉及的Hash值,从叶子结点到根节点进行验证,当有结点被篡改,则重新获取该结点所对应的交易信息及其之后的交易信息。
[0017] 本发明相较于传统区块链数据结构和访问方式,其有益效果是:
[0018] 1.验证速度更快,在本发明提供的访问方法中,如果区块上有M笔交易,一个账户需要验证自己的N笔交易,则传统的访问方式需要做N次验证,每次验证平均需要logM次访问,总计需要N*logM次访问。而本发明只需要验证树一次,平均访问logM次,验证交易链表N次。总共需要N+logM次。可见在交易量大的时候能够极大减少验证次数。
[0019] 2.重要交易验证成功率高,由于链式验证的特点,优先级越高的交易,所需要验证路径越少,对于优先级越高的账户之间的交易,越容易一次验证通过。
[0020] 3.更少的储存空间占用,传统merkle树验证中,需要多层哈希数据支持验证,如果区块上有M笔交易,分属于K个账户,则传统验证中需要M个交易Hash值,M个验证Hash值,空间占用为2M。本发明中的验证方式,需要存储M个交易树的Hash,K个状态树的Hash,空间占用为M+K。在电交易中,交易M>>账户K,这种方式能够极大减少存储空间浪费。
[0021] 4.更少交易确认时间,传统验证方案中,验证双方必须遍历所有区块,得到所有账户的余额。在本方案中,只需要逐个遍历上一区块,根据交易的局部性,大概率在临近区块中找到上次交易后账户余额,减少了交易确认时间。
[0022] 5.更方便优化,区块涉及账户状态信息保存在数据库中,方便采用缓存等优化查询效率。附图说明
[0023] 图1为实施例交易树数据结构;
[0024] 图2为本发明所述交易验证过程;
[0025] 图3为实施例所述验证路径。

具体实施方式

[0026] 本发明涉及的区块链组织结构,主要包括以下两方面:
[0027] 1、状态树:是一个特殊的merkle树——梅克尔帕特里夏树。梅克尔帕特里夏树为特殊的哈希树,以公钥为键,存储的内容应该至少包括优先级,余额等状态。本实施例中,优先级与近期交易次数有关。也可以选用多种方式计算优先级,但应该保证优先级高的交易被查询概率越高或者地位越重要。余额为区块中所有涉及到用户上一区块余额交易后剩余余额。状态树用于验证状态,除此之外还应有存储公钥和状态对应关系的数据库,用于加快查找速度。状态树最主要的用处是在更短的时间内找到账户状态。状态树是在区块生成的时候使用的,区块生成的时候不能以本地的数据库为准,需要以链上参与节点达成共识的数据为准,这就需要从区块链中获取状态信息。
[0028] 状态树还可以让新节点加入的时候通过状态树可以快速的将本地数据库构建完。新加入的节点从头开始从其他参与节点中获取到当前的所有区块,如果区块没有获取完成,则不参与共识。获取完成之后,从最后的区块开始向前迭代,遍历区块中的状态树,每找到一个新的账户就加入到本地数据库中,这样子就能够构建本地数据库。这是一个典型的本地状态数据库构建过程,由于有状态树的帮助,账户状态只与最后的状态有关,就不需要在遍历每一个区块的交易通过加减运算进行构建了。
[0029] 2、交易树:是一个特殊的哈希树,最底层是在这一区块中每一交易接收方所有交易中优先级最大者的Hash值,其中验证路径的长度与交易双方,特别是交易接受方优先级密切相关,交易两方优先级越高,距离Hash Root越近,这样可以保证优先级越高,验证路径越短。
[0030] 状态树与交易树均保存在区块中,是要参与节点全局达成共识的。
[0031] 本地数据库保存账户状态是为了方便节点查询。因为区块链只能保证链上的数据一致,不能保证数据库也是一致的,直接从区块链中查找账户状态成本比较高。比如一个新的交易请求到达,节点可以通过状态数据库快速的获取当前账户状态,如果有问题可以快速的返回失败。这个在客户端获取账户数据的时候也可以用到。相当于是一个缓存,但是区块打包的时候需要重新对交易合法性进行验证,这个时候就不能使用数据库的数据了,因为数据库的数据不保证一致性。
[0032] 区块生成的方法如下:
[0033] 步骤1:在所有参与能源交易的节点中在各选举周期内通过工作量证明POW机制选举出唯一一个的记账节点;
[0034] 步骤2:交易池中的交易需要打包到区块中,记账节点在记账周期到达时,打包区块之前需要验证交易合法性:统计当前待打包的区块所涉及的所有交易的账户状态,通过查找之前区块中的状态树对交易的合法性进行验证。每一个区块都有一个状态树,状态树里记录了所有在本区块打包交易涉及的账户在本区块时候的状态。合法性进行验证主要目的是检验交易账户余额是否充足,另再检验签名是否合法。比如A账户最近一次交易的区块中的状态树显示只有10token,但是他在本周期的所有的交易相加显示他需要转出20token,这样他只会有10token的交易成功,其他的不会打包到区块中。
[0035] 记账节点剔除所有不合法交易后,将合法交易的账户的状态进行更新,将当前区块所涉及的账户的当前状态以各账户的公钥为键以梅克尔帕特里夏树的形式生成状态树,并将各账户的当前状态存储至数据库;所述状态包括交易的优先级、账户的余额、记录上一次该账户状态变动的区块的高度。
[0036] 交易的合法性验证方法为:通过首先从上一区块的状态树中找涉及的交易发送方和接收方状态,如果上一区块没有找到,则从更上一级区块中的状态树中找,直到找到记录上次变动的状态树的区块,从中获取变动之后的状态信息,当交易双方的账户余额满足本次交易要求则判断为合法交易,否则为不合法交易。
[0037] 步骤3:记账节点对当前待打包的合法交易以交易接收方分组,每组内的交易按照优先级由高到低排序,将交易信息存储至当前区块,并更新状态树中的账户状态为交易后的账户状态;
[0038] 步骤4:记账节点对每组内的交易按照优先级由低到高排序生成各交易接收方的交易链表:对组内优先级最低的交易计算第一个哈希Hash值,之后将后一个优先级的交易与最新已计算出的Hash值一起再计算Hash值,直至组合所有交易均参与完成hash值的计算;
[0039] 步骤5:记账节点生成交易树:
[0040] 5-1)记账节点取出所有交易链表中最后一个Hash值作为森林中的一个根结点,每一个根结点为一颗树;
[0041] 5-2)在森林中选出优先级最小的两个根结点更新为一棵新树的左、右子树的子结点生成新树,且新树的根结点优先级为其左、右子树的子结点优先级之和,新树的根结点的Hash值为左、右子树的Hash值拼接后再计算Hash值;
[0042] 5-3)判断当前森林中是否仅有一个根结点,如否,返回步骤5-2),如是,将最终生成的树与各交易链表来共同形成交易树;
[0043] 步骤6:将状态树的根结点Hash值、交易树的根结点Hash值、当前区块的区块头哈希值、上一区块的区块头哈希值、时间戳写入当前区块的区块头,并将本地生成的完整的交易树和状态树写入到本区块,完成此次记账周期的区块生成。
[0044] 例1
[0045] 本实施例假设在一个能源交易场景的一个区块生成周期中,有三个记账节点p1、p2、p3,有5个账户u1-u5之间发生了交易,->表示资金流向,交易分别为:U2->u1:100、U3->u1:90、U4->u1:80、U5->u1:50、U1->u2:90、U3->u2:70、U4->u2:50、U1->u3:80、U2->u3:40。
[0046] 1.p1、p2、p3分别计算一个数学难题,解决出来之后立刻全网广播,假设此时p1解决了出来,p2,p3接受到了这一结果后,知道此次应该由p1记账,p2、p3停止计算;
[0047] 2.p1获取全网在本次记账周期中发生的所有交易,计算所涉及的账户,从上一区块中获取账户状态,如果上一区块中无此账户状态,则到更上一个区块中获取,以此类推。本例中获取了u1-u5的账户状态;
[0048] 3.计算u1-u5的账户状态,剔除交易金额大于余额的交易,本例中假设所有交易合法。计算了u1-u5所有接受到的交易额:u1:320,u2:210,u3:120,生成优先级u1>u2>u3,存入数据库中;
[0049] 4.将所有交易之后状态的Hash值作为Value,以账户公钥为Key组成梅克尔帕特里夏树,同时将账户的状态存入数据库;
[0050] 5.对所有交易按照接收方交易额排序:u1->u2->u3,同一接收方按照发起方优先级从高到低排序U2->u1:100、U3->u1:90、U4->u1:80、U5->u1:50、U1->u2:90;
[0051] 6.对本记账周期内每一个接收方涉及的账户,按照发起方优先级从高到低执行如下操作形成该接收方账户的交易链表:
[0052] 6.1、如果没有前一交易,计算本交易Hash值;
[0053] 6.2如果有前一交易,将前一交易的Hash值记录到数据结构中,并计算整个数据结构的Hash值,以此类推;
[0054] 7.对所有涉及的接收方,执行执行以下操作:
[0055] 7.1、取出所有交易链表中第一个Hash值作为森林中的一个根结点,每一个根结点为一颗树,取出所有Hash值看做森林;
[0056] 7.2、在森林中选出优先级最小的两个根结点更新为一棵新树的左、右子树的子结点生成新树,且新树的根结点优先级为其左、右子树的子结点优先级之和,新树的根结点的Hash值为左、右子树的Hash值拼接后再计算Hash值;
[0057] 7.3、判断当前森林中是否仅有一个根结点,如否,返回步骤7.2,如是,将最终生成的树与各交易链表来共同形成交易树,如图1所示;
[0058] 8.将状态树的根结点Hash值、交易树的根结点Hash值、当前区块的区块头哈希值、上一区块的区块头哈希值、时间戳写入当前区块的区块头,并将本地生成的完整的交易树和状态树写入到本区块,完成此次记账周期的区块生成。之后通过共识机制,将该区块在各参与节点间形成共识。
[0059] 对交易进行验证方法,如图2所示:
[0060] 步骤1:客户端从记账节点处获取交易所在区块的区块头,并根据区块头从数据库中获取账户的状态,获取需要验证的接收方账户的所有涉及交易;
[0061] 步骤2:根据账户状态中的优先级找到交易树的验证路径,并获取交易树中所涉及的Hash值,从叶子结点到根节点进行验证,当有结点被篡改,则重新获取该结点所对应的交易信息及其之后的交易信息。
[0062] 从叶子结点到根节点进行验证的具体方法是:首先拉取交易,然后从叶子结点生成hash,和兄弟节点的hash重新计算hash,生成父节点hash,然后和父节点的兄弟节点hash生成父节点的父节点的hash,一直持续这个过程,知道生成最终的交易merkle树根,通过将根与区块中的根对比得到交易是否被篡改。这个过程是一个典型的merkle树验证过程。
[0063] 例2
[0064] 本实施例假设在一个能源交易场景的一个区块生成周期中,上一个周期打包了5个账户u1-u5之间的交易,->表示资金流向,交易分别为:U2->u1:100、U3->u1:90、U4->u1:80、U5->u1:50、U1->u2:90、U3->u2:70、U4->u2:50、U1->u3:80、U2->u3:40。在上一次的记账结束之后,u2需要验证在上一个周期中达成的全部交易。
[0065] 1.u2通过客户端向p1、p2、p3要求获取所有区块头,p1、p2、p3在接受到请求之后,将所有区块头依次发送到客户端中。客户端通过将大多数节点返回的区块头按照顺序记录到本地。
[0066] 2.客户端向任一节点获取上一周期区块中保存的交易树,同时向另一节点获取u2上一周期打包的所有交易。
[0067] 3.客户端开始验证交易
[0068] 3.1首先按照交易优先级对u2上一周期涉及的交易进行排序,由优先级大小从小到大,进行以下操作:
[0069] 3.2组装数据结构,记录更小优先级hash值和交易,对整个结构进行hash运算,得到本hash;
[0070] 3.3依次进行3.2操作,直到计算得到整个u2交易的hash h7;
[0071] 3.4从交易树中获取得到h9,和h7联合进行hash运算,得到h10;
[0072] 3.5从交易数中获取h4,和h10联合进行hash运算,得到hash root;
[0073] 3.6将hash root与区块头中的进行对比,验证通过。
[0074] 整个过程如图3所示,虚线为验证路径。
[0075] 例3
[0076] 本实施例假设在一个记账周期内,将要打包的区块高度为20,有u1 u2 u3 u4 u5 5个用户参与了交易,其中,u1账户上一次交易为高度10的区块,u3上一次交易为高度为15的区块,u4上一次交易为高度为18的区块,u2,u5上一次交易高度为19,节点p1打包区块,将对账户状态进行验证,步骤如下:
[0077] 1.找到上一区块,为高度19的区块,找到了u2,u5的状态,发现没有u1、u3、u4的状态;
[0078] 2.继续向前迭代,直到高度为10的区块,这时候本交易所涉及的所有账户状态均已经获取;
[0079] 3.P1对u1-u5进行验证,验证通过则开始进行记账:
[0080] 3.1将所有的交易打包为交易树记录到区块中;
[0081] 3.2将本周期涉及的交易账户u1-u5状态更新,并保存为状态树,记录到区块中;
[0082] 3.3将交易树和状态树根记录到区块头,并将整个区块广播;
[0083] 3.4其他节点接收到广播之后,验证交易状态,通过则记录到本地。
[0084] 例4
[0085] 本实施例假设在高度为30的区块链中,账户u1需要获取所有交易记录,u1分别在高度20、10、8、6、5、3的区块中发生了交易。
[0086] 1.首先从高度30的区块向前遍历,找到最后发生交易的区块,在这里是高度为20的区块;
[0087] 2.从最后一个发生交易的区块开始,进行以下操作:
[0088] 2.1获取本区块中所有涉及到u1的交易
[0089] 2.2从状态树中获取上一次交易的区块高度;
[0090] 2.3跳转到上一区块高度重复2.1,直到获取账户最早的交易;
[0091] 3.将所有的交易按照时间顺序串联,得到整个账户的变动日志。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈