一种区块链上的数据同步方法和系统与流程

文档序号:14188609阅读:380来源:国知局

本发明涉及区块链领域,特别涉及一种区块链上的数据同步方法和系统。



背景技术:

区块链上的数据与智能合约绑定,每个智能合约是一段运行在区块链上程序,具有独立的存储区域。智能合约能够读写属于自己的存储区域内的数据,但无法操作其他智能合约存储区域内的数据。

基于区块链的应用经常需要对数据进行大量的、复杂的查询操作,此类操作难以通过智能合约来实现。为了解决这一问题,可以在业务应用层与区块链之间引入中间件。中间件维护了一个传统的关系型(或非关系型)数据库,以供上层的业务应用进行查询操作。同时,中间件不断地将区块链上的数据同步到数据库中,保证数据库中的数据与区块链上一致。

现有的数据同步方案的总体思路如下:

首先,在智能合约中设计一套用于获取数据的接口。简单结构的数据可以通过接口批量获取。针对复杂的数据类型,需要多个接口配套使用。

然后,同步进程按照一定的规则调用智能合约中的接口,获取数据。对于复杂结构的数据,需要经过多次调用。例如,获取结构体数组类型的数据时,需要先获取其长度,再逐条获取数组的内容。

最后,将获取到的数据写入到业务数据库中。

上述方案具有以下缺点:

智能合约中需要包含大量数据同步接口。这些接口的作用仅仅是为了数据同步,与实际业务逻辑并无关系。这些接口的存在使得智能合约的代码量增大,从而增大了区块链的存储开销。

智能合约中不能包含结构过于复杂的数据。数据结构复杂度的增加,会使相应的数据同步接口的设计变得复杂;智能合约对接口的返回值的数量及类型均有所限制,这导致数据同步的过程中需要多次重复调用接口;每一次对接口的调用,区块链都会启动一次虚拟机,用于执行接口中的逻辑。这带来一定的性能开销。



技术实现要素:

本申请的目的是提供一种区块链上的数据同步方法和系统,解决现有技术中将数据由区块链数据库同步到业务数据库时对于智能合约中接口的高度依赖性,以及这些接口带来的存储开销和性能开销问题。

为解决上述技术问题,本申请提供一种区块链上的数据同步方法,技术方案如下:

中间件获取智能合约对应的数据结构定义;

根据所述数据结构定义中的寻址规则计算出待同步数据在区块链数据库中的地址;

利用所述地址,调用区块链存储区数据获取接口获取所述待同步数据;

将所述待同步数据写入业务数据库。

可选的,所述数据结构定义的生成方式包括:

根据所述智能合约中的基本信息和寻址逻辑规则生成所述数据结构定义;其中,所述数据结构定义包括数据的基本信息和寻址规则。

可选的,所述利用所述地址,调用区块链存储区数据获取接口获取所述待同步数据包括:

利用所述地址,判断所述待同步数据在区块链数据库中的地址是否由指定skip关键字的字段计算得到;

若否,则调用区块链存储区数据获取接口获取所述待同步数据;

若是,则不获取由所述指定skip关键字的字段计算得到的地址对应的待同步数据。

可选的,该方法还包括:

将所述数据结构定义保存在区块链上。

可选的,将所述待同步数据写入业务数据库包括:

根据所述数据结构定义中的所述基本信息将获取的所述待同步数据解析为正确的数据类型;

将解析为正确的数据类型的所述待同步数据写入所述业务数据库。

本申请还提供一种区块链上的数据同步系统,所述系统包括:

获取定义模块,用于中间件获取智能合约对应的数据结构定义;

地址计算模块,用于根据所述数据结构定义中的寻址规则计算出待同步数据在区块链数据库中的地址;

数据获取模块,用于利用所述地址,调用区块链存储区数据获取接口获取所述待同步数据;

数据同步模块,用于将所述待同步数据写入业务数据库。

可选的,该系统还包括:

