CN112667652A - 基于区块链的模拟交易方法、装置、设备和可读存储介质 - Google Patents
基于区块链的模拟交易方法、装置、设备和可读存储介质 Download PDFInfo
- Publication number
- CN112667652A CN112667652A CN202011632263.6A CN202011632263A CN112667652A CN 112667652 A CN112667652 A CN 112667652A CN 202011632263 A CN202011632263 A CN 202011632263A CN 112667652 A CN112667652 A CN 112667652A
- Authority
- CN
- China
- Prior art keywords
- block
- request event
- version number
- simulated transaction
- read cache
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请实施例中提供一种基于区块链的模拟交易方法、装置、设备和可读存储介质;所述方法包括:在区块落盘时,将账本数据整理形成预定义的批处理请求;将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件;若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照;在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易;本申请实施例通过设置读缓存,使得模拟交易和出块主流程互不影响,保证出块主流程的效率和区块数据的统一。
Description
技术领域
本申请涉及区块链技术领域,具体涉及一种基于区块链的模拟交易方法、装置、设备和可读存储介质。
背景技术
模拟交易是一种由用户发起的,不期望其对账本的修改在链上留痕的一种交易,模拟交易一般用于读取账本数据、调试合约逻辑等等场景。
一般的模拟交易执行思路都是给定一个某一时间点的世界状态,模拟交易就基于这份世界状态数据执行,执行后返回结果,模拟交易的基础设计思路比较简单直接,就是“给定一个时间点世界状态”在给定的时间点世界状态进行模拟交易;模拟交易的过程中如果执行区块内交易生成区块的主流程(以下简称“出块主流程”)对模拟交易有感知的话,只需要模拟交易执行时暂停出块主流程即可,但显然这会对出块主流程的效率造成影响;这个模拟交易的过程中如果出块主流程对模拟交易执行无感知的话,那么出块主流程会修改最新的世界状态,如果模拟交易的所有账本读操作都复用最新的世界状态,显然会存在两个流程并发导致的数据一致性问题。
发明内容
本申请提供一种基于区块链的模拟交易方法、装置、设备和可读存储介质,旨在解决由于现有区块链模拟交易与出块主流程相互影响,导致出块主流程的效率降低,或者模拟交易和出块主流程两个流程并发导致的数据一致性的技术问题。
一方面,本申请提供一种基于区块链的模拟交易方法,所述基于区块链的模拟交易方法包括以下步骤:
在区块落盘时,将账本数据整理形成预定义的批处理请求;
将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件;
若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照;
在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易。
在本申请一些实施方案中,所述将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件之前,所述方法包括:
在区块链执行层配置多版本并发控制的读缓存,其中,所述读缓存包括快照数据接口、读数据接口、清除数据接口和舍弃数据接口;
所述将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件之后,所述方法包括:
通过所述读缓存中的读数据接口读取所述批处理请求中的区块请求事件,并判断所述区块请求事件是否为模拟交易;
若所述区块请求事件不是模拟交易,则根据所述区块请求事件的事件类型执行所述区块请求事件;
若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照。
在本申请一些实施方案中,所述若所述区块请求事件不是模拟交易,则根据所述区块请求事件的事件类型执行所述区块请求事件,包括:
若所述区块请求事件不是模拟交易,则确定所述区块请求事件是否为出块时产生的账本修改集事件;
若所述区块请求事件是账本修改集事件,则读取所述账本修改集事件中的区块版本号和账本修改集内容;
遍历所述账本修改集内容,提取所述账本修改集内容中的各键值对,并判断所述读缓存的值版本字段中是否包含所述键值对中的键;
若读缓存的值版本字段中包含所述键值对中的键,则提取所述键对应的链表,并将所述区块版本号和所述值构造一个链表元素;
将所述链表元素插入到所述读缓存中链表的尾部,并更新所述读缓存中的区块版本号。
在本申请一些实施方案中,所述若所述区块请求事件不是模拟交易,则根据所述区块请求事件的事件类型执行所述区块请求事件,包括:
若所述区块请求事件不是模拟交易,则确定所述区块请求事件是否为清理请求事件或舍弃请求事件;
若所述区块请求事件是清理请求事件或舍弃请求事件,则获取所述清理请求事件或舍弃请求事件中包含的区块版本号;
将所述清理请求事件或舍弃请求事件中包含的区块版本号和历史清除版本号进行比对,判断对所述区块版本号的清理请求事件或舍弃请求事件是否合法;
若对所述区块版本号的清理请求事件或舍弃请求事件不合法,则退出所述清理请求事件或所述舍弃请求事件的执行流程;
若对所述区块版本号的清理请求事件或舍弃请求事件合法,则清除所述读缓存的值版本字段中的所述区块版本号,并获取所述区块版本号对应的键集合;
遍历所述键集合删除所述区块版本号对应的链表元素,并更新所述读缓存中的区块版本号。
在本申请一些实施方案中,所述在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易之后,所述方法包括:
读取所述读缓存中历史清除信息到当前清除信息之间的各区块版本号,和各所述区块版本号的引用次数,判断所述区块版本号的引用次数是否为零;
若所述区块版本号的引用次数为零,则获取所述区块版本号对应的键集合;
遍历所述键集合,删除所述区块版本号对应的链表元素,并更新所述读缓存中的区块版本号。
在本申请一些实施方案中,所述若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照之后,所述方法包括:
接收新区块的账本修改操作,阻塞所述账本修改操作,并获取磁盘中当前区块版本号对应的第二快照;
解除对所述账本修改操作的阻塞,并保存所述第一快照的内容和所述第二快照的内容,以供执行所述模拟交易和/或所述账本修改操作时使用。
在本申请一些实施方案中,所述解除对所述账本修改操作的阻塞,并保存所述第一快照的内容和所述第二快照的内容,以供执行所述模拟交易和/或所述账本修改操作时使用之后,所述方法包括:
若根据所述第一快照的内容和所述第二快照的内容未获取到所述模拟操作对应区块版本号的目标数据,则输出所述模拟操作错误的提示信息。
另一方面,本申请提供一种基于区块链的模拟交易装置,所述基于区块链的模拟交易装置包括:
数据处理模块,用于在区块落盘时,将账本数据整理形成预定义的批处理请求;
缓存监听模块,用于将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件;
接口调用模块,用于若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照;
模拟操作模块,用于在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易。
另一方面,本申请还提供一种基于区块链的模拟交易设备,所述基于区块链的模拟交易设备包括:
一个或多个处理器;
存储器;以及
一个或多个应用程序,其中所述一个或多个应用程序被存储于所述存储器中,并配置为由所述处理器执行以实现所述的基于区块链的模拟交易方法。
另一方面,本申请还提供一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器进行加载,以执行所述的基于区块链的模拟交易方法中的步骤。
本申请实施例中在区块落盘时,将账本数据整理形成预定义的批处理请求;将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件;若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照;在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易。本实施例中通过设置读缓存,在区块落盘时,将账本数据整理形成预定义的批处理请求,并将批处理请求刷入到读缓存,通过多版本并发控制的读缓存,实现批处理请求中模拟交易和出块主流程并发控制,使得模拟交易的执行流程和出块的主流程互不影响,保证模拟交易时出块主流程的执行效率,同时有效保障区块数据的统一性。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的基于区块链的模拟交易的场景示意图;
图2是本申请实施例中提供的基于区块链的模拟交易方法的一个实施例流程示意图;
图3是本申请实施例中提供的基于区块链的模拟交易方法中配置多版本并发控制的读缓存的一个实施例的流程示意图;
图4是本申请实施例中提供的基于区块链的模拟交易方法中账本修改集事件处理的一个实施例的流程示意图;
图5是本申请实施例中提供的基于区块链的模拟交易方法中清理请求事件或舍弃请求事件处理的一个实施例的流程示意图;
图6是本申请实施例中提供的基于区块链的模拟交易方法中版本数据自动清楚的一个实施例的流程示意图;
图7是本申请实施例中提供的基于区块链的模拟交易方法中模拟操作执行过程中接收到新区块的账本修改操作时的一个实施例的流程示意图;
图8是本申请实施例中提供的基于区块链的模拟交易装置的一个实施例结构示意图;
图9是本申请实施例中提供的基于区块链的模拟交易设备的一个实施例结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明包含的范围。
在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“长度”、“宽度”、“厚度”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个所述特征。在本发明的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。
在本申请中,“示例性”一词用来表示“用作例子、例证或说明”。本申请中被描述为“示例性”的任何实施例不一定被解释为比其它实施例更优选或更具优势。为了使本领域任何技术人员能够实现和使用本发明,给出了以下描述。在以下描述中,为了解释的目的而列出了细节。应当明白的是,本领域普通技术人员可以认识到,在不使用这些特定细节的情况下也可以实现本发明。在其它实例中,不会对公知的结构和过程进行详细阐述,以避免不必要的细节使本发明的描述变得晦涩。因此,本发明并非旨在限于所示的实施例,而是与符合本申请所公开的原理和特征的最广范围相一致。
本申请实施例中提供一种基于区块链的模拟交易方法、装置、设备及可读存储介质,以下分别进行详细说明。
本发明实施例中的基于区块链的模拟交易方法应用于基于区块链的模拟交易装置,基于区块链的模拟交易装置设置于基于区块链的模拟交易设备,基于区块链的模拟交易设备中设置有一个或多个处理器、存储器,以及一个或多个应用程序,其中一个或多个应用程序被存储于存储器中,并配置为由处理器执行以实现基于区块链的模拟交易方法;基于区块链的模拟交易设备可以是终端,例如,手机或平板电脑,基于区块链的模拟交易设备还可以是一台服务器,或者多台服务器组成的服务集群。
如图1所示,图1为本申请实施例基于区块链的模拟交易的场景示意图,本发明实施例中基于区块链的模拟交易场景中包括基于区块链的模拟交易设备100,其中基于区块链的模拟交易设备100中集成有基于区块链的模拟交易装置,基于区块链的模拟交易设备100中运行基于区块链的模拟交易对应的可读存储介质,以执行基于区块链的模拟交易的步骤。
可以理解的是,图1所示基于区块链的模拟交易的场景中的基于区块链的模拟交易设备,或者基于区块链的模拟交易设备中包含的装置并不构成对本发明实施例的限制,即,基于区块链的模拟交易的场景中包含的设备数量、设备种类,或者各个设备中包含的装置数量、装置种类不影响本发明实施例中技术方案整体实现,均可以算作本发明实施例要求保护技术方案的等效替换或衍生。
本发明实施例中基于区块链的模拟交易设备100主要用于:
在区块落盘时,将账本数据整理形成预定义的批处理请求;
将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件;
若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照;
在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易。
本发明实施例中该基于区块链的模拟交易设备100可以是独立的基于区块链的模拟交易设备,也可以是基于区块链的模拟交易设备组成的基于区块链的模拟交易设备网络或基于区块链的模拟交易设备集群,例如,本发明实施例中所描述的基于区块链的模拟交易设备100,其包括但不限于计算机、网络主机、单个网络基于区块链的模拟交易设备、多个网络基于区块链的模拟交易设备集或多个基于区块链的模拟交易设备构成的云基于区块链的模拟交易设备。其中,云基于区块链的模拟交易设备由基于云计算(Cloud Computing)的大量计算机或网络基于区块链的模拟交易设备构成。
本领域技术人员可以理解,图1中示出的应用环境,仅仅是与本申请方案一种应用场景,并不构成对本申请方案应用场景的限定,其他的应用环境还可以包括比图1中所示更多或更少的基于区块链的模拟交易设备,或者基于区块链的模拟交易设备网络连接关系,例如图1中仅示出1个基于区块链的模拟交易设备,可以理解的,该基于区块链的模拟交易的场景还可以包括一个或多个其他基于区块链的模拟交易设备,具体此处不作限定;该基于区块链的模拟交易设备100中还可以包括存储器。
此外,本申请基于区块链的模拟交易的场景中基于区块链的模拟交易设备100可以设置显示装置,或者基于区块链的模拟交易设备100中不设置显示装置与外接的显示装置200通讯连接,显示装置200用于输出基于区块链的模拟交易设备中基于区块链的模拟交易方法执行的结果。基于区块链的模拟交易设备100可以访问后台数据库300,其中,后台数据库可以是基于区块链的模拟交易设备的本地存储器中,后台数据库还可以设置在云端,后台数据库300中保存有基于区块链的模拟交易相关的信息。
需要说明的是,图1所示的基于区块链的模拟交易的场景示意图仅仅是一个示例,本发明实施例描述的基于区块链的模拟交易的场景是为了更加清楚的说明本发明实施例的技术方案,并不构成对于本发明实施例提供的技术方案的限定。
基于上述基于区块链的模拟交易的场景,提出了基于区块链的模拟交易方法的实施例。
参照图2,图2为本申请实施例中基于区块链的模拟交易方法的一个实施例流程示意图,该基于区块链的模拟交易方法包括步骤201-204:
201,在区块落盘时,将账本数据整理形成预定义的批处理请求。
本实施例中基于区块链的模拟交易方法应用在基于区块链的模拟交易设备,又叫节点设备,基于区块链的模拟交易设备种类不作具体限定,例如,基于区块链的模拟交易设备可以是终端或者服务器。
本申请通过在节点设备的区块执行层引入一种MVCC(Multi-VersionConcurrency Control多版本并发控制,MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存)的读缓存,来实现模拟交易的正确执行。这样可以实现模拟交易执行流程对出块主流程几乎无影响,同时能够保证模拟交易执行的正确性。具体地:
在本实施例中节点设备预先设备账本键值对相关结构,区块落盘时,节点设备将账本数据整理形成预定义的批处理请求,即,节点设备根据账本键值对相关结构将账本数据整理形成批处理请求,其中,节点设备中预先维护的账本键值对相关结构包括:
valueVersions(值版本):这是一个map结构,key值就是账本中的key值,value值是一个双向链表,记录了多个版本下的这个key对应的value值,每当新产生的区块对这个key有修改时,链表中就会追加一项。链表中的元素除了要记录链表的prev和next指针外,还需要记录value值和这个value值对应的区块版本号。为了加快链表相关的某些遍历和寻址操作,链表结构体中除了记录头、尾指针,还会记录节点的位置与区块版本号的映射关系。根据上面的设计,valueVersion字段可以提供一种账本数据key-value的MVCC读取模式。即可以通过指定的key和区块版本号,快速的索引到相应的value。
keyVersions(密钥版本):这是一个map结构,key值为区块版本号,value值为这个区块提交时修改的账本key的集合。一方面,存储这样一个结构,在做过期的value版本清理时,这个结构可以起到很好的索引作用。因为清理旧版本数据时,入参一定是一个区块版本号范围,那么可以通过遍历这个结构,得到快速的定位到哪些key会存在需要删除的数据,接着通过valueVersions字段,可以快速的索引到哪些旧版本的value应该被删除。
readReqMap(读请求映射):这是一个map结构,key为区块版本号,value为SeqNoRef结构体,这个结构体中封装了当前该区块版本号的引用计数,以及在处理这个引用变更申请时,底层数据库Snapshot接口的返回值。
persistedSeqNo:已经完成持久化的seqNo,这个值在模拟交易读取流程中会读到,在正常提交区块的主流程中会修改,但这个修改需要下述的锁配合控制;
persistedSeqNoLock:一个排它锁,控制上述persistedSeqNo字段的更改和读取;
202,将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件。
节点设备将批处理请求刷入到读缓存,其中,读缓存中包括监听各类用户请求事件的信道(channel),节点设备通过读缓存监听批处理请求中的区块请求事件。本实施例中读缓存监听的区块请求事件包括但不仅限于:出块时产生的账本修改集事件、用户发起模拟交易时指定的区块版本号版本事件、用户在模拟交易执行完成后发起的释放区块版本号版本事件、用户发起的清除(Purge)请求事件、用户发起的舍弃(Abandon)请求事件。
203,若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照。
若区块请求事件是模拟交易,节点设备则调用读缓存中的快照数据接口申请模拟交易中目标区块版本号对应的第一快照,即,节点设备确定区块请求事件是模拟交易,节点设备调用读缓存中的快照数据接口,获取模拟交易中目标区块版本号对应的第一快照。
204,在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易。
在获得所述第一快照之后,节点设备调用读缓存中的读数据接口执行模拟交易。即,节点设备会为其准备一套独立的虚拟机执行环境,如果涉及到账本数据的读取,则使用模拟交易读缓存结构实现读取功能。
1)首先,用户需要向模拟交易读缓存中发送一个快照请求,其参数为一个区块版本号,常驻协程会处理这个请求(即“用户发起模拟交易时指定的区块版本号版本事件”),处理逻辑为在readReqMap中记录该seqNo,即将其引用计数+1,同时调用模拟交易读缓存中的底层数据库的Snapshot接口,并暂存snapshot操作的返回值,同时,在persistedSeqNoLock的保护下,将persistedSeqNo字段赋值到snapshot引用中暂存。
需要补充说明的是:上述的操作过程意味着,底层数据库需要支持MVCC模式的读取操作。同时,因为各个事件都是从不同的channel中获取的,因此常驻协程中处理逻辑可以实现为select-case的模式,这就保证了各个事件的处理不会并发,那么这时做数据库的snapshot操作,此时数据库一定处于一个没有写入新区块的数据的状态,可以保证后续的读取操作的正确性。而这个snapshot操作的返回值需要被暂存起来,用于后续的数据库(又叫db)读取时使用。对于支持MVCC模式的数据库,snapshot的返回结构一般都是版本号相关的数据,或者返回一个新开启的事务的引用,因此其占用的内存大小基本可以忽略不计,这里不会造成大量的内存消耗。
2)然后开始执行模拟交易,当需要读取账本数据时,会调用Read接口。
3)模拟交易读缓存的Read接口处理流程为:尝试从valueVersions字段中获取该key对应的链表。如果存在,则直接从链表中读取该区块版本号对应的value。如果链表中存在该区块版本号对应的value,则可以直接返回给用户,处理流程结束。如果valueVersions字段中不存在该key对应的链表,或链表中不存在该区块版本号对应的value,则从ReadReqMap结构中获取其维护的底层数据库的snapshot引用,
比较snapshot引用中记录的“已持久化的SeqNo”和入参SeqNo。如果“已持久化的SeqNo”大于“入参SeqNo”,则认为入参seqNo提交时刻对应的值已经无法读到,直接返回读取失败;如果“已持久化的SeqNo”等于“入参SeqNo”,直接使用snapshot引用中维护的db的snapshot的返回值执行Read操作,得到返回结果;如果“已持久化的SeqNo”小于“入参SeqNo”,这里的处理比较复杂,首先要加锁取出模拟交易读缓存结构体中维护的maxSeq的值(称为maxSeqNo-a)。然后需要遍历“已持久化的SeqNo”+1到模拟交易读缓存结构体中维护的maxSeq字段中间的所有keyVersions字段,针对[“已持久化的SeqNo”+1,入参seqNo]范围内的keyVersions字段的value,如果存在入参的key,则直接返回这个key对应的value值;针对(入参seqNo,模拟交易读缓存结构体中维护的maxSeq字段]范围内的keyVersions字段的value,如果存在入参的key,则认为入参seqNo对应的value已经丢失,返回读取失败的错误,如果不存在入参的key,则此时存在两种不同的处理逻辑,一种是由于不确定此时数据库的状态,可以直接认为读取失败;另一种方案为:加锁控制其他协程中无法更新maxSeqNo,然后读取maxSeqNo-b,针对(maxSeqNo-a,maxSeqNo-b]范围内的keyVersions字段的value,检查是否存在入参的key,如果存在,则认为入参seqNo对应的value已经丢失,返回读取失败的错误;如果不存在,则直接从当前的数据库中读取该key对应的value,作为返回值。然后释放控制maxSeqNo的锁。
为了方便理解本实施例中给出两个具体实现方案,包括:
实现方案一:目前用户正在提交区块11,用户希望基于区块版本号为10时的状态执行一笔模拟交易,且这笔模拟交易期望读取key为A的value。
首先,用户发起的模拟交易会申请一个区块版本号为10的snapshot,节点设备所处区块链的常驻协程中的readReqVer整个channel会收到通知消息,此时11号区块向常驻协程推送新区块的账本修改集的操作会被阻塞,因此,此时读缓存系统可以获得一个磁盘上刚刚提交了10号区块后的snapshot。
然后,用户在读取A状态的value时,会尝试从读缓存的valueVersions中尝试获取A相应的value队列,如果存在,则直接返回该值。如果valueVersions中没有A这个key,则需要遍历keyVersions,确认10号以后的所有seqNo对应的修改集没有这个key相关的内容。确认过后,从db读取该value。
实现方案二:目前用户正在提交区块12,用户希望基于区块版本号为10时的状态执行一笔模拟交易,且这笔模拟交易期望读取key为A的value。区块11在提交时也修改了A的value。
首先,用户发起的模拟交易会申请一个区块版本号为10的snapshot,常驻协程中的readReqVer整个channel会收到通知消息,db的snapshot会保存11号区块落盘后的数据库状态。
然后,用户在读取A状态的value时,会发现10号区块的keyVersions字段中没有这个key的记录;然后比较snapshot中的persistedSeqNo(这个值为11),此时大于入参的seqNo(10),则认为区块10提交后时刻的A的状态值丢失,返回读取错误。
本实施例中通过设置读缓存,在区块落盘时,将账本数据整理形成预定义的批处理请求,并将批处理请求刷入到读缓存,通过多版本并发控制的读缓存,实现批处理请求中模拟交易和出块主流程并发控制,使得模拟交易的执行流程和出块的主流程互不影响,保证模拟交易时出块主流程的执行效率,同时有效保障区块数据的统一性。
参照图3,图3是本申请实施例中提供的基于区块链的模拟交易方法中配置多版本并发控制的读缓存的一个实施例的流程示意图。
在本申请一些实施例中,基于区块链的模拟交易方法中配置多版本并发控制的读缓存,使得模拟操作和出块流程互不影响,具体地,包括步骤301-304:
301,在区块链执行层配置多版本并发控制的读缓存,其中,所述读缓存包括快照数据接口、读数据接口、清除数据接口和舍弃数据接口。
在区块链执行层配置多版本并发控制的读缓存,其中,所述读缓存包括快照数据接口、读数据接口、清除数据接口和舍弃数据接口
具体地,区块执行层的逻辑设计:由于交易的执行基本上都是内存操作,而区块和其相关数据的持久化为磁盘操作,两者存在着天然的速度差距。为了能够提高平台的整体吞吐量,很多平台都采用了交易执行与区块落盘流水线执行的模式。也就是说,区块执行模块执行完了一个区块的交易后,可以的得到一份最新的世界状态,然后不需要等待最新的世界状态落盘,而可以直接继续执行下一个区块的交易。为了在这样的设计下保证模拟交易执行的正确性,在交易执行层引入了读缓存组件。读缓存组件可以分为两个部分:一部分是专门用于出块主流程逻辑,另一部分用于模拟交易的执行逻辑。
在本实施例中出块主流程读缓存,包括:
首先,在区块内的交易执行过程中,先在这层读缓存内进行读取;如果读取不到,则再通过statedb或者磁盘读取。每次区块对账本数据的修改,都要刷入到缓存中。这部分读缓存占用固定大小的内存,淘汰策略使用策略或一些常规的改进策略,例如,实现方式一:淘汰策略为时间策略,按照账本数据的保存时间优先淘汰最先存储的数据;实现方式二:淘汰策略为占用空间策略,即,按照占用存储空间的大小,优先淘汰占用空间较多的数据;实现方式三:淘汰策略为访问频率策略,即,根据访问频率的高低,优先淘汰访问频率低的数据,本领域技术人员可以理解的是,淘汰策略不构成本方案的限制,可以将上述三种方式进行组合,提高存储空间使用效率。
在本实施例中模拟交易读缓存,包括:
首先,在区块落盘时,本区块对账本数据的修改会被整合成一种预定的批处理请求,先刷入到读缓存中。然后再进行数据的真正落盘。模拟交易的执行过程中如果需要读取账本数据,则需要指定一个区块版本号seqNo,然后首先在模拟交易读缓存中读取seqNo号区块提交完成后、seqNo+1号区块开始提交前的账本数据。如果读取不到,则尝试读取磁盘上的数据。因为出块主流程是一直运行的,所以磁盘上的数据可能已被更新成了seqNo+N时的状态,因此这种方案存在一种特殊情况:即模拟交易执行过程中,平台端可能识别到,某一个key已经无法读到入参指定的seqNo时的value。此时,该模拟交易的执行会返回失败。
本实施例中将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件之后,所述方法包括:
302,通过所述读缓存中的读数据接口读取所述批处理请求中的区块请求事件,并判断所述区块请求事件是否为模拟交易。
303,若所述区块请求事件不是模拟交易,则根据所述区块请求事件的事件类型执行所述区块请求事件;
304,若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照。
节点设备通过读缓存中的读数据接口读取批处理请求中的区块请求事件,终端并判断区块请求事件是否为模拟交易;若区块请求事件不是模拟交易,节点设备则根据区块请求事件的事件类型执行所述区块请求事件;若区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照。本实施例中在区块链执行层配置多版本并发控制的读缓存,可以使得模拟请求和出块主流程互不影响。
参照图4,图4是本申请实施例中提供的基于区块链的模拟交易方法中账本修改集事件处理的一个实施例的流程示意图。
在本申请一些实施例中,基于区块链的模拟交易方法中区块请求事件是出块时产生的账本修改集事件处理步骤的实施例,具体地,包括401-405:
401,若所述区块请求事件不是模拟交易,则确定所述区块请求事件是否为出块时产生的账本修改集事件;
402,若所述区块请求事件是账本修改集事件,则读取所述账本修改集事件中的区块版本号和账本修改集内容;
403,遍历所述账本修改集内容,提取所述账本修改集内容中的各键值对,并判断所述读缓存的值版本字段中是否包含所述键值对中的键;
404,若读缓存的值版本字段中包含所述键值对中的键,则提取所述键对应的链表,并将所述区块版本号和所述值构造一个链表元素;
405,将所述链表元素插入到所述读缓存中链表的尾部,并更新所述读缓存中的区块版本号。
即,本实施例中区块请求事件不是模拟交易,则确定所述区块请求事件的事件类型,根据区块请求事件的事件类型进行事件处理,具体地:
区块请求事件是出块时产生的账本修改集事件,节点设备处理步骤,包括:
1、读取事件中包含的区块版本号和账本修改集内容;
2、遍历账本修改集内容,针对每一个键值对,作如下操作,直至遍历完成:
a、判断valueVersions字段中是否存在这个key,如果不存在,则在valueVersions字段中为这个key创建一个链表,如果存在,则直接取出这个链表。
b、使用入参区块版本号和value构造一个链表中的元素结构,并将这个元素插入到链表的尾部;
c、更新常驻协程中维护的lastCached字段,将其赋值为入参区块版本号,表示模拟交易读缓存中已经缓存完成的最大区块版本号;
d、为了应对用户的读操作请求,需要以加锁的方式更新模拟交易读缓存结构中维护的已缓存的最大区块版本号字段。
本实施例中区块请求事件不是模拟交易,节点设备执行账本修改集事件,以保障区块链正常流程的执行,同时保证数据一致性。
参照图5,图5是本申请实施例中提供的基于区块链的模拟交易方法中清理请求事件或舍弃请求事件处理的一个实施例的流程示意图。
在本申请一些实施例中,基于区块链的模拟交易方法中清理请求事件或舍弃请求事件处理的步骤,具体地,步骤501-505:
501,若所述区块请求事件不是模拟交易,则确定所述区块请求事件是否为清理请求事件或舍弃请求事件;
502,若所述区块请求事件是清理请求事件或舍弃请求事件,则获取所述清理请求事件或舍弃请求事件中包含的区块版本号,将所述清理请求事件或舍弃请求事件中包含的区块版本号和历史清除版本号进行比对,判断对所述区块版本号的清理请求事件或舍弃请求事件是否合法;
503,若对所述区块版本号的清理请求事件或舍弃请求事件不合法,则退出所述清理请求事件或所述舍弃请求事件的执行流程;
504,若对所述区块版本号的清理请求事件或舍弃请求事件合法,则清除所述读缓存的值版本字段中的所述区块版本号,并获取所述区块版本号对应的键集合;
505,遍历所述键集合删除所述区块版本号对应的链表元素,并更新所述读缓存中的区块版本号。
若所述区块请求事件不是模拟交易,则确定所述区块请求事件是否为清理请求事件或舍弃请求事件。若区块请求事件是清理(Purge)请求事件,Purge请求事件处理流程为:
1、Purge请求的入参为一个区块版本号,首先要判断这个区块版本号的Purge请求是否是一个合法的Purge请求,判读方式为,这个区块版本号必须要大于常驻协程中维护的lastCleared字段记录的区块版本号(lastCleared表示的是已经被清理掉的最大区块版本号)。如果不合法,则直接结束处理流程。
2、如果上述Purge请求合法,则首先清理掉模拟交易读缓存结构中维护的readReqMap字段中的该区块版本号相关项。因为用户的读请求会直接产生对指定区块版本号的引用,而正在被引用的区块版本号相关的value,不能够被删除。而上文提到Purge请求的处理逻辑优先级较高,可以无视引用计数规则,直接删除相关版本的数据。因此这里首先将readReqMap中的该区块版本号对应项删除。
3、接着,对于该入参区块版本号和该区块版本号之前的区块版本号,依次做如下操作:
a、获取keyVersions字段中,该seqNo对应的key集合;
b、这个key集合,从valueVersions中读取到相应的链表;
c、删除链表中该区块版本号对应的链表元素;
d、待上述c遍历操作结束后,删除keyVersions中该区块版本号对应项;
e、将常驻协程中维护的lastCleared值+1;
若所述区块请求事件不是模拟交易,则确定所述区块请求事件是否为清理请求事件或舍弃请求事件,若所述区块请求事件是舍弃(Abandon)请求事件,执行Abandon请求事件的处理,其中,Abandon请求的处理机制与Purge请求几乎一致,这里简单说明其处理规则:
1、判断Abandon请求的入参区块版本号是否合法。因为外部的砍块规则目前为一次砍一个块,因此其判断规则为,入参区块版本号等于常驻协程中维护的lastCached字段,即为合法请求。如果请求非法,处理流程直接退出;
2、如果请求合法,则删除readReqMap字段中对应的该区块版本号项;
3、接着,对于该入参区块版本号,做如下操作:
a、获取keyVersions字段中,该seqNo对应的key集合;
b、遍历这个key集合,从valueVersions中读取到相应的链表;
c、删除链表中该区块版本号对应的链表元素;
d、待上述c遍历操作结束后,删除keyVersions中该区块版本号对应项;
e、更新常驻协程中维护的lastCached字段为入参区块版本号-1;
f、加锁更新模拟交易结构体中的maxSeq字段为协程维护的lastCached值。
本实施例中节点设备在设备读缓存之后,正常处理清除请求事件和舍弃请求事件,使得模拟操作不影响正常的操作请求。
参照图6,图6是本申请实施例中提供的基于区块链的模拟交易方法中版本数据自动清除的一个实施例的流程示意图。
在本申请一些实施例中,基于区块链的模拟交易方法中版本数据自动清除的步骤,具体地,包括601-603:
601,读取所述读缓存中历史清除信息到当前清除信息之间的各区块版本号,和各所述区块版本号的引用次数,判断所述区块版本号的引用次数是否为零;
602,若所述区块版本号的引用次数为零,则获取所述区块版本号对应的键集合;
603,遍历所述键集合,删除所述区块版本号对应的链表元素,并更新所述读缓存中的区块版本号。
节点设备所处区块链的协程中还会维护一个计时器,每次计时器到时,就会自动执行一次清理旧版本数据的工作。接下来会对各种事件的处理机制以及用户使用读缓存的流程做详细解释。遍历常驻协程维护的lastCleared+1到lastCached范围内的所有区块版本号,针对每一个区块版本号,做如下操作:
1、读读缓存结构中维护的readReqMap字段中该区块版本号对应项,如果其引用计数不为0,则意味着该区块版本号目前存在着模拟交易正在对其引用。通过目前该区块版本号有引用的事实,我们保守的认为,后续的区块版本号相关数据,可能用户会有后续的读取需求,因此直接跳出循环,清理结束;
2、如果readReqMap中记录的该区块版本号的引用计数为0,则认为该区块版本号相关数据可以安全的清理,那么执行如下流程:
a、获取keyVersions字段中,该seqNo对应的key集合;
b、便利这个key集合,从valueVersions中读取到相应的链表;
c、删除链表中该区块版本号对应的链表元素;
d、待上述遍历操作结束后,删除keyVersions中该区块版本号对应项;
e、将常驻协程中维护的lastCleared字段+1;
由于旧版本数据清理逻辑的存在,模拟交易读缓存中不会存在大量的旧版本数据的挤压,内存使用量属于可控范围。因为这个自动清理的流程是定时触发的,因此如果内存使用量过大且用户没有旧版本数据的使用需求时,可以手动触发Purge操作,辅助进行旧版本数据清理。
本实施例中通过对读缓存中的版本数据进行自动清除,可以避免数据累积占用读缓存的情况,同时方便进行数据处理。
参照图7,图7是本申请实施例中提供的基于区块链的模拟交易方法中模拟操作执行过程中接收到新区块的账本修改操作时的一个实施例的流程示意图。
在本申请一些实施例中,基于区块链的模拟交易方法中模拟操作执行过程中接收到新区块的账本修改操作时节点设备的处理步骤,具体地,包括701-703:
701,接收新区块的账本修改操作,阻塞所述账本修改操作,并获取磁盘中当前区块版本号对应的第二快照;
702,解除对所述账本修改操作的阻塞,并保存所述第一快照的内容和所述第二快照的内容,以供执行所述模拟交易和/或所述账本修改操作时使用;
703,若根据所述第一快照的内容和所述第二快照的内容未获取到所述模拟操作对应区块版本号的目标数据,则输出所述模拟操作错误的提示信息。
即,节点设备接收新区块的账本修改操作,节点设备阻塞账本修改操作,节点设备获取磁盘中当前区块版本号对应的第二快照;在获取到第二快照之后解除所述阻塞,节点设备保存所述第一快照的内容和所述第二快照的内容,并解除对所述账本修改操作的阻塞,以供执行所述模拟交易和/或所述账本修改操作时使用;若根据所述第一快照的内容和所述第二快照的内容未获取到所述模拟操作对应区块版本号的目标数据,节点设备则输出所述模拟操作错误的提示信息。
本申请实施例中模拟操作执行过程中,节点设备接收到新区块的账本修改操作,节点设备将新区块的账本修改操作进行阻断,在用户无感知的情况下实现模拟操作和账本修改操作。
如图8所示,图8是基于区块链的模拟交易装置的一个实施例结构示意图。
为了更好实施本申请实施例中基于区块链的模拟交易方法,在基于区块链的模拟交易方法基础之上,本申请实施例中还提供一种基于区块链的模拟交易装置,所述基于区块链的模拟交易装置包括:
数据处理模块801,用于在区块落盘时,将账本数据整理形成预定义的批处理请求;
缓存监听模块802,用于将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件;
接口调用模块803,用于若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照;
模拟操作模块804,用于在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易。
在本申请一些实施例中,所述基于区块链的模拟交易装置,包括:
在区块链执行层配置多版本并发控制的读缓存,其中,所述读缓存包括快照数据接口、读数据接口、清除数据接口和舍弃数据接口;
通过所述读缓存中的读数据接口读取所述批处理请求中的区块请求事件,并判断所述区块请求事件是否为模拟交易;
若所述区块请求事件不是模拟交易,则根据所述区块请求事件的事件类型执行所述区块请求事件;
若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照。
在本申请一些实施例中,所述基于区块链的模拟交易装置,所述若所述区块请求事件不是模拟交易,则根据所述区块请求事件的事件类型执行所述区块请求事件,包括:
若所述区块请求事件不是模拟交易,则确定所述区块请求事件是否为出块时产生的账本修改集事件;
若所述区块请求事件是账本修改集事件,则读取所述账本修改集事件中的区块版本号和账本修改集内容;
遍历所述账本修改集内容,提取所述账本修改集内容中的各键值对,并判断所述读缓存的值版本字段中是否包含所述键值对中的键;
若读缓存的值版本字段中包含所述键值对中的键,则提取所述键对应的链表,并将所述区块版本号和所述值构造一个链表元素;
将所述链表元素插入到所述读缓存中链表的尾部,并更新所述读缓存中的区块版本号。
在本申请一些实施例中,所述基于区块链的模拟交易装置,所述若所述区块请求事件不是模拟交易,则根据所述区块请求事件的事件类型执行所述区块请求事件,包括:
若所述区块请求事件不是模拟交易,则确定所述区块请求事件是否为清理请求事件或舍弃请求事;
若所述区块请求事件是清理请求事件或舍弃请求事件,则获取所述清理请求事件或舍弃请求事件中包含的区块版本号;
将所述清理请求事件或舍弃请求事件中包含的区块版本号和历史清除版本号进行比对,判断对所述区块版本号的清理请求事件或舍弃请求事件是否合法;
若对所述区块版本号的清理请求事件或舍弃请求事件不合法,则退出所述清理请求事件或所述舍弃请求事件的执行流程;
若对所述区块版本号的清理请求事件或舍弃请求事件合法,则清除所述读缓存的值版本字段中的所述区块版本号,并获取所述区块版本号对应的键集合;
遍历所述键集合删除所述区块版本号对应的链表元素,并更新所述读缓存中的区块版本号。
在本申请一些实施例中,所述基于区块链的模拟交易装置,包括:
读取所述读缓存中历史清除信息到当前清除信息之间的各区块版本号,和各所述区块版本号的引用次数,判断所述区块版本号的引用次数是否为零;
若所述区块版本号的引用次数为零,则获取所述区块版本号对应的键集合;
遍历所述键集合,删除所述区块版本号对应的链表元素,并更新所述读缓存中的区块版本号。
在本申请一些实施例中,所述基于区块链的模拟交易装置,包括:
接收新区块的账本修改操作,阻塞所述账本修改操作,并获取磁盘中当前区块版本号对应的第二快照;
解除对所述账本修改操作的阻塞,并保存所述第一快照的内容和所述第二快照的内容,以供执行所述模拟交易和/或所述账本修改操作时使用。
在本申请一些实施例中,所述基于区块链的模拟交易装置,包括:
若根据所述第一快照的内容和所述第二快照的内容未获取到所述模拟操作对应区块版本号的目标数据,则输出所述模拟操作错误的提示信息。
上述模拟交易装置用于执行上述基于区块链的模拟交易方法实施例中任一实施例中所述的基于区块链的模拟交易方法中的步骤,此处不再赘述。
本申请实施例中基于区块链的模拟交易装置通过设置读缓存,在区块落盘时,将账本数据整理形成预定义的批处理请求,并将批处理请求刷入到读缓存,通过多版本并发控制的读缓存,实现批处理请求中模拟交易和出块主流程并发控制,使得模拟交易的执行流程和出块的主流程互不影响,保证模拟交易时出块主流程的执行效率,同时有效保障区块数据的统一性。
本发明实施例还提供一种基于区块链的模拟交易设备,如图9所示,图9是本申请实施例中提供的基于区块链的模拟交易设备的一个实施例结构示意图。
基于区块链的模拟交易设备集成了本发明实施例所提供的任一种基于区块链的模拟交易装置,所述基于区块链的模拟交易设备包括:
一个或多个处理器;
存储器;以及
一个或多个应用程序,其中所述一个或多个应用程序被存储于所述存储器中,并配置为由所述处理器执行上述基于区块链的模拟交易方法实施例中任一实施例中所述的基于区块链的模拟交易方法中的步骤。
具体来讲:基于区块链的模拟交易设备可以包括一个或者一个以上处理核心的处理器901、一个或一个以上可读存储介质的存储器902、电源903和输入单元904等部件。本领域技术人员可以理解,图9中示出的基于区块链的模拟交易设备结构并不构成对基于区块链的模拟交易设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
处理器901是该基于区块链的模拟交易设备的控制中心,利用各种接口和线路连接整个基于区块链的模拟交易设备的各个部分,通过运行或执行存储在存储器902内的软件程序和/或模块,以及调用存储在存储器902内的数据,执行基于区块链的模拟交易设备的各种功能和处理数据,从而对基于区块链的模拟交易设备进行整体监控。可选的,处理器901可包括一个或多个处理核心;优选的,处理器901可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器901中。
存储器902可用于存储软件程序以及模块,处理器901通过运行存储在存储器902的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器902可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据基于区块链的模拟交易设备的使用所创建的数据等。此外,存储器902可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器902还可以包括存储器控制器,以提供处理器901对存储器902的访问。
基于区块链的模拟交易设备还包括给各个部件供电的电源903,优选的,电源903可以通过电源管理系统与处理器901逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源903还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
该基于区块链的模拟交易设备还可包括输入单元904,该输入单元904可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。
尽管未示出,基于区块链的模拟交易设备还可以包括显示单元等,在此不再赘述。具体在本实施例中,基于区块链的模拟交易设备中的处理器901会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器902中,并由处理器901来运行存储在存储器902中的应用程序,从而实现各种功能,如下:
在区块落盘时,将账本数据整理形成预定义的批处理请求;
将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件;
若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照;
在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易。
本领域普通技术人员可以理解,上述实施例的各种方法中的全部或部分步骤可以通过指令来完成,或通过指令控制相关的硬件来完成,该指令可以存储于一可读存储介质中,并由处理器进行加载和执行。
为此,本发明实施例提供一种可读存储介质,该可读存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,Random Access Memory)、磁盘或光盘等。其上存储有计算机程序,所述计算机程序被处理器进行加载,以执行本发明实施例所提供的任一种基于区块链的模拟交易方法中的步骤。例如,所述计算机程序被处理器进行加载可以执行如下步骤:
在区块落盘时,将账本数据整理形成预定义的批处理请求;
将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件;
若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照;
在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见上文针对其他实施例的详细描述,此处不再赘述。
具体实施时,以上各个单元或结构可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个单元或结构的具体实施可参见前面的方法实施例,在此不再赘述。
以上各个操作的具体实施可参见前面的实施例,在此不再赘述。
以上对本申请实施例所提供的一种基于区块链的模拟交易方法进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (10)
1.一种基于区块链的模拟交易方法,其特征在于,所述基于区块链的模拟交易方法包括:
在区块落盘时,将账本数据整理形成预定义的批处理请求;
将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件;
若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照;
在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易。
2.根据权利要求1所述的基于区块链的模拟交易方法,其特征在于,所述将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件之前,所述方法包括:
在区块链执行层配置多版本并发控制的读缓存,其中,所述读缓存包括快照数据接口、读数据接口、清除数据接口和舍弃数据接口;
所述将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件之后,所述方法包括:
通过所述读缓存中的读数据接口读取所述批处理请求中的区块请求事件,并判断所述区块请求事件是否为模拟交易;
若所述区块请求事件不是模拟交易,则根据所述区块请求事件的事件类型执行所述区块请求事件;
若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照。
3.根据权利要求2所述的基于区块链的模拟交易方法,其特征在于,所述若所述区块请求事件不是模拟交易,则根据所述区块请求事件的事件类型执行所述区块请求事件,包括:
若所述区块请求事件不是模拟交易,则确定所述区块请求事件是否为出块时产生的账本修改集事件;
若所述区块请求事件是所述账本修改集事件,则读取所述账本修改集事件中的区块版本号和账本修改集内容;
遍历所述账本修改集内容,提取所述账本修改集内容中的各键值对,并判断所述读缓存的值版本字段中是否包含所述键值对中的键;
若读缓存的值版本字段中包含所述键值对中的键,则提取所述键对应的链表,并将所述区块版本号和所述值构造一个链表元素;
将所述链表元素插入到所述读缓存中链表的尾部,并更新所述读缓存中的区块版本号。
4.根据权利要求2所述的基于区块链的模拟交易方法,其特征在于,所述若所述区块请求事件不是模拟交易,则根据所述区块请求事件的事件类型执行所述区块请求事件,包括:
若所述区块请求事件不是模拟交易,则确定所述区块请求事件是否为清理请求事件或舍弃请求事件;
若所述区块请求事件是清理请求事件或舍弃请求事件,则获取所述清理请求事件或舍弃请求事件中包含的区块版本号;
将所述清理请求事件或舍弃请求事件中包含的区块版本号和历史清除版本号进行比对,判断对所述区块版本号的清理请求事件或舍弃请求事件是否合法;
若对所述区块版本号的清理请求事件或舍弃请求事件不合法,则退出所述清理请求事件或所述舍弃请求事件的执行流程;
若对所述区块版本号的清理请求事件或舍弃请求事件合法,则清除所述读缓存的值版本字段中的所述区块版本号,并获取所述区块版本号对应的键集合;
遍历所述键集合删除所述区块版本号对应的链表元素,并更新所述读缓存中的区块版本号。
5.根据权利要求1所述的基于区块链的模拟交易方法,其特征在于,所述在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易之后,所述方法包括:
读取所述读缓存中历史清除信息到当前清除信息之间的各区块版本号,和各所述区块版本号的引用次数,判断所述区块版本号的引用次数是否为零;
若所述区块版本号的引用次数为零,则获取所述区块版本号对应的键集合;
遍历所述键集合,删除所述区块版本号对应的链表元素,并更新所述读缓存中的区块版本号。
6.根据权利要求1至5任意一项所述的基于区块链的模拟交易方法,其特征在于,所述若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照之后,所述方法包括:
接收新区块的账本修改操作,阻塞所述账本修改操作,并获取磁盘中当前区块版本号对应的第二快照;
解除对所述账本修改操作的阻塞,并保存所述第一快照的内容和所述第二快照的内容,以供执行所述模拟交易和/或所述账本修改操作时使用。
7.根据权利要求6所述的基于区块链的模拟交易方法,其特征在于,所述解除对所述账本修改操作的阻塞,并保存所述第一快照的内容和所述第二快照的内容,以供执行所述模拟交易和/或所述账本修改操作时使用之后,所述方法包括:
若根据所述第一快照的内容和所述第二快照的内容未获取到所述模拟操作对应区块版本号的目标数据,则输出所述模拟操作错误的提示信息。
8.一种基于区块链的模拟交易装置,其特征在于,所述基于区块链的模拟交易装置包括:
数据处理模块,用于在区块落盘时,将账本数据整理形成预定义的批处理请求;
缓存监听模块,用于将所述批处理请求刷入到读缓存,通过所述读缓存监听所述批处理请求中的区块请求事件;
接口调用模块,用于若所述区块请求事件是模拟交易,则调用所述读缓存中的快照数据接口申请所述模拟交易中目标区块版本号对应的第一快照;
模拟操作模块,用于在获得所述第一快照之后,调用所述读缓存中的读数据接口,以通过所述读数据接口执行所述模拟交易。
9.一种基于区块链的模拟交易设备,其特征在于,所述基于区块链的模拟交易设备包括:
一个或多个处理器;
存储器;以及
一个或多个应用程序,其中所述一个或多个应用程序被存储于所述存储器中,并配置为由所述处理器执行以实现权利要求1至7中任一项所述的基于区块链的模拟交易方法。
10.一种可读存储介质,其特征在于,其上存储有计算机程序,所述计算机程序被处理器进行加载,以执行权利要求1至7任一项所述的基于区块链的模拟交易方法中的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011632263.6A CN112667652B (zh) | 2020-12-31 | 2020-12-31 | 基于区块链的模拟交易方法、装置、设备和可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011632263.6A CN112667652B (zh) | 2020-12-31 | 2020-12-31 | 基于区块链的模拟交易方法、装置、设备和可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112667652A true CN112667652A (zh) | 2021-04-16 |
CN112667652B CN112667652B (zh) | 2022-05-24 |
Family
ID=75413053
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011632263.6A Active CN112667652B (zh) | 2020-12-31 | 2020-12-31 | 基于区块链的模拟交易方法、装置、设备和可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112667652B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20180139278A1 (en) * | 2016-11-14 | 2018-05-17 | International Business Machines Corporation | Decentralized immutable storage blockchain configuration |
CN108241743A (zh) * | 2018-01-04 | 2018-07-03 | 杭州复杂美科技有限公司 | 一种区块链快照方法 |
CN108965468A (zh) * | 2018-08-16 | 2018-12-07 | 北京京东尚科信息技术有限公司 | 区块链网络服务平台及其链码安装方法、存储介质 |
CN109767212A (zh) * | 2018-10-11 | 2019-05-17 | 平安科技(深圳)有限公司 | 基于区块链的资产兑换方法、系统、终端及存储介质 |
CN111488115A (zh) * | 2019-01-28 | 2020-08-04 | 网易(杭州)网络有限公司 | 基于区块链的数据缓存方法、装置、电子设备以及介质 |
-
2020
- 2020-12-31 CN CN202011632263.6A patent/CN112667652B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20180139278A1 (en) * | 2016-11-14 | 2018-05-17 | International Business Machines Corporation | Decentralized immutable storage blockchain configuration |
CN108241743A (zh) * | 2018-01-04 | 2018-07-03 | 杭州复杂美科技有限公司 | 一种区块链快照方法 |
CN108965468A (zh) * | 2018-08-16 | 2018-12-07 | 北京京东尚科信息技术有限公司 | 区块链网络服务平台及其链码安装方法、存储介质 |
CN109767212A (zh) * | 2018-10-11 | 2019-05-17 | 平安科技(深圳)有限公司 | 基于区块链的资产兑换方法、系统、终端及存储介质 |
CN111488115A (zh) * | 2019-01-28 | 2020-08-04 | 网易(杭州)网络有限公司 | 基于区块链的数据缓存方法、装置、电子设备以及介质 |
Non-Patent Citations (1)
Title |
---|
刘星等: "基于区块链的内部模拟市场建设研究与应用", 《电力信息与通信技术》, 25 February 2020 (2020-02-25), pages 30 - 35 * |
Also Published As
Publication number | Publication date |
---|---|
CN112667652B (zh) | 2022-05-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11023448B2 (en) | Data scrubbing method and apparatus, and computer readable storage medium | |
US11442961B2 (en) | Active transaction list synchronization method and apparatus | |
US6341308B1 (en) | Input/output device information management system for multi-computer system | |
US6961865B1 (en) | Techniques for resuming a transaction after an error | |
US6651075B1 (en) | Support for multiple temporal snapshots of same volume | |
RU2397535C2 (ru) | Устройство обработки информации, способ управления областью памяти и компьютерная программа | |
CN101211289A (zh) | 恢复操作管理系统和方法 | |
US11449241B2 (en) | Customizable lock management for distributed resources | |
CN110018989A (zh) | 一种快照比对的方法和装置 | |
CN112052264B (zh) | 业务数据查询方法、装置、电子设备及可读存储介质 | |
US11061889B2 (en) | Systems and methods of managing manifest refresh in a database | |
CN110263048A (zh) | 大批量数据处理方法、装置、计算机设备及存储介质 | |
US8458511B2 (en) | Fault isolation using code paths | |
CN109726264A (zh) | 用于索引信息更新的方法、装置、设备和介质 | |
CN111736975A (zh) | 请求控制方法、装置、计算机设备及计算机可读存储介质 | |
US7752399B2 (en) | Exclusion control method and information processing apparatus | |
JPH08328933A (ja) | 並列処理システムのファイルアクセス制御方式 | |
CN111857939A (zh) | 镜像删除和推送的方法、系统、电子设备及存储介质 | |
CN112667652B (zh) | 基于区块链的模拟交易方法、装置、设备和可读存储介质 | |
WO2020238348A1 (zh) | 区块的验证方法、装置及设备 | |
JPH1063557A (ja) | 分散ファイルの同期方式 | |
CN115687359A (zh) | 数据表分区方法及装置、存储介质、计算机设备 | |
CN113590637A (zh) | 一种多进程共享数据库表更新方法及装置、数据库系统 | |
CN113687921A (zh) | 事务处理方法、装置、分布式数据库系统及电子设备 | |
JP2013033439A (ja) | データベースの管理方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |