掌桥专利:专业的专利平台
掌桥专利
首页

基于预编译合约的链节点时间同步方法、设备及存储介质

文献发布时间:2024-01-17 01:14:25


基于预编译合约的链节点时间同步方法、设备及存储介质

技术领域

本发明涉及区块链节点时钟同步技术领域,具体涉及一种基于预编译合约的链节点时间同步方法。

背景技术

区块链节点时间是区块链节点正常运行的关键因素,它与出块共识等相关。区块链间节点时间不一致会导致验证难以通过,区块共识等停滞。在公有链中,节点处于公共网络,可以与时间服务器(如window时间服务器)连通,各节点能够同步时间服务器时间,从而达到区块链节点间时钟同步。而对于联盟链,节点大都处于局域网或者内部网络,无法与公共网络通信,故而难以通过时间服务器来使各节点时间同步。因此联盟链区块链节点时钟同步问题亟待解决。在现有方案中,大都依赖于节点所在服务器本地的时钟同步,如将其中一个节点服务器作为时间服务器,其他节点服务器定时同步该服务器时间。该方法不够灵活,也需要额外的工作量来校准时间。此外,在专利《基于网络共识结合VRF算法的区块链节点时间同步方法》中,先对节点分片,在每个分片中通过VRF算法进行提案节点选举,然后利用分片内网络共识得出一个共识后的时间结果,作为该分片对应的系统时间,最后每个分片对应的系统时间再次进行网络共识,得到整个P2P网络最终的系统时间。该方法基于两次的网络同步适于公链但对于联盟链来说过于复杂。

发明内容

本发明提出的一种基于预编译合约的链节点时间同步方法,可解决内部网络中联盟链节点间时间一致性问题。

为实现上述目的,本发明采用了以下技术方案:

一种基于预编译合约的链节点时间同步方法,包括设置链节点时间模块、时间节点管理合约模块和时间同步处理模块;

通过链节点时间模块维护链节点的时间,并对链上提供当前时间查询接口;

通过时间节点管理合约模块,预编译于链上的时间节点管理合约,该合约为节点提供选择/切换时间节点的途径;

通过时间同步处理模块,解决时间节点出现离线故障时切换下一个时间视图里的时间节点问题。

进一步的,所述链节点时间模块包括时间延迟数值设置与维护子模块、节点时间查询子模块;

对于时间延迟数值设置与维护子模块,链节点不再仅使用节点所在服务器时间,而是封装一层时间结构,表示链节点时间;;其中,包含服务器时间和时间延迟数值,即chainTime{now,delay},now表示节点所在服务器时间,delay表示与时间节点的时间延迟;当与时间节点有时间延迟时,需要更新delay,保证链节点时间基本同步;同时,delay数值除了缓存于内存,还需要存储到硬盘,为防止节点重启时delay为0;

节点时间查询子模块,链节点时间模块对链节点提供当前节点时间查询接口,将节点所在服务器时间now与最新同步到的时间延迟delay累加,作为该节点的当前节点时间,提供给该节点的其他模块使用。

进一步的,所述时间节点管理合约模块包括当前时间节点集维护、时间节点指针集合维护、时间节点投票方法和时间节点确定算法;

所述当前时间节点集合维护,通过时间节点管理合约中维护了当前可用时间节点集合availableNodeSet,即联盟链的共识节点集合;所述联盟链的共识节点集合保证了只有共识节点才能作为时间节点参与到链节点的时间同步,以共识节点的活性保障时间节点的活性;

所述时间节点指针集合维护,通过时间节点管理合约中还维护了三个指针,当前时间节点指针currentPointer、切换时间节点指针集合switchPointerMap和切换时间节点提案时间指针timePointer;

当前时间节点指针currentPointer表示当前确定且正在工作的时间节点,指向可用时间节点集合中的节点;

切换时间节点指针集合switchPointerMap维护当前正在被投票的下轮时间节点集合;该集合由map结构构成;节点指针为map的key,指向可用时间节点集合中的节点,节点选票数量为map的value;

切换时间节点提案时间指针timePointer标志着下轮时间节点首次被提案的时间指针,指向第一个调用时间节点投票方法并写入切换时间节点指针集合switchPointerMap第一个项的交易的时间戳和被投票的节点;

所述时间节点投票方法是由各节点调用的,对可用时间节点集中的节点进行投票,来确定下一个时间节点;

最后,根据时间节点确定算法判断切换时间节点指针集合switchPointerMap中是否有时间节点被确定为下一轮时间节点;若已有节点被确定为下轮时间节点,则抛出切换时间节点时间事件。

进一步的,所述时间节点确定算法中包括三个参数:切换时间节点提案时间指针timePointer、可用时间节点集合中节点数量availableNodeNumber和当前调用该合约方法的交易时间戳timestamp;设置到期时间阈值maturity;