数据结构定义生成模块,用于根据所述智能合约中的基本信息和寻址逻辑规则生成所述数据结构定义;其中,所述数据结构定义包括数据的基本信息和寻址规则。

可选的,所述数据获取模块包括:

判断子模块,用于利用所述地址,判断所述待同步数据在区块链数据库中的地址是否由指定skip关键字的字段计算得到;

数据获取子模块,用于当所述待同步数据在区块链数据库中的地址不是由指定skip关键字的字段计算得到时,调用区块链存储区数据获取接口获取所述待同步数据;

数据屏蔽子模块,用于当所述待同步数据在区块链数据库中的地址是由指定skip关键字的字段计算得到时,不获取由所述指定skip关键字的字段计算得到的地址对应的待同步数据。

可选的,该系统还包括:

存储模块,用于将所述数据结构定义保存在区块链上。

可选的,所述数据同步模块包括:

数据处理子模块,用于根据所述数据结构定义中的基本信息将获取的所述待同步数据解析为正确的数据类型;

数据写入子模块,用于将解析为正确的数据类型的所述待同步数据写入业务数据库。

本申请提供了一种区块链上的数据同步方法,通过中间件获取智能合约对应的数据结构定义,根据所述数据结构定义中的寻址规则计算出待同步数据在区块链数据库中的地址;调用区块链提供的数据获取接口获取待同步数据,并将获取到的待同步数据转换为正确的格式后存入业务数据库。

显然,本申请避免了调用和在智能合约中编写大量仅用于数据同步的智能合约接口,而且对于复杂结构数据的同步更加方便,提升了区块链性能。本申请还包括一种区块链上的数据同步系统,具有上述有益效果。

附图说明

为了更清楚地说明本申请实施例,下面将对实施例中所需要使用的附图做简单的介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例所提供的一种区块链上的数据同步方法流程图;

图2为本发明实施例所提供的另一种区块链上的数据同步方法流程图;

图3为本发明实施例对应的区块链和中间件的工作关系示意图;

图4为本发明实施例所提供的一种区块链上的数据同步系统示意图。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

请参考图1,图1为本发明实施例所提供的一种区块链上的数据同步方法流程图,技术方案如下:

s101:中间件获取智能合约对应的数据结构定义;

每个需要进行数据同步的智能合约均具有对应的数据结构定义。本实施例在此不对数据结构定义的生成方式及过程作限定,它可以有多种生成方法或生成过程。可以根据所述智能合约中的基本信息和寻址逻辑规则生成所述数据结构定义。例如,在智能合约中,会定义一系列的状态变量。状态变量中的值在智能合约每一次调用结束之后,会被写入区块链数据库。部分状态变量具有复杂的自定义类型,如结构体等。数据结构定义中也可以包含这些自定义类型的结构信息。具体的,对应的生成方式可以如下:

按照智能合约间的引用关系,解析智能合约的源代码;提取智能合约源代码中所有的自定义类型以及状态变量;将上一步得到的信息进行关联与组织,输出数据结构定义。

数据结构定义中包括寻址信息,还可以包括各数据项的基本信息如名称、类型、数据大小等。基本信息的作用是在后续操作中需要根据基本信息的内容对获取到的待同步数据进行类型转换。因此,基本信息中包含和类型转换相关的内容即可,当然也可以含有一些与类型转换无关的基本内容。为了数据同步过程的方便,可以将数据项的基本信息放在数据结构定义中,当然也可以存放其他位置或者直接在初步获取待同步数据后再获取一次对应的数据的基本信息以作数据类型转换使用。本申请在此不限定基本信息的存在形式和存放位置。

寻址规则与智能合约的语言有关。每种智能合约语言在对存储进行读写时,都遵循一定的寻址逻辑规范。不同的智能合约语言对应的寻址规则不完全相同。例如,在solidity语言中,基础类型(如uint、bool、address等)的数据在数据库中紧凑排列,其地址的偏移量依次递增。而对于mapping等复杂结构,其地址依据键进行了哈希计算,散列在数据库中。

