基于区块链实现支持多种数据库的方法及设备
技术领域
本公开内容属于区块链技术领域,尤其涉及一种基于区块链实现支持多种数据库的方法以及一种基于区块链实现支持多种数据库的设备。
背景技术
区块链(Blockchain)技术是利用分布式节点共识算法来生成和更新数据的分布式账本,利由密码学串接并保护内容不被篡改,用以串连交易记录(又称区块,允许多个交易产生一个区块)。每一个区块包含了前一个区块的加密哈希、相应时间戳记以及交易数据。这样的设计使得区块内容具有难以篡改的特性。由区块链所串接的分布式账本能让多方有效记录交易,且可永久查验此交易。
数据库是一个存放数据的仓库,这种仓库是按照一定的数据结构(也即,数据的组织形式或数据之间的联系)来组织和存储。可以通过数据库提供的多种方法(添加、删除、检索、更新)来管理数据库里的数据,能供多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
持久化存储是区块链技术中重要的技术环节,也是最底层的技术。区块链节点启动时,需要从保存在磁盘上的数据库中读取以往区块,为区块同步做准备;区块链应用各区块链节点达成共识后,要写入数据库,方能将共识的结果固化下来;存储层的性能容量对区块链整体性能容量有重大影响。现有的开源区块链项目,例如,比特币(BTC)、以太坊(Ethereum)等均只采用一种数据库,例如,LevelDB(LevelDB属于非关系型键值型(Key-Value)数据库)。
区块链浏览器是浏览区块链信息的主要窗口,通过主动调用区块链服务的接口,查询需要的数据信息,从而记录了每一个区块的产生过程和区块中交易的内容,每一个区块所记载的内容都可以从区块链浏览器上进行查阅。
发明内容
由于目前市场上的区块链基本都是支持单一的数据库,例如,当用户使用现有区块链浏览器对区块链数据进行随机查询和/或复杂查询时,区块链浏览器采用关系型数据库来实现上述目的。然而,由于区块链自身数据库的限制(也即,已知的区块链浏览器,均是集中化的方式采集/接收区块链产生的数据),使得区块链浏览器中的数据无法具有防篡改以及可追溯的保障。同时,现有区块链采用的键值型数据库随机查询效率低,并且难以实现复杂查询(例如,查询单个账户交易历史)。
针对上述问题,本公开内容的第一方面提出了基于区块链实现支持多种数据库的方法,所述方法包括:
在启动区块链可执行程序的情况下,基于数据库配置模式确定所述区块链可执行程序中的数据库配置参数,其中,所述数据库配置模式包括选择关系型数据库或键值型数据库中的至少一种的第一类配置模式以及选择关系型数据库和键值型数据库两者的第二类配置模式;
基于所述数据库配置参数,建立与相应数据库的通信关系;
基于所述通信关系,将区块链数据写入所述数据库中;以及
在至少选择所述关系型数据库的情况下,基于交易哈希查询相应的智能合约交易的具体操作信息。
在根据本公开内容的第一方面的实施例中,所述方法进一步包括:
重新设定所述数据库配置模式;
基于重新设定的数据库配置模式,确定所述区块链可执行程序中的数据库配置参数;
基于所述数据库配置参数,建立与相应数据库的通信关系;
基于所述通信关系,将区块链数据写入所述数据库中。
在根据本公开内容的第一方面的实施例中,
所述第一类配置模式至少包括仅选择所述关系型数据库、仅选择第一键值型数据库和/或仅选择第二键值型数据库;
所述第二类配置模式至少包括选择所述关系型数据库以及所述第一键值型数据库或者选择所述关系型数据库以及所述第二键值型数据库。
在根据本公开内容的第一方面的实施例中,在启动区块链可执行程序的情况下,基于数据库配置模式确定所述区块链可执行程序中的数据库配置参数进一步包括:
在所述数据库配置模式是所述第一类配置模式的情况下,调用与所述关系型数据库、所述第一键值型数据库或所述第二键值型数据库中的一种相关的多个标准接口函数;或者
在所述数据库配置模式是所述第二类配置模式的情况下,调用与所述关系型数据库和所述键值型数据库相关的多个标准接口函数。
在根据本公开内容的第一方面的实施例中,基于所述数据库配置参数建立与相应数据库的通信关系进一步包括:
基于所调用的多个标准接口函数,建立与相应的所述关系型数据库和/或所述键值型数据库的通信关系。
在根据本公开内容的第一方面的实施例中,在至少选择所述关系型数据库的情况下,基于所述通信关系将区块链数据写入所述数据库中进一步包括:
在所述区块链数据是智能合约交易的情况下,在所述关系型数据库中存储交易备注,其中,所述交易备注包括所述智能合约的操作内容;
根据所述智能合约交易的数据结构,在所述关系型数据库中至少还存储所述智能合约交易的交易哈希、智能合约地址、调用的智能合约函数名称以及智能合约函数的参数内容。
在根据本公开内容的第一方面的实施例中,在至少选择所述关系型数据库的情况下基于交易哈希查询相应的智能合约交易的具体操作信息进一步包括:
在基于交易哈希查询到的交易是智能合约交易的情况下,基于所述交易哈希查询所述智能合约的智能合约地址、调用的智能合约函数名称、智能合约函数的参数内容以及所述智能合约的操作内容。
在根据本公开内容的第一方面的实施例中,在至少选择所述关系型数据库的情况下,所述方法进一步包括:
基于交易哈希查询相应交易的交易内容,其中,所述交易内容至少包括块高度、源账户地址、目的账户地址、交易金额;
基于账户地址查询相应账户的交易历史信息;
分页查询块数据列表;
分页查询交易数据列表。
在根据本公开内容的第一方面的实施例中,重新设定所述数据库配置模式进一步包括:
在先前运行的数据库配置模式是仅选择所述关系型数据库的情况下,设定任一第二类配置模式;或者
在先前运行的数据库配置模式是仅选择所述第一键值型数据库的情况下,设定选择所述第一键值型数据库以及所述关系型数据库的第二类配置模式;或者
在先前运行的数据库配置模式是仅选择所述第二键值型数据库的情况下,设定选择所述第二键值型数据库以及所述关系型数据库的第二类配置模式;或者
在先前运行的数据库配置模式是选择所述关系型数据库以及所述第一键值型数据库的情况下,设定仅选择所述关系型数据库、或者设定仅选择所述第一键值型数据库;或者
在先前运行的数据库配置模式是选择所述关系型数据库以及所述第二键值型数据库的情况下,设定仅选择所述关系型数据库、或者设定仅选择所述第二键值型数据库。
在根据本公开内容的第一方面的实施例中,在先前运行的数据库配置模式是任一第一类配置模式的情况下,在基于所述通信关系将区块链数据写入所述数据库中之后,所述方法进一步包括:
确定第一数据库中存储的内容是否与第二数据库中存储的内容一致,其中,所述第一数据库是先前存储所述区块链数据的数据库,所述第二数据库是重新设定的另一个数据库;
在确定所述第一数据库中存储的内容与所述第二数据库中存储的内容不一致的情况下,将所述第一数据库中存储的、与所述第二数据库中不同的区块链数据同步到所述第二数据库中。
针对上述问题,本公开内容的第二方面提出了一种基于区块链实现支持多种数据库的设备,所述设备包括:
处理器;以及
存储器,其用于存储指令,当所述指令执行时使得所述处理器执行以下操作:
在启动区块链可执行程序的情况下,基于数据库配置模式确定所述区块链可执行程序中的数据库配置参数,其中,所述数据库配置模式包括选择关系型数据库或键值型数据库中的至少一种的第一类配置模式以及选择关系型数据库和键值型数据库两者的第二类配置模式;
基于所述数据库配置参数,建立与相应数据库的通信关系;
基于所述通信关系,将区块链数据写入所述数据库中;以及
在至少选择所述关系型数据库的情况下,基于交易哈希查询相应的智能合约交易的具体操作信息。
在根据本公开内容的第二方面的实施例中,当所述指令执行时使得所述处理器进一步执行以下操作:
重新设定所述数据库配置模式;
基于重新设定的数据库配置模式,确定所述区块链可执行程序中的数据库配置参数;
基于所述数据库配置参数,建立与相应数据库的通信关系;
基于所述通信关系,将区块链数据写入所述数据库中。
在根据本公开内容的第二方面的实施例中,
所述第一类配置模式至少包括仅选择所述关系型数据库、仅选择第一键值型数据库和/或仅选择第二键值型数据库;
所述第二类配置模式至少包括选择所述关系型数据库以及所述第一键值型数据库或者选择所述关系型数据库以及所述第二键值型数据库。
在根据本公开内容的第二方面的实施例中,在启动区块链可执行程序的情况下,基于数据库配置模式确定所述区块链可执行程序中的数据库配置参数进一步包括:
在所述数据库配置模式是所述第一类配置模式的情况下,调用与所述关系型数据库、所述第一键值型数据库或所述第二键值型数据库中的一种相关的多个标准接口函数;或者
在所述数据库配置模式是所述第二类配置模式的情况下,调用与所述关系型数据库和所述键值型数据库相关的多个标准接口函数。
在根据本公开内容的第二方面的实施例中,基于所述数据库配置参数建立与相应数据库的通信关系进一步包括:
基于所调用的多个标准接口函数,建立与相应的所述关系型数据库和/或所述键值型数据库的通信关系。
在根据本公开内容的第二方面的实施例中,在至少选择所述关系型数据库的情况下,基于所述通信关系将区块链数据写入所述数据库中进一步包括:
在所述区块链数据是智能合约交易的情况下,在所述关系型数据库中存储交易备注,其中,所述交易备注包括所述智能合约的操作内容;
根据所述智能合约交易的数据结构,在所述关系型数据库中至少还存储所述智能合约交易的交易哈希、智能合约地址、调用的智能合约函数名称以及智能合约函数的参数内容。
在根据本公开内容的第二方面的实施例中,在至少选择所述关系型数据库的情况下基于交易哈希查询相应的智能合约交易的具体操作信息进一步包括:
在基于交易哈希查询到的交易是智能合约交易的情况下,基于所述交易哈希查询所述智能合约的智能合约地址、调用的智能合约函数名称、智能合约函数的参数内容以及所述智能合约的操作内容。
在根据本公开内容的第二方面的实施例中,在至少选择所述关系型数据库的情况下,当所述指令执行时使得所述处理器进一步执行以下操作:
基于交易哈希查询相应交易的交易内容,其中,所述交易内容至少包括块高度、源账户地址、目的账户地址、交易金额;
基于账户地址查询相应账户的交易历史信息;
分页查询块数据列表;和/或
分页查询交易数据列表。
在根据本公开内容的第二方面的实施例中,重新设定所述数据库配置模式进一步包括:
在先前运行的数据库配置模式是仅选择所述关系型数据库的情况下,设定任一第二类配置模式;或者
在先前运行的数据库配置模式是仅选择所述第一键值型数据库的情况下,设定选择所述第一键值型数据库以及所述关系型数据库的第二类配置模式;或者
在先前运行的数据库配置模式是仅选择所述第二键值型数据库的情况下,设定选择所述第二键值型数据库以及所述关系型数据库的第二类配置模式;或者
在先前运行的数据库配置模式是选择所述关系型数据库以及所述第一键值型数据库的情况下,设定仅选择所述关系型数据库、或者设定仅选择所述第一键值型数据库;或者
在先前运行的数据库配置模式是选择所述关系型数据库以及所述第二键值型数据库的情况下,设定仅选择所述关系型数据库、或者设定仅选择所述第二键值型数据库。
在根据本公开内容的第二方面的实施例中,在先前运行的数据库配置模式是任一第一类配置模式的情况下,在基于所述通信关系将区块链数据写入所述数据库中之后,当所述指令执行时使得所述处理器进一步执行以下操作:
确定第一数据库中存储的内容是否第二数据库中存储的内容一致,其中,所述第一数据库是先前存储所述区块链数据的数据库,所述第二数据库是重新设定的另一个数据库;
在确定所述第一数据库中存储的内容与所述第二数据库中存储的内容不一致的情况下,将所述第一数据库中存储的、与所述第二数据库中不同的区块链数据同步到所述第二数据库中。
依据本公开内容的基于区块链实现支持多种数据库的方法及设备,使得用户能够根据实际业务需要请求相应的区块链节点灵活地选择一种或多种数据库(例如,键值型数据库、关系型数据库)实现对区块链数据的存取,以弥补由于数据库自身的特定导致的区块链节点仅使用一种数据库存储区块链数据的不足,进而更好地适应具体业务。
附图说明
结合附图并参考以下详细说明,本公开的各实施例的特征、优点及其他方面将变得更加明显,在此以示例性而非限制性的方式示出了本公开的若干实施例,在附图中:
图1为依据本公开内容的基于区块链实现支持多种数据库的方法的实施例之一的流程图;
图2为依据本公开内容的基于区块链实现支持多种数据库的方法的实施例之二的流程图;
图3为依据本公开内容的基于区块链实现支持多种数据库的方法的实施例之二的另一个流程图;
图4a-4c为依据本公开内容的键值型数据库中存储的各种数据的示意图;
图5a-5d为依据本公开内容的关系型数据库中存储的各种数据的示意图;以及
图6为依据本公开内容的基于区块链实现支持多种数据库的设备600的示意图。
具体实施方式
以下参考附图详细描述本公开的各个示例性实施例。附图中的流程图和框图示出了根据本公开的各种实施例的方法和系统的可能实现的体系架构、功能和操作。应当注意,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,所述模块、程序段、或代码的一部分可以包括一个或多个用于实现各个实施例中所规定的逻辑功能的可执行指令。也应当注意,在有些作为备选的实现中,方框中所标注的功能也可以按照不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,或者它们有时也可以按照相反的顺序执行,这取决于所涉及的功能。同样应当注意的是,流程图和/或框图中的每个方框、以及流程图和/或框图中的方框的组合,可以使用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以使用专用硬件与计算机指令的组合来实现。
本公开内容的实施例主要关注以下技术问题:如何使得区块链中的不同区块链节点支持不同的数据库来满足相应的业务需求。
为了解决上述问题,本文公开了基于区块链实现支持多种数据库的方法和设备,能够使得区块链中的任一区块链节点与不同类型的数据库建立通信关系,从而将区块链数据分别存储在不同类型的数据库中,以便利用不同数据库的特性满足不同的业务需求;例如,键值型数据库(也即,K-V型数据库)顺序读写数据的性能较好,能够满足大量数据存储需求,但是随机读取、复杂查询性能较差;关系型数据库(例如,SQL型数据库)具有高效的随机读取、复杂查询功能。
实施例1
图1示出了基于区块链实现支持多种数据库的方法的实施例之一的流程图。在本实施例中,区块链中的任一区块链节点可以实施图1所示的方法,具体如下:
步骤110:在启动区块链可执行程序的情况下,基于数据库配置模式确定所述区块链可执行程序中的数据库配置参数。
在本文中,所述数据库配置模式包括选择关系型数据库或键值型数据库中的至少一种的第一类配置模式以及选择关系型数据库和键值型数据库两者的第二类配置模式。
在本公开内容中,所述第一类配置模式至少包括仅选择所述关系型数据库(例如,SQLite)、仅选择第一键值型数据库(例如,LevelDB)和/或仅选择第二键值型数据库(例如,RocksDB)。在本实施例中,所述第一类配置模式包括:关系型数据库=SQLite,键值型数据库=null;或者关系型数据库=null,键值型数据库=LevelDB;或者关系型数据库=null,键值型数据库=RocksDB三种类型。
所述第二类配置模式至少包括选择所述关系型数据库以及所述第一键值型数据库或者选择所述关系型数据库以及所述第二键值型数据库。在本实施例中,所述第二类配置模式包括:关系型数据库=SQLite,键值型数据库=LevelDB;或者关系型数据库=SQLite,键值型数据库=RocksDB两种类型。
其中,RocksDB是支持多线程的K-V型数据库,LevelDB是支持单线程的K-V型数据库,SQLite是具有较好的随机读取、复杂查询功能的关系型数据库。
在本实施例中,仅选择第一键值型数据库(例如,LevelDB)作为默认配置模式,在区块链可执行程序中默认选择上述默认配置模式所对应的数据库配置参数。
在步骤110中,区块链节点具体操作如下:
在所述数据库配置模式是所述第一类配置模式的情况下,调用与所述关系型数据库、所述第一键值型数据库或所述第二键值型数据库中的一种相关的多个标准接口函数。
例如,当仅选择第一键值型数据库或仅选择第二键值型数据库时,调用与第一键值型数据库或第二键值型数据库相关的多个标准接口函数:Open()、Get()、Set()、Delete()、Close()、NewBatch()、Print()、Iterator()等。当仅选择SQLite数据库时,调用与SQLite数据库相关的多个标准接口函数:Open()、Close()、Exec()、Query()、Next()等。
替代地,在所述数据库配置模式是所述第二类配置模式的情况下,调用与所述关系型数据库和所述键值型数据库相关的多个标准接口函数。
步骤120:基于所述数据库配置参数,建立与相应数据库的通信关系。在本步骤中,区块链节点具体操作如下:
基于所调用的多个标准接口函数,建立与相应的所述关系型数据库和/或所述键值型数据库的通信关系。
例如,基于Open()、Get()、Set()、Delete()、Close()、NewBatch()、Print()、Iterator()等标准接口函数,建立区块链节点与第一键值型数据库或第二键值型数据库的通信关系。基于Open()、Close()、Exec()、Query()、Next()等标准接口函数,建立区块链节点与关系型数据库的通信关系。
步骤130:基于所述通信关系,将区块链数据写入所述数据库中。在本步骤中,区块链节点具体操作如下:
在所述数据库配置模式中包括了选择关系型数据库的情况下,在所述区块链数据是智能合约交易的情况下,在所述关系型数据库中存储交易备注,其中,所述交易备注包括所述智能合约的操作内容。
同时,根据所述智能合约交易的数据结构,在所述关系型数据库中至少还存储所述智能合约交易的交易哈希、智能合约地址、调用的智能合约函数名称以及智能合约函数的参数内容。
如图5a-5d所述,区块链节点可以将块数据、交易数据、账户信息以及智能合约分别以数据表的形式存储在SQL型数据库中。如图5a所示,在存储块数据的数据表中包括以下参数:块高度、块哈希以及块中交易数量。如图5b所示,在存储交易数据的数据表中包括以下参数:所属块高度、交易哈希、源头账户地址、目的账户地址、智能合约地址、交易金额以及存储数据。如图5c所示,在存储账户信息的数据表中包括以下参数:账户地址、账户余额。如图5d所示,在存储智能合约的数据表中包括:交易哈希、智能合约地址、调用的智能合约函数名称、智能合约函数的参数、字节代码以及应用程序二进制接口(ABI)
如图4a-4c所示,区块链节点可以将块数据、交易数据以及账户信息分别以数据表的形式存储在K-V型数据库中。如图4a所示,在存储块数据的数据表中包括以下参数:块高度、块哈希以及块中交易数量。如图4b所示,在存储交易数据的数据表中包括以下参数:所属块高度、交易哈希、源头账户地址、目的账户地址、智能合约地址、交易金额以及存储数据。如图4c所示,在存储账户信息的数据表中包括以下参数:账户地址、账户余额。
步骤140:在至少选择所述关系型数据库的情况下,基于交易哈希查询相应的智能合约交易的具体操作信息。在本步骤中,区块链节点具体操作如下:
在基于交易哈希查询到的交易是智能合约交易的情况下,基于所述交易哈希查询所述智能合约的智能合约地址、调用的智能合约函数名称、智能合约函数的参数内容以及所述智能合约的操作内容。
例如,当所述区块链可执行程序启动时,根据数据库配置模式确定是否开放随机查询接口和复杂查询接口,在至少选择所述关系型数据库的情况下,区块链节点开放随机查询接口和复杂查询接口,使得用户能够通过随机查询接口和复杂查询接口查询智能合约交易内容、账户的交易历史信息等。
另外,在至少选择所述关系型数据库的情况下,区块链节点还能够进行如下操作:
基于交易哈希查询相应交易的交易内容,其中,所述交易内容至少包括块高度、源账户地址、目的账户地址、交易金额;基于账户地址查询相应账户的交易历史信息;分页查询块数据列表;以及分页查询交易数据列表。
实施例1所公开的基于区块链实现支持多种数据库的方法能够允许区块链节点根据用户需求或业务需求方便灵活的选择一种或多种数据库存储、读取区块链数据,由此可以规避某一种数据库的不足,同时提高了区块链的应用灵活性。另外,允许区块链的不同区块链节点根据其自身用户的需求设定不同的数据库配置模式,以建立与不同类型的数据库的通信关系。
实施例2
图2示出了基于区块链实现支持多种数据库的方法的实施例之二的流程图。在本实施例中,在区块链中的任一区块链节点执行图1所示的步骤110-140中的任一步骤的过程中,该区块链节点还可以实施图2所示的方法,具体如下:
步骤210:重新设定所述数据库配置模式。在本步骤中,区块链节点的具体操作如下:
在先前运行的数据库配置模式是仅选择所述关系型数据库(例如,SQLite)的情况下,设定任一第二类配置模式。例如,可以重新设定选择关系型数据库=SQLite,键值型数据库=LevelDB或RocksDB。
替代地,在先前运行的数据库配置模式是仅选择所述第一键值型数据库的情况下,设定选择所述第一键值型数据库以及所述关系型数据库的第二类配置模式。
例如,在启动区块链可执行程序的过程中,当用户未请求区块链节点设定数据库配置模式时,该区块链节点基于默认配置模式(也即,键值型数据库=LevelDB,关系型数据库=null)确定所述区块链可执行程序中的数据库配置参数;则重新设定数据库配置模式时仅能选择关系型数据库=SQLite,键值型数据库=LevelDB的第二类配置模式。
替代地,在先前运行的数据库配置模式是仅选择所述第二键值型数据库的情况下,可以重新设定选择所述第二键值型数据库以及所述关系型数据库的第二类配置模式。
在本实施例中,当先前运行的数据库配置模式是键值型数据库=RocksDB、关系型数据库=null时,重新设定数据库配置模式时仅能选择关系型数据库=SQLite,键值型数据库=RocksDB的第二类配置模式。
替代地,在先前运行的数据库配置模式是选择所述关系型数据库以及所述第一键值型数据库的情况下,可以重新设定仅选择所述关系型数据库、或者设定仅选择所述第一键值型数据库。
在本实施例中,当先前运行的数据库配置模式是关系型数据库=SQLite、键值型数据库=LevelDB时,重新设定数据库配置模式时可以选择选择关系型数据库=SQLite、键值型数据库=null,或者关系型数据库=null、键值型数据库=LevelDB。
在先前运行的数据库配置模式是选择所述关系型数据库以及所述第二键值型数据库的情况下,可以重新设定仅选择所述关系型数据库、或者设定仅选择所述第二键值型数据库。
在本实施例中,当先前运行的数据库配置模式是关系型数据库=SQLite、键值型数据库=RocksDB时,重新设定数据库配置模式时可以选择选择关系型数据库=SQLite、键值型数据库=null,或者关系型数据库=null、键值型数据库=RocksDB。
步骤220:基于重新设定的数据库配置模式,确定所述区块链可执行程序中的数据库配置参数。
步骤230:基于所述数据库配置参数,建立与相应数据库的通信关系。
步骤240:基于所述通信关系,将区块链数据写入所述数据库中。
在本实施例中所公开的步骤220-240的操作过程类似于实施例1所公开的步骤110-130的操作过程,在此不再赘述。
另外,如图3所公开的基于区块链实现支持多种数据库的方法的实施例之二的另一个流程图,在先前运行的数据库配置模式是任一第一类配置模式的情况下,在基于所述通信关系将区块链数据写入所述数据库中之后,区块链节点还应当进行如下操作:
步骤310:确定第一数据库中存储的内容是否与第二数据库中存储的内容一致,其中,所述第一数据库是先前存储所述区块链数据的数据库,所述第二数据库是重新设定的另一个数据库。
在本实施例中,区块链节点通过比较第一数据库与第二数据库中存储的区块的块高度和最新块数据内容来确定第一数据库与第二数据库的存储内容是否一致。
步骤320:在确定所述第一数据库中存储的内容与所述第二数据库中存储的内容不一致的情况下,将所述第一数据库中存储的、与所述第二数据库中不同的区块链数据同步到所述第二数据库中。
在本步骤中,区块链节点新建线程以便于将第一数据库中存储的、第二数据库中未存储的数据插入第二数据库中,以确保第一数据库中存储的内容与第二数据库中存储的内容最终一致。
例如,当初始数据库配置模式是默认配置模式(也即,键值型数据库=LevelDB,关系型数据库=null)时,用户仅能够请求区块链节点将数据库配置模式重新设定为关系型数据库=SQLite、键值型数据库=LevelDB。区块链节点首先将新的区块链数据存储在LevelDB中,然后将该新的区块链数据从LevelDB中同步到SQLite。
另外,判断LevelDB与SQLite中的块高度与最新块数据内容一一比对,在确定LevelDB与SQLite不一致的情况下,将LevelDB中存储的而SQLite未存储的数据同步到SQLite中。
实施例2所公开的技术方案使用户能够根据应用需要灵活地改变区块链节点的存储方式,例如,具有区块链浏览器功能的区块链节点采用关系型数据库,则可以存储与区块链浏览器相同的数据,从而无需额外再开发区块链浏览器的非展示界面应用,并且使得区块链浏览器中应用的数据具有防篡改性和可追溯性。
如图6所示,本文所公开的基于区块链实现支持多种数据库的设备600能够实现图1-图3所示的基于区块链实现支持多种数据库的方法。设备600至少包括处理器610和存储器620,其中,存储器620被配置为存储指令,使得处理器610执行以下操作:
在启动区块链可执行程序的情况下,基于数据库配置模式确定所述区块链可执行程序中的数据库配置参数,其中,所述数据库配置模式包括选择关系型数据库或键值型数据库中的至少一种的第一类配置模式以及选择关系型数据库和键值型数据库两者的第二类配置模式;
基于所述数据库配置参数,建立与相应数据库的通信关系;
基于所述通信关系,将区块链数据写入所述数据库中;以及在至少选择所述关系型数据库的情况下,基于交易哈希查询相应的智能合约交易的具体操作信息。
在依据本公开内容的一个实施例中,在启动所述区块链可执行程序的同时、在建立与数据库的通信关系的同时、在区块链数据写入所述数据库中的同时和/或在查询区块链数据的同时,当所述指令执行时使得所述处理器610进一步执行以下操作:
重新设定所述数据库配置模式;
基于重新设定的数据库配置模式,确定所述区块链可执行程序中的数据库配置参数;
基于所述数据库配置参数,建立与相应数据库的通信关系;
基于所述通信关系,将区块链数据写入所述数据库中。
在依据本公开内容的一个实施例中,所述第一类配置模式包括仅选择所述关系型数据库、仅选择第一键值型数据库和/或仅选择第二键值型数据库;所述第二类配置模式包括选择所述关系型数据库以及所述第一键值型数据库或者选择所述关系型数据库以及所述第二键值型数据库。
在依据本公开内容的一个实施例中,在启动区块链可执行程序的情况下,基于数据库配置模式确定所述区块链可执行程序中的数据库配置参数进一步包括:
在所述数据库配置模式是所述第一类配置模式的情况下,调用与所述关系型数据库、所述第一键值型数据库或所述第二键值型数据库中的一种相关的多个标准接口函数;或者
在所述数据库配置模式是所述第二类配置模式的情况下,调用与所述关系型数据库和所述键值型数据库相关的多个标准接口函数。
在依据本公开内容的一个实施例中,基于所述数据库配置参数建立与相应数据库的通信关系进一步包括:
基于所调用的多个标准接口函数,建立与相应的所述关系型数据库和/或所述键值型数据库的通信关系。
在依据本公开内容的一个实施例中,在至少选择所述关系型数据库的情况下,基于所述通信关系将区块链数据写入所述数据库中进一步包括:
在所述区块链数据是智能合约交易的情况下,在所述关系型数据库中存储交易备注,其中,所述交易备注包括所述智能合约的操作内容;
根据所述智能合约交易的数据结构,在所述关系型数据库中至少还存储所述智能合约交易的交易哈希、智能合约地址、调用的智能合约函数名称以及智能合约函数的参数内容。
在依据本公开内容的一个实施例中,在至少选择所述关系型数据库的情况下基于交易哈希查询相应的智能合约交易的具体操作信息进一步包括:
在基于交易哈希查询到的交易是智能合约交易的情况下,基于所述交易哈希查询所述智能合约的智能合约地址、调用的智能合约函数名称、智能合约函数的参数内容以及所述智能合约的操作内容。
在依据本公开内容的一个实施例中,在至少选择所述关系型数据库的情况下,当所述指令执行时使得所述处理器进一步执行以下操作:
基于交易哈希查询相应交易的交易内容,其中,所述交易内容至少包括块高度、源账户地址、目的账户地址、交易金额;
基于账户地址查询相应账户的交易历史信息;
分页查询块数据列表;
分页查询交易数据列表。
在依据本公开内容的一个实施例中,重新设定所述数据库配置模式进一步包括:
在先前运行的数据库配置模式是仅选择所述关系型数据库的情况下,设定任一第二类配置模式;或者
在先前运行的数据库配置模式是仅选择所述第一键值型数据库的情况下,设定选择所述第一键值型数据库以及所述关系型数据库的第二类配置模式;或者
在先前运行的数据库配置模式是仅选择所述第二键值型数据库的情况下,设定选择所述第二键值型数据库以及所述关系型数据库的第二类配置模式;或者
在先前运行的数据库配置模式是选择所述关系型数据库以及所述第一键值型数据库的情况下,设定仅选择所述关系型数据库、或者设定仅选择所述第一键值型数据库;或者
在先前运行的数据库配置模式是选择所述关系型数据库以及所述第二键值型数据库的情况下,设定仅选择所述关系型数据库、或者设定仅选择所述第二键值型数据库。
在依据本公开内容的一个实施例中,在先前运行的数据库配置模式是任一第一类配置模式的情况下,在基于所述通信关系将区块链数据写入所述数据库中之后,当所述指令执行时使得所述处理器进一步执行以下操作:
确定第一数据库中存储的内容是否与第二数据库中存储的内容一致,其中,所述第一数据库是先前存储所述区块链数据的数据库,所述第二数据库是重新设定的另一个数据库;
在确定所述第一数据库中存储的内容与所述第二数据库中存储的内容不一致的情况下,将所述第一数据库中存储的、与所述第二数据库中不同的区块链数据同步到所述第二数据库中。
本文所公开的基于区块链实现支持多种数据库的设备能够实现区块链网络中的任一区块链节点根据实际业务需求与一种或多种数据库(例如,键值型数据库、关系型数据库等)通信,进而实现在不同类型的数据库中存储区块链数据,最终根据不同的数据存储类型来读取数据;既能够规避仅使用某一种数据库存在的缺陷,又能够提高数据的防篡改性和可靠性。
替代地,上述的基于区块链实现支持多种数据库的方法能够通过计算机程序产品来实现。计算机程序产品可以包括计算机可读存储介质,其上载有用于执行本公开的各个方面的计算机可读程序指令。计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是但不限于电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
以上所述仅为本公开的实施例可选实施例,并不用于限制本公开的实施例,对于本领域的技术人员来说,本公开的实施例可以有各种更改和变化。凡在本公开的实施例的精神和原则之内,所作的任何修改、等效替换、改进等,均应包含在本公开的实施例的保护范围之内。
虽然已经参考若干具体实施例描述了本公开的实施例,但是应该理解,本公开的实施例并不限于所公开的具体实施例。本公开的实施例旨在涵盖在所附权利要求的精神和范围内所包括的各种修改和等同布置。所附权利要求的范围符合最宽泛的解释,从而包含所有这样的修改及等同结构和功能。