若当前合约交易时间戳timestamp减去有切换时间节点的提案时间指针timePointer的差值小于到期时间阈值maturity,则统计切换时间节点指针集合switchPointerMap中各节点的选票,若存在节点的选票超过可用时间节点集合中总节点数的一半,则该节点当选为新轮时间节点;

若差值大于等于到期时间阈值maturity,则检查切换时间节点指针集合switchPointerMap中各节点的选票,选票数量高的当选为时间节点,若存在选票数量相同,则最先被提案的节点当选为时间节点;

所述时间节点确定算法最慢在到期时间阈值maturity后,能决出最新一轮时间节点;决出最新一轮时间节点,更新合约中维护的当前时间节点指针currentPointer。

进一步的,所述时间同步处理模块分为时间节点处理子模块和非时间节点处理子模块;

所述时间节点处理子模块,用于当节点接收到切换时间节点时间事件时,检查本节点是否是切换时间节点时间事件中的确定的下轮时间节点,若是,则向其他节点发送同步时间消息syncNodeMessage{txid,timestamp},其中txid表示切换时间节点提案通过而触发切换时间节点时间事件的交易id,timestamp表示新一轮时间节点的同步时间,通过查询时间节点模块获得;

所述非时间节点处理子模块,对于一直处于同一区块链网络中节点,用于当节点接收到切换时间节点时间事件时,检查本节点是否是切换时间节点时间事件中的确定的下轮时间节点,若不是,则等待接收新轮时间节点的同步时间消息syncNodeMessage;当接收到同步时间消息syncNodeMessage时,验证txid是否真实已上链;验证通过后,比较timestamp与本地服务器时间进行节点时间模块中delay数值的更新,完成时间同步。

进一步的,还包括所述非时间节点处理子模块,对于新加入网络中的节点,会进行链数据的同步,但无法接收到同步时间消息syncNodeMessage;则采取主动询时方式,当完成同步后,查询时间节点管理合约中记录的当前时间节点指针和可用时间节点集合,获取到当前时间节点,然后构造请求时间消息requestTimeMessage{from}并发送给时间节点,其中,from表示请求时间同步节点;若时间节点接收到requestTimeMessage消息,则向该请求时间同步节点发送一次同步时间消息syncNodeMessage{txid,timestamp};请求时间同步节点验证消息syncNodeMessage通过后,更新节点时间模块中的delay数值,完成时间同步。

又一方面,本发明还公开一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如上述方法的步骤。

再一方面,本发明还公开一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如上方法的步骤。

由上述技术方案可知,本发明的基于预编译合约的链节点时间同步方法,主要模块有链节点时间模块、时间节点管理合约模块和时间同步处理模块。进一步地,节点时间模块分为时间延迟数值设置与维护子模块、节点时间查询子模块;时间节点管理合约模块分为当前时间节点集维护、时间节点指针集合维护、时间节点投票方法和时间节点确定算法;时间同步处理模块分为时间节点处理子模块和非时间节点处理子模块。

具体的说,本发明的优点如下:

(1)不改变本地服务器时间,实现区块链节点时间同步;

(2)时间节点切换由多共识节点投票触发,时间节点选择比较灵活;

(3)基于预编译合约实现时钟同步及时间节点切换机制,兼容性强,实现复杂度低。

附图说明

图1为本发明流程框图;

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。

如图1所示,本实施例所述的基于预编译合约的链节点时间同步方法,方案主要模块有链节点时间模块、时间节点管理合约模块和时间同步处理模块。进一步地,节点时间模块分为时间延迟数值设置与维护子模块、节点时间查询子模块;时间节点管理合约模块分为当前时间节点集维护、时间节点指针集合维护、时间节点投票方法和时间节点确定算法;时间同步处理模块分为时间节点处理子模块和非时间节点处理子模块。

以下分别具体说明:

节点时间模块:该模块维护了链节点的时间模块,并对链上提供当前时间查询接口。

时间延迟数值设置与维护子模块,链节点不再仅使用节点所在服务器时间,而是封装一层时间结构,表示表示链节点时间。其中,包含服务器时间和时间延迟数值,即chainTime{now,delay},now表示节点所在服务器时间,delay表示与时间节点的时间延迟。当与时间节点有时间延迟时,需要更新delay,保证链节点时间基本同步。同时,delay数值除了缓存于内存,还需要存储到硬盘,为防止节点重启时delay为0,而实际与时间节点的时间延迟大,导致该节点共识异常。

节点时间查询子模块,节点时间模块对链节点提供当前节点时间查询接口,将节点所在服务器时间now与最新同步到的时间延迟delay累加,作为该节点的当前节点时间,提供给该节点的其他模块(区块打包模块、共识验证模块等)使用。