数据结构定义可在智能合约编译时由编译器生成,也可以人工对数据结构定义进行编辑,例如可进行屏蔽字段等操作,或者添加附加信息。初步得到的数据结构定义中包含了智能合约中所有的数据,其中也可能包含了业务应用不关心的非关键数据。可以通过定制数据结构定义的内容,屏蔽非关键数据,使其不会被同步。

数据结构定义可以在智能合约编译时由编译器或者其他工具生成基础的数据结构定义,再由人工对基础的数据结构定义进行编辑,例如删除无用信息,或者增加附加信息等。这种生成方式要求提供智能合约的可编译的源代码。当无法提供智能合约的可编译源代码时,数据结构定义还可以直接由人工进行编写。

如果在智能合约中采用了动态或者可扩展的数据结构,可以在后期手动维护其对应的数据结构定义。例如,当智能合约中的数据结构发生变化或需要扩展时,对应的数据结构定义需要重新生成。通常是在旧版本的基础上编辑,然后保存完成数据结构定义的更新。当然也可以有其他方式实现对数据结构定义的更新,本申请在此对更新方式不作限定。

优选的,为了便于中间件获取,数据结构定义可以作为智能合约的附属数据,保存在区块链上;当然也可以但不限定单独保存在其它中心化的服务器上等。

s102:根据所述数据结构定义中的寻址规则计算出待同步数据在区块链数据库中的地址;

中间件可以根据寻址规则,计算出待同步数据在区块链数据库中的地址,即待同步数据在区块链数据库中的存放位置。

s103:利用所述地址,调用区块链存储区数据获取接口获取所述待同步数据;

这里的区块链存储区数据获取接口是区块链自身提供的接口,可以让区块链无需启动虚拟机即可直接调用。

中间件会按照数据结构定义中的内容,逐个字段进行分析。待同步数据中可能会有对业务用户无用的数据。可以通过设置数据结构定义中的关键字屏蔽无用数据。例如,如果该字段没有指定skip关键字,则正常执行所述调用区块链存储区数据获取接口获取所述待同步数据的步骤;如果该字段中指定了skip关键字,则中间件仍会计算该字段的地址,但不会进行后续的同步操作,即不获取由所述指定skip关键字的字段计算得到的地址对应的待同步数据。之所以需要计算地址,是因为后续字段的地址需要基于该字段的地址进行计算。当然还有其他方式实现对无用数据的屏蔽或者对有用数据的筛选,本申请在此不限定其实现方式。

s104:将所述待同步数据写入业务数据库。

因为区块链提供的是数据是二进制的,相同的一段数据,按照不同的数据类型去转换,会得到不同的结果。中间件需要将正确的结果提交给业务数据库。所以在写入业务数据库之前,需要由中间件根据数据的基本信息将获取到的待同步数据转换成正确的数据。转换完成后,中间件将待同步数据写入业务数据库,即映射到业务数据库中各个字段中。

如果有复杂结构的数据需要多次获取,重复上述步骤s102至s104,直至所有数据同步完成。

基于上述技术方案,本申请提供了一种区块链上的数据同步方法,避免了编写和调用大量仅用于数据同步的智能合约接口,对于复杂结构数据的同步更加方便,提升了区块链性能。

实施例二

以下是本申请的第二个实施例,参考图2,图2为本发明实施例所提供的另一种区块链上的数据同步方法流程图,技术方案如下:

s201:生成智能合约对应的数据结构定义。

编辑器先按照以下方法生成基础的数据结构定义;

按照合约间的引用关系,解析合约的源代码;将合约源代码中所有的自定义类型以及状态变量提取出来;将上一步得到的信息进行关联与组织,输出为基础的数据结构定义。

这时获取的数据结构定义包括数据项的基本信息,例如名称,类型,数据长度等等,以及数据的寻址规则。这时还需要人工对基础的数据结构定义进行编译,完整的代码如下所示:

