一种基于增量哈希的区块链世界状态校验和恢复方法与流程

文档序号:19378214发布日期:2019-12-11 00:05阅读:456来源:国知局
一种基于增量哈希的区块链世界状态校验和恢复方法与流程

本发明涉及区块链技术,尤其涉及一种基于增量哈希的区块链世界状态校验和恢复方法。



背景技术:

区块链技术,区块链是一种新型去中心化协议,能安全地存储数字货币交易或其他数据,信息不可伪造和篡改,区块链上的交易确认由区块链上的所有节点共同完成,由共识算法保证其一致性,区块链上维护一个公共的账本,公共账本位于存储区块上任何节点可见,从而保证其不可伪造和篡改。

世界状态是基于账户模型的区块链系统在交易执行完之后产生的状态信息的总和,包括所有区块链中账户的包括余额在内的账户信息,和所有智能合约的状态信息。因而,智能合约的调用或者在不调用合约情况下的转账操作都会导致世界状态的改变。每一个区块的交易执行之后产生的最新世界状态,是下一个区块的交易执行的基础,准确的说,每笔交易的执行都会在前一笔交易执行之后的最新世界状态的基础上继续修改。

在基于账户模型的区块链系统中,节点之间除了保证交易内容和顺序的一致性之外,也要保证世界状态信息的一致性,以防执行过程中可能出现的错误导致,在不同节点看来,同一个账户的余额,或者同一个合约的状态是不一致的。对世界状态计算哈希,并对于不同的区块链节点,比对相同高度的区块的状态哈希是否一致,是最高效且实用的方式。以太坊使用mpt树组织起整个世界状态,并为其计算哈希;hyperledgerfabric在0.6版本中用一棵bucket树做类似的操作。这两种树的共同点是计算代价很高,从而影响区块链系统的处理性能,且会带来严重的数据写放大情况(树的节点信息也需要额外存储一遍)。



技术实现要素:

针对现有技术的不足,本发明提出了一种基于增量哈希的区块链世界状态校验和恢复方法,设计了一套高性能低存储量的区块链世界状态校验方法,并且当校验出现问题(节点间世界状态不一致)时,给出了相应的恢复方法。

本方案是通过以下技术方案实现的:一种基于增量哈希的区块链世界状态校验方法,具体包括以下步骤:

步骤一:获取当前区块中用于计算哈希的交易执行结果:

区块链系统的执行模块执行区块中的交易,并生成当前区块提交时对应的世界状态修改集合。所述世界状态修改集合以合约账户为单位,将每个账户涉及到的世界状态修改分别存储。

步骤二:计算每个在所述区块合约交易执行过程中修改所涉及到的合约账户的增量哈希:

(2.1)对所述合约账户的合约状态空间的修改记录进行排序;

(2.2)计算排序后的修改记录的哈希;

(2.3)计算第一次修改后的所述合约账户增量哈希:利用一个空的哈希值以及对本次合约账户修改执行步骤2.1与步骤2.2所得第一次修改后的所述合约账户的世界状态修改哈希,计算得到第一次修改后的合约账户增量哈希;

(2.4)计算第二次修改后的所述合约账户增量哈希:利用所述第一次修改后的所述合约账户的世界状态修改哈希以及对本次账户修改执行步骤2.1与步骤2.2所得第二次修改后的所述合约账户的世界状态修改哈希,计算得到第二次修改后的合约账户增量哈希;

(2.5)对于之后的每一次修改所述合约账户增量哈希,通过步骤2.4的迭代方法,即利用所述合约账户上一次修改后计算得到的世界状态修改哈希以及对本次账户修改执行步骤2.1与步骤2.2所得到的当前合约账户的世界状态修改哈希,计算得到所述合约账户的最新修改的世界状态增量哈希。

步骤三:根据所有合约账户修改的世界状态增量哈希进行全局增量哈希计算,作为新的世界状态哈希:

(3.1)将所有在所述区块合约交易执行过程中被修改世界状态的账户进行序列化,得到序列化的账户。

(3.2)将所述序列化的账户按照账户地址进行排序。

(3.3)计算排序后的被修改账户的哈希。

(3.4)计算第一个区块的增量全局世界状态哈希:利用一个空的哈希值以及对所述第一个区块执行步骤3.1-3.3所得到的所述第一个区块交易执行后被修改账户集合的哈希摘要,计算得到所述第一个区块的增量全局世界状态哈希;

(3.5)计算第二个区块的增量全局世界状态哈希:利用所述第一个区块的增量全局世界状态哈希以及对所述第二个区块执行步骤3.1-3.3所得到的所述第二个区块交易执行后被修改账户集合的哈希,计算得到所述第二个区块的增量全局世界状态哈希;

(3.6)对于之后的每一个区块,通过步骤3.5的迭代方法,即利用上一个区块交易执行后被修改的合约账户的哈希以及对本区块执行步骤3.1-3.3所得当前区块交易执行后被修改的账户的哈希,计算得到当前区块的增量全局世界状态哈希。