时间节点管理合约模块:该模块是预编译于链上的时间节点管理合约,该合约主要为节点提供选择/切换时间节点的途径。

可用时间节点集合维护,时间节点管理合约中维护了当前可用时间节点集合(availableNodeSet),即联盟链的共识节点集合。所述联盟链的共识节点集合保证了只有共识节点才能作为时间节点参与到链节点的时间同步,以共识节点的活性保障时间节点的活性。

时间节点指针集合维护,时间节点管理合约中还维护了三个指针,当前时间节点指针(currentPointer)、切换时间节点指针集合(switchPointerMap)和切换时间节点提案时间指针(timePointer)。当前时间节点指针表示当前确定且正在工作的时间节点,指向可用时间节点集合中的节点。切换时间节点指针集合维护当前正在被投票的下轮时间节点集合。该集合由map结构构成。节点指针为map的key,指向可用时间节点集合中的节点,节点选票数量为map的value。举例:若可用时间节点集合availableNodeSet=[“node01”,“node02”,“node03”,“node04”,“node05”],当前时间节点指针currentPointer=“node01”,则切换时间节点指针集合switchPointerMap ={“node02”:[ “node02”, “node04”,“node05”], “node03”: [“node03”]},其表示关于下一轮时间节点的选择,有3个共识节点(“node02”, “node04”, “node05”)支持node02成为下一轮时间节点,有1个共识节点(“node03”)支持node03成为下一轮时间节点。切换时间节点提案时间指针标志着下轮时间节点首次被提案的时间指针,指向第一个调用时间节点投票方法并写入switchPointerMap第一个项的交易的时间戳和被投票的节点。举例交易tx调用了时间节点投票方法,并选择投给node02。执行将node02写入switchPointerMap时,若switchPointerMap为空,则设置切换时间节点提案时间指针timePointer={ tx.timestamp,tx.caller}。tx 表示该笔调用合约方法的交易,tx.timestamp表示该交易的时间戳,tx.caller表示该交易的调用者。

时间节点投票方法,该方法是由各节点调用的,对可用时间节点集中的节点进行投票,来确定下一个时间节点。在该方法中,输入参数是选择的节点,例如:“node02”。方法执行时,首先需要对合约方法的调用者进行检查,检查该合约调用者是否是共识节点,保证了只有共识节点集其中的节点有权限进行投票。然后检查该合约调用者是否重复投票。若不存在重复投票,则根据选择的节点将switchPointerMap中对应项的选票数量增加,即追加投票者。如switchPointerMap ={“node02”: [“node02”, “node04”], “node03”:[“node03”]}修改为switchPointerMap ={“node02”: [ “node02”, “node04”,“node05”], “node03”: [“node03”]}。最后,根据时间节点确定算法判断切换时间节点指针集合switchPointerMap中是否有时间节点被确定为下一轮时间节点。若已有节点被确定为下轮时间节点,则抛出切换时间节点时间事件,如switchNodeEvent{“node02”}。

时间节点确定算法,在该算法中需要三个参数:切换时间节点提案时间指针timePointer、可用时间节点集合中节点数量availableNodeNumber和当前调用该合约方法的交易时间戳timestamp。设置到期时间阈值maturity。若当前合约交易时间戳timestamp减去有切换时间节点的提案时间指针timePointer的差值小于到期时间阈值maturity,则统计切换时间节点指针集合switchPointerMap中各节点的选票,若存在节点的选票超过可用时间节点集合中总节点数的一半,则该节点当选为新轮时间节点。若差值大于等于到期时间阈值maturity,则检查切换时间节点指针集合switchPointerMap中各节点的选票,选票数量高的当选为时间节点,若存在选票数量相同,则最先被提案的节点当选为时间节点。该确定算法最慢在到期时间阈值maturity后,能决出最新一轮时间节点。决出最新一轮时间节点,更新合约中维护的当前时间节点指针(currentPointer)。

时间同步处理模块:该模块主要是解决时间节点出现离线等故障时切换下一个时间视图里的时间节点问题。

时间节点处理子模块,当节点接收到切换时间节点时间事件时,检查本节点是否是切换时间节点时间事件中的确定的下轮时间节点。若是,则向其他节点发送同步时间消息syncNodeMessage{txid,timestamp},其中txidtxid表示切换时间节点提案通过而触发切换时间节点时间事件的交易id,timestamp表示新一轮时间节点的同步时间,通过查询时间节点模块获得。

