本发明属于区块链技术领域,具体来说涉及一种区块链的回滚方法。
背景技术:
在传统数据库中,管理员拥有对数据库进行任意修改的权限,这意味着数据库中的数据出现异常,管理员一个人就可以实现数据的修正。区块链的本质是一种链式数据库,但是在区块链中,并没有这个管理员,只能实现数据的增和查,不能删和改,想要实现数据修正,必须所有用户同意才可以,所以一旦数据上链,则无法篡改。正是由于区块链的不可篡改性,发生错误很难更正,因此需要一种回滚方法。
但目前区块链的回滚基本等同于分叉,使得一个区块链变为两个互不兼容的区块链。比较经典的例子是以太坊,以太坊回滚后,分叉成了两个区块链,一个是以太坊,一个是以太坊经典。
技术实现要素:
本发明的目的之一在于提供一种区块链的回滚方法,以解决背景技术中现有的区块链在回滚后会发生分叉,且发生不兼容的问题。
为实现上述目的,本发明提供技术方案如下:
一种区块链的回滚方法,所述方法包括以下步骤:
步骤1:区块链中末尾区块的共识领导节点接收任一共识节点或账本节点生成并发送的数据回滚请求后进行校验,若校验通过,对数据回滚请求和共识领导节点地址格式化成回滚结构体后进行签名,将签名后的回滚结构体发送到区块链网络,执行步骤2,否则结束;
步骤2:每一共识节点接收并校验签名后的回滚结构体,若任一共识节点校验通过,则生成赞成票发送到共识网络,执行步骤3,否则不做处理;
步骤3:共识领导节点在预定时间内统计赞成票,若小于预设值,则结束,否则生成回滚类型的区块并保存至本地回滚链中,对本地账本按照区块高度从高到低依次执行回滚操作,发送回滚类型的区块到区块链网络,执行步骤4;
步骤4:任一共识节点或账本节点对回滚类型的区块进行校验,若校验通过,则保存至本地回滚链中,对本地账本按照区块高度从高到低依次执行回滚操作,否则不做处理。
优选地,所述步骤1中,数据回滚请求包括回滚数据、回滚数据的签名,所述回滚数据包括待回滚区块高度、待回滚区块哈希及回滚原因、发送数据回滚请求的账本节点或者共识节点的节点地址。
优选地,所述步骤1中,对数据回滚请求校验包括以下步骤:
步骤1.1:验证回滚数据的签名是否为发送数据回滚请求的账本节点或者共识节点的签名,若是,则执行步骤1.2,否则结束;
步骤1.2:判断待回滚区块高度是否在预先设定的回滚区块高度范围内,若是,执行步骤1.3,否则结束;
步骤1.3:判断回滚原因是否属于预定义类型,若是,执行步骤1.4,否则结束;
步骤1.4:判断待回滚区块哈希是否在待回滚区块高度所对应的区块内,若是,则校验通过,否则校验不通过。
优选地,所述步骤2中,任一共识节点接收并校验签名后的回滚结构体包括以下步骤:
步骤2.1:对数据回滚请求校验,若校验通过,则执行步骤2.2,否则结束;
步骤2.2:判断回滚结构体的签名是否为共识领导节点的签名,若是,则检验通过,否则校验不通过。
优选地,所述步骤2中,任一共识节点生成赞成票包括生成赞成消息,所述赞成消息为预定值,对赞成消息签名形成赞成票。
优选地,所述步骤3中,共识领导节点在预定时间内统计赞成票包括共识领导节点判断赞成票中赞成消息签名是否为发送赞成票的共识节点的签名,若是,则赞成票总数加一,否则不做处理。
优选地,所述回滚类型的区块包括区块头和区块体,所述区块头包括区块类型、区块哈希、区块父哈希、共识节点签名集合、区块高度,所述区块体包括签名后的回滚结构体。
优选地,所述步骤4中,任一共识节点或账本节点对回滚类型的区块进行校验包括以下步骤:
步骤4.1:校验签名后的回滚结构体,若校验通过,执行步骤4.2,否则结束;
步骤4.2:判断区块哈希是否正确,若是,则执行步骤4.3,否则结束;
步骤4.3:判断区块类型是否为回滚类型,若是,则执行步骤4.4,否则结束;
步骤4.4:判断前一回滚类型的区块的区块哈希是否与当前回滚类型的区块的区块父哈希一致,若是,则执行步骤4.5,否则结束;
步骤4.5:判断本地回滚链中的区块高度是否等于回滚区块的高度减1;若是,则校验通过,否则结束。
优选地,同一高度待回滚区块只能回滚一次。
优选地,任一数据回滚请求中的待回滚区块高度大于前一数据回滚请求中的待回滚区块高度。
与现有技术相比,本发明的有益效果为:
本发明可实现区块链回滚后不分叉,不会产生兼容问题,从而提高了系统性能及生产力。
附图说明
图1为本发明的流程图。
具体实施方式
下面将对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
一种区块链的回滚方法,所述方法包括以下步骤:
步骤1:区块链中末尾区块的共识领导节点接收任一共识节点或账本节点生成并发送的数据回滚请求后进行校验,若校验通过,对数据回滚请求和共识领导节点地址格式化成回滚结构体后进行签名,将签名后的回滚结构体发送到区块链网络,执行步骤2,否则结束;
步骤2:每一共识节点接收并校验签名后的回滚结构体,若任一共识节点校验通过,则生成赞成票发送到共识网络,执行步骤3,否则不做处理;
步骤3:共识领导节点在预定时间内统计赞成票,若小于预设值,则结束,否则生成回滚类型的区块并保存至本地回滚链中,对本地账本按照区块高度从高到低依次执行回滚操作,发送回滚类型的区块到区块链网络,执行步骤4;
步骤4:任一共识节点或账本节点对回滚类型的区块进行校验,若校验通过,则保存至本地回滚链中,对本地账本按照区块高度从高到低依次执行回滚操作,否则不做处理。
本发明首先通过共识节点或账本节点生成数据回滚请求,由末尾区块的共识领导节点通过初步校验来确定数据回滚请求的合法性和有效性,然后由所有的共识节点分别校验回滚结构体从而达成数据回滚请求的合法性和有效性的共识:校验通过时生成赞成票,末尾区块的共识领导节点通过统计赞成票来决定是否生成回滚类型的区块并根据回滚类型的区块对本地账本执行回滚操作;末尾区块的共识领导节点生成回滚类型的区块之后会将其向全网广播,任意一个共识节点或者账本节点分别对该回滚类型的区块进行校验,以判断该回滚类型的区块的有效性和合法性,若是,则共识节点或者账本节点会将该回滚类型的区块加入到本地回滚链上,并根据接收到的回滚类型的区块对本地账本执行回滚操作;举例来说,如果账本节点a对回滚类型的区块校验不通过,则账本节点a对自己记载的账本不回滚,但是如果账本节点b对回滚类型的区块校验通过,则账本节点b根据该回滚类型的区块来对自己记载的账本进行回滚。
需要说明的是,本发明步骤4中,任一共识节点或者账本节点的本地账本基于接收的回滚类型的区块执行回滚操作,而不是基于共识领导节点的本地账本对自己存储的本地账本进行回滚;当步骤4中存在共识节点或账本节点对回滚类型的区块校验不通过,则认为该共识节点或账本节点存在严重错误,已经不能正常共识了,需要对该节点进行区块链重置。
本发明中,所述回滚结构体为对数据回滚请求和共识领导节点地址进行格式化后的数据列表,此为本领域普通技术人员的公知常识。
本发明中,所述区块链网络包括共识节点和账本节点,共识节点和账本节点均存储有本地账本和本地回滚链;所述共识领导节点为所有共识节点中对当前区块具有记账权的共识节点,每个区块所对应的共识领导节点有且仅有一个,且不同区块的共识领导节点可能相同也可能不同,此为本领域公知常识。需要说明的是,所述区块链网络包括但不限于共识节点和账本节点,还可以包括轻节点等其它节点,且共识节点间进行数据传输形成共识网络;此为本领域公知常识,本领域技术人员可根据实际情况自行设置。
这里应当说明的是,每一共识节点或者账本节点都有各自不同的公私钥对,且每一共识节点或者账本节点都仅有一公私钥对,此为本领域的公知常识。
本发明中,当任意一个共识节点或者账本节点发现需要回滚前一段时间事物数据时,会生成数据回滚请求并发送到区块链网络中,区块链网络中共识节点识别到共识节点或者账本节点发送的内容为数据回滚请求后进行接收并向其他共识节点或者账本节点广播,账本节点识别到该数据回滚请求后不进行接收,共识领导节点接收到该数据回滚请求后即进行校验;所述需要回滚前一段时间数据的原因包括大额的错误转账或者重要数据上传错误,具体鉴定可以由dpos共识委员会线下鉴定,此为本领域公知常识。
所述步骤1中,数据回滚请求包括回滚数据、回滚数据的签名,所述回滚数据包括待回滚区块高度、待回滚区块哈希及回滚原因、发送数据回滚请求的账本节点或者共识节点的节点地址。
所述步骤1中,对数据回滚请求校验包括以下步骤:
步骤1.1:验证回滚数据的签名是否为发送数据回滚请求的账本节点或者共识节点的签名,若是,则执行步骤1.2,否则结束;
步骤1.2:判断待回滚区块高度是否在预先设定的回滚区块高度范围内,若是,执行步骤1.3,否则结束;
步骤1.3:判断回滚原因是否属于预定义类型,若是,执行步骤1.4,否则结束;
步骤1.4:判断待回滚区块哈希是否在待回滚区块高度所对应的区块内,若是,则校验通过,否则校验不通过。
本发明中,通过回滚原因确定区块链中的区块是否需要回滚;由于区块链回滚是基于区块链中区块所记载的信息发生错误需要对区块进行修改的行为,因此在进行回滚前首先需要确定待回滚区块,通过待回滚区块高度可初步确定发生数据错误的区块在区块链中的位置,虽然一个单一的区块总是会有一个明确的、固定的区块高度,但反过来却并不成立,一个区块高度并不总是识别一个单一的区块。两个或两个以上的区块可能有相同的区块高度,在区块链里争夺同一位置,因此区块高度并不是唯一的标识符,本发明通过待回滚区块哈希进一步验证待回滚区块高度所对应的区块是否为待回滚区块,保证区块回滚的可靠性。
作为本发明的其中一具体实施方式,所述回滚数据签名包括以下过程:共识节点或者账本节点将回滚数据进行哈希计算后得到哈希值,将哈希值作为参数利用私钥进行计算后得到的即为签名,此为本领域普通技术人员的常规手段。对应的步骤1.1的其中一个具体实施方式为:共识领导节点将接受到的回滚数据进行哈希计算得到哈希值;共识领导节点调用发送到该数据回滚请求的节点的公钥,回滚数据签名利用该公钥进行解密,得到解密结果,判断哈希值和解密结果是否一致,若一致,则认为该数据回滚请求中的回滚数据签名为对应的账本节点或者共识节点针对该回滚数据签署的,且回滚数据没有被篡改,否则认为该回滚数据发生错误,不在对该数据回滚请求进行处理。
本发明通过执行步骤1.2和1.3判断数据回滚请求是否符合区块链回滚的条件:步骤1.2中,如定义只有区块链最后的10个区块可以接受回滚请求,那么从后往前第11个区块就不符合区块回滚的条件;步骤1.3中,所述回滚原因可以由开发者具体进行设定,若回滚原因不属于预先设定的类型,就认为该回滚数据请求不符合区块链回滚的条件,否则通过步骤1.4检验待回滚区块在区块链中的具体位置。
所述步骤2中,任一共识节点接收并校验签名后的回滚结构体包括以下步骤:
步骤2.1:对数据回滚请求校验,若校验通过,则执行步骤2.2,否则结束;
步骤2.2:判断回滚结构体的签名是否为共识领导节点的签名,若是,则检验通过,否则校验不通过。
所述步骤2中,任一共识节点生成赞成票包括生成赞成消息,所述赞成消息为预定值,对赞成消息签名形成赞成票。
所述步骤3中,共识领导节点在预定时间内统计赞成票包括共识领导节点判断赞成票中赞成消息签名是否为发送赞成票的共识节点的签名,若是,则赞成票总数加一,否则不做处理。
本发明中,每一个共识节点都需要对数据回滚请求进行校验以确定数据回滚请求的有效性和合法性,任一共识节点对数据回滚请求校验不成功,该共识节点就认为该数据回滚请求是不合法且无效的,就不再对该数据回滚请求做其他处理,若任一共识节点对数据回滚请求校验成功,就说明该数据回滚请求是合法和有效的,然后该共识节点会进一步验证回滚结构体的签名是否为共识领导节点签名,若是,则说明回滚结构体的签名是共识领导节点针对该回滚结构体签署的,该回滚结构体未被篡改。
作为本发明的其中一具体实施方式,所述对回滚结构体签名过程如下:共识领导节点将回滚结构体进行哈希计算后得到哈希值,将该哈希值通过共识领导节点的私钥进行加密后得到的即为回滚结构体的签名;对应的所述步骤2.2的具体实施方式为,任一共识节点对回滚结构体进行哈希计算后得到哈希值,该共识节点调用共识领导节点的公钥,利用该公钥对回滚结构体的签名进行解密后得到解密结果,判断哈希值和解密结果是否一致,若一致,则说明该签名后的回滚结构体是由共识领导节点针对该回滚结构体发出的,该回滚结构体没有被篡改。
本发明中,为防止赞成消息被篡改,对赞成消息进行签名后形成赞成票发送到区块链网络,由共识领导节点接收后进行统计。需要说明的是,所述赞成消息为开发者预先定义的值,举例来说,若开发预先定义赞成消息为“赞成”两字,则不同的共识节点生成的赞成消息均为“赞成”两字,此为本领域公知常识,本领域技术人员可根据实际情况自行设置。
本发明中,共识领导节点通过统计共识节点发送的赞成票来判断区块链中的共识节点是否达成共识,若达成共识,则共识领导节点会将签名后的回滚结构体打包成回滚类型的区块并添加到本地回滚链中,然后对本地账本进行回滚操作,同时共识领导节点还要将该回滚类型的区块发送到区块链网络。本发明步骤3中,赞成票总数的预设值一般为预定时间内上线的所有的共识节点的2/3,此为本领域的公知常识。
所述回滚类型的区块包括区块头和区块体,所述区块头包括区块类型、区块哈希、区块父哈希、共识节点签名集合、区块高度,所述区块体包括签名后的回滚结构体。
本发明中,所述区块类型用于标记该区块为回滚类型;所述区块哈希为共识领导节点对区块体进行哈希计算后得到的哈希值;所述区块父哈希为回滚链中前一回滚类型的区块的区块哈希;所述共识节点签名集合为所有发送赞成票的共识节点的签名。
本发明中,所述添加到本地回滚链中为将该回滚类型的区块加入到本地回滚链中的最后一回滚类型的区块之后,此为本领域普通技术人员的公知常识。需要说明的是,若生成的是第一个回滚类型的区块,那么该回滚类型的区块就是创世区块,其引用的前一回滚类型的区块的哈希(也即第一个回滚类型的区块的父哈希)为空,此为本领域普通技术人员的公知常识。
本发明中,节点地址用于进行身份标记,表示该签名是由对应的节点进行发出的,举例来说,共识领导节点地址可以确定共识领导节点的公钥,当共识节点使用共识领导节点的公钥对回滚结构体的签名解密失败时,则共识节点可就认为该回滚结构体的签名不是共识领导节点的,该签名后的回滚结构体无效。
所述步骤4中,任一共识节点或账本节点对回滚类型的区块进行校验包括以下步骤:
步骤4.1:校验签名后的回滚结构体,若校验通过,执行步骤4.2,否则结束;
步骤4.2:判断区块哈希是否正确,若是,则执行步骤4.3,否则结束;
步骤4.3:判断区块类型是否为回滚类型,若是,则执行步骤4.4,否则结束;
步骤4.4:判断前一回滚类型的区块的区块哈希是否与当前回滚类型的区块的区块父哈希一致,若是,则执行步骤4.5,否则结束;
步骤4.5:判断本地回滚链中的区块高度是否等于接收的回滚类型的区块的高度减1;若是,则校验通过,否则结束。
本发明中,共识节点或者账本节点对回滚类型的区块验证通过后,就将该回滚类型的区块添加到回滚链中,同时对本地数据库中的区块链执行回滚操作,即删除本地账本中待回滚的区块及待回滚的区块之后的所有区块。
本发明中,共识节点或者账本节点在接收到回滚类型的区块后,需要确定该回滚类型的区块的区块体中的内容是否被篡改且区块体中的内容是否合法有效,也即执行步骤4.1,所述步骤4.1的校验步骤与步骤2中对签名后的回滚结构体的校验步骤一致;通过执行步骤4.2判断该回滚类型的区块哈希是否计算错误,提高回滚链的可靠性;如何验证回滚类型的区块的区块哈希为本领域的的公知常识,本领域普通技术人员可根据实际情况自行设置。本发明中,任一回滚类型的区块中会记载前一回滚类型的区块的区块哈希,即父哈希,此为本领域普通技术人员的公知常识;步骤4.4中,通过检验父哈希的一致性以确保回滚类型的区块的正确性,初步确定本地回滚链没有被篡改;举例来说,若一个区块高度为50的回滚类型的区块中记载有前一回滚类型的区块的区块父哈希为a,那么追溯到区块高度为49的回滚类型的区块,若该区块哈希为a,则该共识节点认为本地回滚链没有被篡改,否则,认为被篡改;通过执行步骤4.5进一步确定本地回滚链没有被篡改。
同一高度待回滚区块只能回滚一次。
作为本发明的其中一具体实施方式,在执行步骤2.1之后,判断数据回滚请求中待回滚区块高度所对应的区块是否已经执行过数据回滚,若是,则结束,否则执行步骤2.2。
本发明中,通过设置同一区块的回滚次数,防止区块链中同一区块重复回滚导致区块链中区块数据重复更改,区块链中新区块上链发生错误的问题。
任一数据回滚请求中的待回滚区块高度大于前一数据回滚请求中的待回滚区块高度。
举例来说,如果第一次回滚的主链中的区块高度为18,则第二次回滚的主链中的区块不可以回滚到17。
本发明中,通过判断当前数据回滚请求与前一数据回滚请求中的待回滚区块高度防止区块恶意回滚。
1.一种区块链的回滚方法,其特征在于,所述方法包括以下步骤:
步骤1:区块链中末尾区块的共识领导节点接收任一共识节点或账本节点生成并发送的数据回滚请求后进行校验,若校验通过,对数据回滚请求和共识领导节点地址格式化成回滚结构体后进行签名,将签名后的回滚结构体发送到区块链网络,执行步骤2,否则结束;
步骤2:每一共识节点接收并校验签名后的回滚结构体,若任一共识节点校验通过,则生成赞成票发送到共识网络,执行步骤3,否则不做处理;
步骤3:共识领导节点在预定时间内统计赞成票,若小于预设值,则结束,否则生成回滚类型的区块并保存至本地回滚链中,对本地账本按照区块高度从高到低依次执行回滚操作,发送回滚类型的区块到区块链网络,执行步骤4;
步骤4:任一共识节点或账本节点对回滚类型的区块进行校验,若校验通过,则保存至本地回滚链中,对本地账本按照区块高度从高到低依次执行回滚操作,否则不做处理。
2.如权利要求1所述的一种区块链的回滚方法,其特征在于,所述步骤1中,数据回滚请求包括回滚数据、回滚数据的签名,所述回滚数据包括待回滚区块高度、待回滚区块哈希及回滚原因、发送数据回滚请求的账本节点或者共识节点的节点地址。
3.如权利要求2所述的一种区块链的回滚方法,其特征在于,所述步骤1中,对数据回滚请求校验包括以下步骤:
步骤1.1:验证回滚数据的签名是否为发送数据回滚请求的账本节点或者共识节点的签名,若是,则执行步骤1.2,否则结束;
步骤1.2:判断待回滚区块高度是否在预先设定的回滚区块高度范围内,若是,执行步骤1.3,否则结束;
步骤1.3:判断回滚原因是否属于预定义类型,若是,执行步骤1.4,否则结束;
步骤1.4:判断待回滚区块哈希是否在待回滚区块高度所对应的区块内,若是,则校验通过,否则校验不通过。
4.如权利要求3所述的一种区块链的回滚方法,其特征在于,所述步骤2中,任一共识节点接收并校验签名后的回滚结构体包括以下步骤:
步骤2.1:对数据回滚请求校验,若校验通过,则执行步骤2.2,否则结束;
步骤2.2:判断回滚结构体的签名是否为共识领导节点的签名,若是,则检验通过,否则校验不通过。
5.如权利要求3所述的一种区块链的回滚方法,其特征在于,所述步骤2中,任一共识节点生成赞成票包括生成赞成消息,所述赞成消息为预定值,对赞成消息签名形成赞成票。
6.如权利要求5所述的一种区块链的回滚方法,其特征在于,所述步骤3中,共识领导节点在预定时间内统计赞成票包括共识领导节点判断赞成票中赞成消息签名是否为发送赞成票的共识节点的签名,若是,则赞成票总数加一,否则不做处理。
7.如权利要求1所述的一种区块链的回滚方法,其特征在于,所述回滚类型的区块包括区块头和区块体,所述区块头包括区块类型、区块哈希、区块父哈希、共识节点签名集合、区块高度,所述区块体包括签名后的回滚结构体。
8.如权利要求7所述的一种区块链的回滚方法,其特征在于,所述步骤4中,任一共识节点或账本节点对回滚类型的区块进行校验包括以下步骤:
步骤4.1:校验签名后的回滚结构体,若校验通过,执行步骤4.2,否则结束;
步骤4.2:判断区块哈希是否正确,若是,则执行步骤4.3,否则结束;
步骤4.3:判断区块类型是否为回滚类型,若是,则执行步骤4.4,否则结束;
步骤4.4:判断前一回滚类型的区块的区块哈希是否与当前回滚类型的区块的区块父哈希一致,若是,则执行步骤4.5,否则结束;
步骤4.5:判断本地回滚链中的区块高度是否等于接收的回滚类型区块的高度减1;若是,则校验通过,否则结束。
9.如权利要求1所述的一种区块链回滚的方法,其特征在于,同一高度的待回滚区块只能回滚一次。
10.如权利要求1所述的一种区块链回滚的方法,其特征在于,任一数据回滚请求中的待回滚区块高度大于前一数据回滚请求中的待回滚区块高度。
技术总结