步骤四:世界状态校验:

每提交指定数量个区块之后,节点之间会进行最新区块的增量全局世界状态哈希的比对:对于任何一个节点,如满足共识算法要求个数个节点的增量全局世界状态哈希与所述节点的增量全局世界状态哈希一致,所述节点确认所述世界状态校验成功;否则,所述节点即为异常节点,所述世界状态校验失败。

进一步地,步骤三中所述序列化账户中包括账户余额在内的最新世界状态信息,所述账户包括合约账户和普通账户,所述合约账户的序列化结果中还包括步骤二所计算得到合约账户增量哈希。

进一步地,步骤二和步骤三中,采用稳定排序算法对合约账户及账户中的状态信息进行排序。

进一步地,步骤四中,所述世界状态校验失败后,对所述区块链世界状态进行恢复,所述恢复的方法具体为:回滚掉所有和其他节点中不同的区块及其对应的世界状态修改,然后从其他节点拉取被回滚掉的区块。拉取区块的同时,把回滚前第一个与其他节点不同的区块对应的世界状态修改直接从区块来源节点拉取过来,并应用修改。之后重复执行步骤一到步骤三,直到恢复出正确的最新世界状态。

本发明的有益效果:本发明应用于区块链平台上,提供了一套全新的世界状态维护、校验和恢复的方案,提升了计算世界状态哈希的效率,减少的不必要数据的存储量。同时,异常节点的世界状态修复也不再像之前一样可能需要回滚掉很多很多区块,提升了世界状态修复的效率。

附图说明

图1是增量哈希计算的流程图;

图2是世界状态修复的流程图。

具体实施方式

下面结合附图对本发明进行详细描述,使得本发明的目的和效果将变得更加明显。

一种基于增量哈希的区块链世界状态校验方法,具体包括如下步骤:

步骤一:获取当前区块中用于计算哈希的交易执行结果:

区块链系统的执行模块执行区块中的交易,并生成当前区块提交时对应的世界状态修改集合。所述世界状态修改集合以合约账户为单位,将每个账户涉及到的世界状态修改分别存储。这个世界状态修改集合是后续计算增量哈希过程中计算“增量”的依据。如图1为增量哈希计算的流程图,具体包括合约账户的增量哈希和全局增量哈希计算的计算。

步骤二:计算每个在所述区块合约交易执行过程中修改所涉及到的合约账户的增量哈希:

这一步主要是针对合约账户,因为每个合约账户会拥有一个合约,每个合约会有一个自己的状态空间。

(2.1)对所述合约账户的合约状态空间的修改记录采用稳定排序算法进行排序;其目的是保证后续的哈希计算结果只与合约账户的世界状态修改结果有关,这样即使不同节点中由于操作系统不同、编译hyperchain可执行文件时的go语言版本不同等原因可能造成的对修改记录的组织和排列顺序不一致,最后一样可以计算出相同的哈希结果。

(2.2)计算排序后的修改记录的哈希;其目的是保证不同节点在这一个区块中的交易涉及到的智能合约都相同,同时对于每一个智能合约,修改后的世界状态均一致。

(2.3)计算第一次修改后的所述合约账户增量哈希:利用一个空的哈希值以及对本次合约账户修改执行步骤2.1与步骤2.2所得第一次修改后的所述合约账户的世界状态修改哈希,计算得到第一次修改后的合约账户增量哈希;

(2.4)计算第二次修改后的所述合约账户增量哈希:利用所述第一次修改后的所述合约账户的世界状态修改哈希以及对本次合约账户修改执行步骤2.1与步骤2.2所得第二次修改后的所述合约账户的世界状态修改哈希,计算得到第二次修改后的合约账户增量哈希;

(2.5)对于之后的每一次修改所述合约账户增量哈希,通过步骤2.4的迭代方法,即利用所述合约账户上一次修改后计算得到的世界状态修改哈希以及对本次账户修改执行步骤2.1与步骤2.2所得到的当前合约账户的世界状态修改哈希,计算得到所述合约账户的最新修改的世界状态增量哈希。

计算每次修改后的所述合约账户增量哈希的目的是:在某一个区块生成后,一个合约账户的世界状态数据的修改在节点间出现不一致,而此时并未触发节点间世界状态一致性的检查,可在后面的区块中,这个合约账户的世界状态数据又一次被修改,且这次的修改结果是一致的,因而修改结果计算出来的哈希一致。如果不计算这一步增量哈希,而是直接把前面计算出的哈希当作合约账户的世界状态哈希,会导致无法及时发现合约账户的异常。

步骤三:根据所有合约账户修改的世界状态增量哈希进行全局增量哈希计算,作为新的世界状态哈希:

(3.1)将所有在所述区块合约交易执行过程中被修改世界状态的账户进行序列化,得到序列化的账户,从而方便计算哈希。所述序列化账户中包括账户余额在内的最新世界状态信息,所述账户包括合约账户和普通账户,所述合约账户的序列化结果中还包括步骤二所计算得到合约账户增量哈希。