编译器生成的基础数据结构定义中,包括name,但没有skip。因此,人工编辑去除了name,增加了skip,即剔除无用信息和增加附加信息。程序中‘"keys":"field_2_name"’也是由人工手动添加的附加信息,keys也可以由编译器按照特定的规则自动生成。

s202:中间件获取所述数据结构定义,并根据所述数据结构定义中的寻址规则计算出待同步数据在区块链数据库中的地址。

s203:中间件逐个字段分析数据结构定义中的内容,根据地址获取没有被屏蔽的待同步数据。

中间件会按照数据结构定义中的内容,逐个字段进行分析。如果该字段没有指定skip关键字,则正常同步该字段对应地址上的待同步数据;如果指定了skip关键字,即上述代码中的“‘skip’:true”,则再计算出该字段对应地址后不进行后续的数据同步操作。

中间件会调用区块链提供的接口,根据地址获取没有被屏蔽的待同步数据。

s204:将获取到的待同步数据根据数据结构定义中的基本信息解析为正确的数据类型。

初步获取到的待同步数据是二进制类型,需要按照所需类型进行待同步数据类型转换。

s205:将解析后的正确类型的待同步数据写入业务数据库完成数据同步。

中间件将解析后的待同步数据映射到业务数据库的各个字段中。

如果有复杂结构的数据,重复上述步骤s203至s205,直至所有数据同步完成。

参考图3,图3为本实施例对应的数据同步过程中区块链和中间件之间的信息与数据交互的示意图。

中间件负责获取数据结构定义,计算数据的区块链数据库地址,从区块链数据库中读取数据,解析数据和保存数据到业务数据库。

其中,从区块链数据库中读取数据是通过中间件和区块链的信息和数据交互实现的。中间件向区块链发送获取指定地址数据的请求,区块链在收到请求后返回所述指定地址数据,这样完成了从区块链数据库中读取数据的操作。

基于上述技术方案,本申请实施例通过使用数据结构定义获取待同步数据,避免了在智能合约中编写大量仅用于数据同步的接口,减少了智能合约的代码量;还实现了对业务用户无用数据的屏蔽;能够方便地同步复杂结构的数据;无需调用大量智能合约接口,提升了区块链性能。

实施例三

如图4,图4为本申请实施例提供的一种区块链上的数据同步系统示意图,该系统包括:

获取定义模块100,用于中间件获取智能合约对应的数据结构定义;

地址计算模块200,用于根据所述数据结构定义中的寻址规则计算出待同步数据在区块链数据库中的地址;

数据获取模块300,用于利用所述地址,调用区块链存储区数据获取接口获取所述待同步数据;

数据同步模块400,用于将所述待同步数据写入业务数据库。

其中,所述系统还包括:

数据结构定义生成模块,用于按照智能合约间的引用关系,解析所述智能合约对应的源代码;提取所述源代码中的所有的自定义类型及状态变量;关联和组织所述自定义类型及所述状态变量,得到所述数据结构定义。

基于上述实施例,本申请还提供一种区块链上的数据同步系统的实施例,在此实施例中,所述数据获取模块还包括:

判断子模块,用于判断所述待同步数据在区块链数据库中的地址是否由指定skip关键字的字段计算得到;

数据获取子模块,用于当所述待同步数据在区块链数据库中的地址不是由指定skip关键字的字段计算得到时,调用区块链存储区数据获取接口获取所述待同步数据;

数据屏蔽子模块,用于当所述待同步数据在区块链数据库中的地址是由指定skip关键字的字段计算得到时,不获取由所述指定skip关键字的字段计算得到的地址对应的待同步数据。

所述系统还包括:

存储模块,用于将所述数据结构定义保存在区块链上;

所述数据同步模块包括:

数据处理子模块,用于根据所述数据结构定义中的数据基本信息将获取的所述待同步数据解析为正确的数据类型;

数据写入子模块,用于将解析为正确的数据类型的所述待同步数据写入业务数据库。

则对应的工作流程为:

s301:获取定义模块100获取数据结构定义生成子模块生成的数据结构定义;