非时间节点处理子模块,当节点接收到切换时间节点时间事件时,检查本节点是否是切换时间节点时间事件中的确定的下轮时间节点。若不是,则等待接收新轮时间节点的同步时间消息syncNodeMessage。当接收到同步时间消息syncNodeMessage时,验证txid是否真实已上链。验证通过后,比较timestamp与本地服务器时间进行节点时间模块中delay数值的更新,完成时间同步。以上是对于一直处于该区块链网络中节点的处理方法。而对于新加入网络中的节点,会进行链数据的同步,但无法接收到同步时间消息syncNodeMessage。因此,采取主动询时方式。当完成同步后,查询时间节点管理合约中记录的当前时间节点指针和可用时间节点集合,获取到当前时间节点。然后构造请求时间消息requestTimeMessage{from}并发送给时间节点。其中,from表示请求时间同步节点。若时间节点接收到requestTimeMessage消息,则向该请求时间同步节点发送一次同步时间消息syncNodeMessage{txid,timestamp}。请求时间同步节点验证消息syncNodeMessage通过后,更新节点时间模块中的delay数值,完成时间同步。

本发明实施例在运行时,具体步骤如下:

1.用户/合约调用者构造合约交易来调用时间节点管理合约中的时间节点投票方法。

2.节点执行该交易,即执行时间节点投票方法。

3.首先验证交易调用者是否合法,即判断合约调用者是否处于可用时间节点集合中;

4.然后验证验证合约调用者的投票是否合法,即判断合约调用者是否存在重复投票;

5.验证通过,则更新合约状态switchPointerMap和timePointer,增加投票,进行下一步操作。验证不通过,则结束流程。

6.判断该交易时间戳是否与切换时间节点提案时间指针timePointer中的时间差值大于等于到期时间阈值maturity。

7.若是,则决出时间节点,更新合约中的当前时间节点指针(currentPointer)。否则,统计选票能否满足决出时间节点条件。若能,则更新合约中的当前时间节点指针(currentPointer),继续下一步操作;若不能,则结束流程。

8.抛出切换时间节点事件。合约执行结束。

9.节点订阅到切换时间节点事件,首先判断事件中记录的时间节点是否是本地节点。

10.若是本地节点,则节点发送同步时间消息。结束流程。若不是本地节点,则等待接收同步时间消息。

11.若接收到同步时间消息,则更新节点时间模块中的delay数值,完成同步。若没有接收到同步时间消息,则向时间节点发送请求时间消息。接收到回复的同步时间消息后,更新节点时间模块中的delay数值,完成同步。结束流程。

综上所述,本发明实施例的基于预编译合约的链节点时间同步方法可以不改变本地服务器时间,实现区块链节点时间同步;同时,时间节点切换由多共识节点投票触发,时间节点选择比较灵活;本发明的基于预编译合约实现时钟同步及时间节点切换机制,兼容性强,实现复杂度低。

又一方面,本发明还公开一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如上述方法的步骤。

再一方面,本发明还公开一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如上方法的步骤。

在本申请提供的又一实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述实施例中任一基于预编译合约的链节点时间同步方法。

可理解的是,本发明实施例提供的系统与本发明实施例提供的方法相对应,相关内容的解释、举例和有益效果可以参考上述方法中的相应部分。

本申请实施例还提供了一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信,

存储器,用于存放计算机程序;

处理器,用于执行存储器上所存放的程序时,实现上述基于预编译合约的链节点时间同步方法。

上述电子设备提到的通信总线可以是外设部件互连标准(英文:PeripheralComponent Interconnect,简称:PCI)总线或扩展工业标准结构(英文:Extended IndustryStandard Architecture,简称:EISA)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。

通信接口用于上述电子设备与其他设备之间的通信。

存储器可以包括随机存取存储器(英文:Random Access Memory,简称:RAM),也可以包括非易失性存储器(英文:Non-Volatile Memory,简称:NVM),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。

上述的处理器可以是通用处理器,包括中央处理器(英文:Central ProcessingUnit,简称:CPU)、网络处理器(英文:Network Processor,简称:NP)等;还可以是数字信号处理器(英文:Digital Signal Processing,简称:DSP)、专用集成电路(英文:ApplicationSpecific Integrated Circuit,简称:ASIC)、现场可编程门阵列(英文:Field-Programmable Gate Array,简称:FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。

在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘Solid State Disk (SSD))等。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

相关技术
  • 一种存储集群中新增节点的时间同步方法、装置及设备
  • 设备及其时间同步方法和计算机可读存储介质
  • 一种平行链数据同步方法、设备和存储介质
  • 区块链的数据同步方法、装置、计算机设备及存储介质
  • 用于区块链网络的区块生成方法、同步方法、存储介质、计算设备
  • 区块链中轻节点的数据同步方法、节点、存储介质及设备
  • 区块链中轻节点的数据同步方法、节点、存储介质及设备
技术分类

06120116072640