发明内容
针对上述问题,本发明的目的在于提供一种面向区块链的动态哈希计算方法、装置、节点及存储介质,实现了根据区块的高度动态生成哈希算法,从而保证运算过程的安全。
本发明实施例提供了一种面向区块链的动态哈希计算方法,包括如下步骤:
获取待进行哈希的对象以及待生成的区块的高度;
将所述高度转为字节,并对所述字节进行哈希运算,得到a位的第一字节数组;
根据预设的运行次数m,对所述第一字节数组的前m位进行取n模计算,得到m位的第二字节数组;其中,n为预设的哈希算法的种类数;
根据第二字节数组中的每位数字对应的哈希算法以及数字的顺序,调用相应的哈希算法对待进行哈希的对象进行哈希计算,以根据计算结果判断是否能够生成该区块。
优选地,所述n为11。
优选地,定义A~K分别于11中哈希函数一一对应;并定义0~10分别对应A~K;
则所述根据第二字节数组中的每位数字对应的哈希算法以及数字的顺序,调用相应的哈希算法对待进行哈希的对象进行哈希计算,以根据计算结果判断是否能够生成该区块,具体为:
根据所述第二字节数组中的每位数字对应生成包括m个字母的字母数组;
获取与字母数组中的每个字母相应的m个哈希函数;
根据m个哈希函数构成m重的复合哈希函数对待进行哈希的对象进行哈希计算,以根据计算结果判断是否能够生成该区块。
优选地,所述待进行哈希的对象为待生成的区块的区块头,且该对象包含一个随运算次数变化的nonce值。
优选地,所述将所述高度转为字节,并对所述字节进行哈希运算,得到a位的第一字节数组,具体为:
将所述高度中包含的各个数字转换为二进制,再根据转换后的二进制生成字节;
采用SHA256对所述字节进行哈希计算,得到对应的哈希值;
将所述哈希值转换为10进制的具有32位的第一字节数组。
本发明实施例提供了一种面向区块链的动态哈希计算装置,包括:
获取单元,用于获取待进行哈希的对象以及待生成的区块的高度;
第一字节数组计算单元,用于将所述高度转为字节,并对所述字节进行哈希运算,得到a位的第一字节数组;
第二字节数组计算单元,用于根据预设的运行次数m,对所述第一字节数组的前m位进行取n模计算,得到m位的第二字节数组;其中,n为预设的哈希算法的种类数;
哈希计算单元,用于根据第二字节数组中的每位数字对应的哈希算法以及数字的顺序,调用相应的哈希算法对待进行哈希的对象进行哈希计算,以根据计算结果判断是否能够生成该区块。
优选地,所述n为11。
优选地,定义A~K分别于11中哈希函数一一对应;并定义0~10分别对应A~K;
则所述哈希计算单元具体包括:
字母数组生成模块,用于根据所述第二字节数组中的每位数字对应生成包括m个字母的字母数组;
哈希函数获取模块,用于获取与字母数组中的每个字母相应的m个哈希函数;
哈希计算模块,用于根据m个哈希函数构成m重的复合哈希函数对待进行哈希的对象进行哈希计算,以根据计算结果判断是否能够生成该区块。
本发明实施例还提供了一种面向区块链的动态哈希计算节点,包括处理器、存储器以及存储在所述存储器中且被配置为由所述处理器执行的计算机程序,所述处理器执行所述计算机程序时实现如上述的面向区块链的动态哈希计算方法。
本发明实施例还提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质包括存储的计算机程序,其中,在所述计算机程序运行时控制所述计算机可读存储介质所在设备执行如上述的面向区块链的动态哈希计算方法。
本发明实施例提供的面向区块链的动态哈希计算方法、装置、节点及计算机可读存储介质,能根据当前区块的高度提供动态的,随机的,多样化的哈希函数使用方法,一方面,实现枚举过程动态适应区块的高度,缩短运算时时间,从而节约能源;另一方面,由于哈希过程是适应区块的高度动态变化的,可以进一步提高运算的安全问题,尽可能避免51%攻击的问题。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
对本发明进行进一步详细说明之前,对本发明实施例中涉及的名词和术语进行说明。
代币,本发明实施例中指加密互联网货币,是以密码学为基础的分布式数字货币,包括比特币、以太币、莱特币以及其他类似的衍生币种。
区块(Block)是一个存储单元,各个区块之间通过随机散列(也称哈希算法)实现链接(chain),后一个区块的区块头(区块的头部)包含前一个区块的哈希值,从而实现区块与区块相继接续,形成区块链。
如图1所示,比特币的区块由区块头及该区块所包含的交易列表组成。区块头的大小为80字节,由4字节的版本号、32字节的上一个区块的散列值、32字节的Merkle RootHash(通过Merkle Tree算法对区块包含的交易列表处理生成)、4字节的时间缀(当前时间)、4字节的当前难度值、4字节的随机数组成。区块包含的交易列表则附加在区块头后面,其中的第一笔交易是coinbase交易,这是一笔为了让矿工获得奖励及手续费的特殊交易。
难度值,难度值(difficulty)是矿工们在挖矿时候的重要参考指标,它决定了矿工大约需要经过多少次哈希运算才能产生一个合法的区块。比特币的区块大约每10分钟生成一个,如果要在不同的全网算力条件下,新区块的产生保持都基本这个速率,难度值必须根据全网算力的变化进行调整。简单地说,难度值被设定在无论挖矿能力如何,新区块产生速率都保持在10分钟一个。难度的调整是在每个完整节点中独立自动发生的。每2016个区块,所有节点都会按统一的公式自动调整难度,这个公式是由最新2016个区块的花费时长与期望时长(期望时长为20160分钟即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。
这个公式可以总结为如下形式:
新难度值=旧难度值*(过去2016个区块花费时长/20160分钟)
工作量证明需要有一个目标值。比特币工作量证明的目标值(Target)的计算公式如下:
目标值=最大目标值/难度值其中最大目标值为一个恒定值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目标值的大小与难度值成反比。比特币工作量证明的达成就是矿工计算出来的区块哈希值必须小于目标值。
工作量证明过程,节点通过不停的变更区块头中的随机数(即nonce的数值),并对每次变更后的的区块头做双重SHA运算(即SHA(SHA(Block_Header))),将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成。其中,在不同的区块中,为了安全,采用的SHA函数是不同的。
区块链(Blockchain),多个节点通过一串使用密码学方法相关联产生区块,区块采用“区块头+区块体”的结构,区块头中用于验证记录数据的有效性的数据、以及前一个区块的索引数据,区块体中包含了一定时间内的记录数据。
从功能结构上讲,区块链是一群分散的节点运行的分布式数据库,用以存储各种记录数据如虚拟货币交易的记录数据。从数据结构层面上讲,区块链中包括一系列的区块,新区块一旦加入到区块链中就不会再被移走,区块中包含了记录数据,用于验证记录数据的有效性(防伪)和生成下一个区块。
以比特币为例,比特币的交易依赖于运行区块链中节点的确认,当比特币交易被一节点首次确认时,对应的交易清单被添加到区块链中的最新区块,该交易被区块链网络中的其他节点继续确认免交易重复,当在足够的区块中得到确认(也就是在区块记录数据该交易)时交易得到最终确认,此时交易不可逆转。
51%攻击,所谓51%攻击,就是利用比特币使用算力作为竞争条件的特点,使用算力优势撤销自己已经发生的付款交易。如果有人掌握了50%以上的算力,他能够比其他人更快地找到开采区块需要的那个随机数,因此他实际上拥有了绝对哪个一区块的有效权利。
通过上面的介绍我们可以知道,在工作量证明过程中,节点会对每次nonce值变更后的的区块头做双重SHA运算(即SHA(SHA(Block_Header)),而根据在背景技术中的介绍,依靠枚举式哈希计算,一方面,枚举过程不能动态适应区块的高度,造成运算时时间的加长,从而能源消耗大。另一方面,采用固定的哈稀函数,一定程度上不能适应区块的的动态变化,同时,哈稀函数调用顺序的固定,也存在一定的安全问题。
本发明即是针对该过程进行改进。
请参阅图2,本发明第一实施例提供了一种面向区块链的动态哈希计算方法,包括如下步骤:
S101,获取待进行哈希的对象以及待生成的区块的高度。
在本实施例中,待进行哈希的对象即是待生成区块的区块头,其中,区块头中的nonce值会根据运算次数变化。待生成的区块的高度即是当前生成的区块的序号,例如,一个区块的高度为28937,则说明该区块是第28937个生成的区块。
S102,将所述高度转为字节,并对所述字节进行哈希运算,得到a位的第一字节数组。
如图3所示,假设区块的高度为28937,其2进制表示为是0111000100001001,前8位01110001转成10进制就是113,后8位00001001转成10进制就是9,则将28937转为字节后可生成字节1139。
接着,对该字节进行哈希运算(采用SHA256哈希函数),可生成64位的哈希值,再将该64位的哈希值转换为10进制,就可以得到相应的32位的第一字节数组。
其中,对于1139,其对于的32位的第一字节数组表示为[140 37 99 223 252 18914 204…]。
S102,根据预设的运行次数m,对所述第一字节数组的前m位进行取n模计算,得到m位的第二字节数组;其中,n为预设的哈希算法的种类数。
在本实施例中,运行次数m为大于1的整数,其可根据实际需要进行指定,例如,在本实施例中,指定运行次数m为7,则对所述第一字节数组的前7位进行取n模计算,得到包括m个数字的第二字节数组;其中,n为预设的哈希算法的种类数。当然,需要理解的是,m也可取其他值,如取3,5,9等数值,本发明不做具体限定。
在本实施例中,n可为11,其对应11种不同的哈希算法,当然,应当理解的是,n可以根据实际需要取其他值,例如,如果新开发了不同的哈希算法,可以相应增加n的值,或者可以不需要采用所有的哈希算法,可以相应减少n的值,这些方案仅在本发明的保护范围之内。
在本实施例中,对于m取7,而n取11的情况,相应得到的第二字节数组为[8,4,0,3,10,2,3]。
S103,根据第二字节数组中的每位数字对应的哈希算法以及数字的顺序,调用相应的哈希算法对待进行哈希的对象进行哈希计算,以根据计算结果判断是否能够生成该区块。
具体地,本实施例中,定义A~K分别于11种哈希函数一一对应;并定义0~10分别对应A~K;
则S103具体包括:
S1031,根据所述第二字节数组中的每位数字对应生成包括m个字母的字母数组。
其中,所述字母数组为[I,E,A,D,K,C,D]。
S1032,获取与字母数组中的每个字母相应的m个哈希函数。
S1033,根根据m个哈希函数构成m重的复合哈希函数对待进行哈希的对象进行哈希计算,以根据计算结果判断是否能够生成该区块。
其中,m重的复合哈希函数可表示为res=D(C(K(D(A(E(I(对象)))))))。即需要对对象(区块头)进行七重哈希运算,每重哈希对象的输入为上一重哈希运算输出的哈希值。
综上所述,本发明实施例提供的面向区块链的动态哈希计算方法,能根据当前区块的高度提供动态的,随机的,多样化的哈希函数使用方法,一方面,实现枚举过程动态适应区块的高度,缩短运算时时间,从而节约能源;另一方面,由于哈希过程是适应区块的高度动态变化的,可以进一步提高运算的安全问题,尽可能避免51%攻击的问题。
请参阅图3,本发明第二实施例提供了一种面向区块链的动态哈希计算装置,包括:
获取单元10,用于获取待进行哈希的对象以及待生成的区块的高度;
第一字节数组计算单元20,用于将所述高度转为字节,并对所述字节进行哈希运算,得到a位的第一字节数组;
第二字节数组计算单元30,用于根据预设的运行次数m,对所述第一字节数组的前m位进行取n模计算,得到m位的第二字节数组;其中,n为预设的哈希算法的种类数;
哈希计算单元40,用于根据第二字节数组中的每位数字对应的哈希算法以及数字的顺序,调用相应的哈希算法对待进行哈希的对象进行哈希计算,以根据计算结果判断是否能够生成该区块。
优选地,所述n为11。
请参阅图4,优选地,定义A~K分别于11中哈希函数一一对应;并定义0~10分别对应A~K;
则所述哈希计算单元40具体包括:
字母数组生成模块,用于根据所述第二字节数组中的每位数字对应生成包括m个字母的字母数组;
哈希函数获取模块,用于获取与字母数组中的每个字母相应的m个哈希函数;
哈希计算模块,用于根据m个哈希函数构成m重的复合哈希函数对待进行哈希的对象进行哈希计算,以根据计算结果判断是否能够生成该区块。
优选地,所述第一字节数组计算单元20具体包括:
字节转换模块,用于将所述高度中包含的各个数字转换为二进制,再根据转换后的二进制生成字节;
哈希模块,用于采用SHA256对所述字节进行哈希计算,得到对应的哈希值;
第一字节数组生成模块,用于将所述哈希值转换为10进制的具有32位的第一字节数组。
本发明实施例提供的面向区块链的动态哈希计算装置,能根据当前区块的高度提供动态的,随机的,多样化的哈希函数使用方法,一方面,实现枚举过程动态适应区块的高度,缩短运算时时间,从而节约能源;另一方面,由于哈希过程是适应区块的高度动态变化的,可以进一步提高运算的安全问题,尽可能避免51%攻击的问题。
本发明第三实施例提供了一种面向区块链的动态哈希计算节点,包括处理器、存储器以及存储在所述存储器中且被配置为由所述处理器执行的计算机程序,所述处理器执行所述计算机程序时实现如上述的面向区块链的动态哈希计算方法。
本发明第四实施例一种计算机可读存储介质,存储有可执行代码,其中,所述可执行代码经配置为被至少一个处理器执行,以实现上述任一实施例所述的面向区块链的动态哈希计算方法。
示例性的,所述计算机程序可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器中,并由所述处理器执行,以完成本发明。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述所述计算机程序在所述面向区块链的动态哈希计算节点中的执行过程。
所述面向区块链的动态哈希计算节点可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。所述面向区块链的动态哈希计算节点可包括,但不仅限于,处理器、存储器。本领域技术人员可以理解,上述部件仅仅是面向区块链的动态哈希计算节点的示例,并不构成对面向区块链的动态哈希计算节点的限定,可以包括比上述更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述面向区块链的动态哈希计算节点还可以包括输入输出设备、网络接入设备、总线等。
所称处理器可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,所述处理器是所述面向区块链的动态哈希计算节点的控制中心,利用各种接口和线路连接整个面向区块链的动态哈希计算节点的各个部分。
所述存储器可用于存储所述计算机程序和/或模块,所述处理器通过运行或执行存储在所述存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现所述面向区块链的动态哈希计算节点的各种功能。所述存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(SecureDigital,SD)卡,闪存卡(Flash Card)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
其中,所述面向区块链的动态哈希计算节点集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
需说明的是,以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。另外,本发明提供的装置实施例附图中,模块之间的连接关系表示它们之间具有通信连接,具体可以实现为一条或多条通信总线或信号线。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。