(3.2)将所述序列化的账户按照账户地址采用稳定排序算法进行排序。

(3.3)计算排序后的被修改账户的哈希,其目的是保证不同节点在这一个区块中的交易涉及到的账户都相同,同时对于每一个账户,修改后的所有状态数据(包括余额、合约状态等)均一致。

(3.4)计算第一个区块的增量全局世界状态哈希:利用一个空的哈希值以及对所述第一个区块执行步骤3.1-3.3所得到的所述第一个区块交易执行后被修改的合约账户的哈希,计算得到所述第一个区块的增量全局世界状态哈希;

(3.5)计算第二个区块的增量全局世界状态哈希:利用所述第一个区块的增量全局世界状态哈希以及对所述第二个区块执行步骤3.1-3.3所得到的所述第二个区块交易执行后被修改的合约账户的哈希,计算得到所述第二个区块的增量全局世界状态哈希;

(3.6)对于之后的每一个区块,通过步骤3.5的迭代方法,即利用上一个区块交易执行后被修改的合约账户的哈希以及对本区块执行步骤3.1-3.3所得当前区块交易执行后被修改的账户的哈希,计算得到当前区块的增量全局世界状态哈希。

计算每个区块的增量全局世界状态哈希的目的是:防止出现前一区块执行后世界状态出现不一致,可在后面的区块中把这不一致掩盖掉并计算出一样的哈希。且世界状态数据出现不一致后,异常节点无法及时发现自己已经异常,而像正常节点一样对外提供服务。

在步骤二和步骤三中,如果不使用增量哈希,而仅仅校验每个区块的世界状态修改情况,那就必须每个区块执行完交易之后,都必须要立即校验世界状态,校验成功后才能提交该区块并继续执行新区块中的交易,否则在步骤二中描绘的情景就可能出现,并且这样会带来很多的网络开销,也会影响到网络执行的效率。使用增量哈希后,后边区块的世界状态哈希与前一区块执行完的世界状态同样有关,从而产生雪崩效应,前面产生的世界状态不一致不会被后面所掩藏,就可以不必每一区块执行完后都要检查世界状态。

目前具有全局世界状态校验功能的区块链系统中常用树形结构——mpt树和bucket树来维护世界状态哈希,但以太坊的mpt树作为一棵前缀树,需要持久化存储很多的中间的前缀节点,同时每次读取或写入一个状态数据,都会对应一次从树根到某一叶子节点的完整路径的访问;hyperledgerfabric0.6版本的bucket树虽然获取状态数据可以直接从数据库中读取出状态数据,但它的叶子节点是状态数据的一个副本而不是直接就是状态数据本身,便会造成额外的一份数据存储。以增量哈希替代现在的区块链系统中常用的树形结构维护全局世界状态哈希,不用存储任何用以计算哈希的节点数据,不会使得状态数据读写复杂化,同时由于每次参与哈希计算的只有一个区块中的状态变化情况加一个之前的哈希,参与计算的数据量大大减小,从而缩短了哈希计算时间。

步骤四:世界状态校验:

每提交指定数量个区块之后,节点之间会进行最新区块的增量全局世界状态哈希的比对:对于任何一个节点,如满足共识算法要求个数个节点的增量全局世界状态哈希与所述节点的增量全局世界状态哈希一致,所述节点确认所述世界状态校验成功;否则所述节点即为异常节点,所述世界状态校验失败。

由于区块中的交易执行过程中出现问题导致区块执行失败,或与其他多数节点的世界状态哈希不一致,那么便会触发区块的回滚操作。回滚操作后需要保证新的世界状态达成一致,而一旦出现了世界状态被恶意篡改,则按照改用增量哈希之后的hyperchain平台架构,后续执行过程中,虽然能够发现世界状态被篡改,但却无法修复稳定检查点之前的世界状态错误。如图2为世界状态恢复方法,具体为:回滚掉所有和其他节点中不同的区块及其对应的世界状态修改,然后从其他节点拉取被回滚掉的区块。拉取区块的同时,把回滚前第一个与其他节点不同的区块对应的世界状态修改直接从区块来源节点拉取过来,并应用修改。之后重复执行步骤一到步骤三,直到恢复出正确的最新世界状态。

世界状态存储在以leveldb为代表的k-v型数据库中,异常包括恶意用户的恶意潜入造成修改、操作系统或硬件故障造成数据读写异常等。虽然这些修改在没有完备的监控系统的情况下可能很难立即发现,但通过本申请的校验方法,在基于异常的世界状态项产生交易的时候,一定可以及时发现其中的异常,并修复世界状态,以保证前面的异常不会影响整个区块链系统的正常状态。恢复的方法是节点通过向正常节点请求区块和第一个异常区块所对应的正常区块所产生的状态变更,并将其设为对应区块产生的状态变更,所记录的区块对应的状态变更,也就成为与增量哈希相配套的世界状态恢复方法成立的前提。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1