数据结构定义生成子模块生成数据结构定义的过程可以是根据所述智能合约中的基本信息和寻址逻辑规则生成所述数据结构定义,具体的,生成方式可以如下:

按照合约间的引用关系,解析合约的源代码;将合约源代码中所有的自定义类型以及状态变量提取出来;将上一步得到的信息进行关联与组织,输出为基础的数据结构定义。

数据结构定义中包括各数据项的基本信息如名称、类型等,和各数据项的寻址规则。其中,寻址规则与智能合约的语言有关。每种智能合约语言在对存储进行读写时,都遵循一定的寻址逻辑规范。不同的智能合约语言对应的寻址规则不完全相同。例如,在solidity语言中,基础类型(如uint、bool、address等)的数据在数据库中紧凑排列,其地址的偏移量依次递增。而对于mapping等复杂结构,其地址依据键进行了哈希计算,散列在数据库中。

数据结构定义生成子模块通常包含一个编译器,可在智能合约编译时由编译器生成,也可以不通过编译器人工对基础数据结构定义进行编辑,例如可进行屏蔽字段等操作,或者添加附加信息。初步得到的数据结构定义中包含了智能合约中所有的数据,其中可能包含了业务应用不关心的非关键数据。可以通过定制数据结构定义的内容,屏蔽某些待同步数据,使其不会被同步。例如,如果该字段没有指定skip关键字,则按照正常流程同步该字段。如果该字段中指定了skip关键字,则中间件仍会计算该字段的地址,但不会进行后续的同步操作。之所以需要计算地址,是因为后续字段的地址需要基于该字段的地址进行计算。还可以有其他定制数据结构定义内容的方法,本申请在此不作限定。

如果在智能合约中采用了动态或者可扩展的数据结构,需要在后期手动维护其对应的数据结构定义。例如,当智能合约中的数据结构发生变化或需要扩展时,对应的数据结构定义需要重新生成。通常是在旧版本的基础上编辑,然后保存完成数据结构定义的替换。这个过程可以由存储模块来完成。当然也可以有其他方式实现对数据结构定义的更新,本申请在此对更新方式不作限定。

在所述数据结构定义生成结束之后,存储模块会保存所述数据结构定义。为了便于中间件获取,数据结构定义可以作为智能合约的附属数据,由存储模块直接保存在区块链上;当然也可以但不限定单独保存在其它中心化的服务器上等。

s302:地址计算模块200根据所述数据结构定义的寻址规则计算出待同步数据在区块链数据库中的地址;

s303:数据获取模块300利用所述地址,调用区块链存储区数据获取接口获取所述待同步数据;

这里获取到的待同步数据是二进制的原始数据。此外,在数据获取获取模块中包括一个判断子模块,用于判断所述待同步数据在区块链数据库中的地址是否由指定skip关键字的字段计算得到;若不是,则调用数据获取子模块,执行所述调用区块链存储区数据获取接口获取所述待同步数据的步骤;若是,则调用数据屏蔽子模块,不获取由所述指定skip关键字的字段计算得到的地址对应的待同步数据。

s304:数据同步模块400,用于将所述待同步数据写入业务数据库。

数据同步模块400包括一个数据处理子模块,用于根据所述数据结构定义中的基本信息将获取的所述待同步数据解析为正确的数据类型;

数据写入子模块,用于将解析为正确的数据类型的所述待同步数据写入业务数据库。

因为刚获取的待同步数据是二进制数据,需要通过数据处理子模块根据数据结构定义中的基本信息将其转换为正确的数据类型,再利用数据写入子模块将正确类型的待同步数据写入业务数据库。

如果有复杂结构的数据,重复上述步骤s302至s304,直至所有的数据全部同步到业务数据库。

以上对本申请所提供的一种区块链上的数据同步方法及系统进行了详细介绍。说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以对本申请进行若干改进和修饰,这些改进和修饰也落入本申请权利要求的保护范围内。

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

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