CN112579291A - 一种基于StateDB的智能合约并行运行***及并行运行方法 - Google Patents
一种基于StateDB的智能合约并行运行***及并行运行方法 Download PDFInfo
- Publication number
- CN112579291A CN112579291A CN202011533147.9A CN202011533147A CN112579291A CN 112579291 A CN112579291 A CN 112579291A CN 202011533147 A CN202011533147 A CN 202011533147A CN 112579291 A CN112579291 A CN 112579291A
- Authority
- CN
- China
- Prior art keywords
- statedb
- parallel
- execution
- intelligent contract
- write
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/061—Improving I/O performance
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q40/00—Finance; Insurance; Tax strategies; Processing of corporate or income taxes
- G06Q40/04—Trading; Exchange, e.g. stocks, commodities, derivatives or currency exchange
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5011—Pool
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5018—Thread allocation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5021—Priority
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Business, Economics & Management (AREA)
- Accounting & Taxation (AREA)
- Finance (AREA)
- Development Economics (AREA)
- General Business, Economics & Management (AREA)
- Technology Law (AREA)
- Strategic Management (AREA)
- Marketing (AREA)
- Economics (AREA)
- Human Computer Interaction (AREA)
- Computing Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种基于StateDB的智能合约并行运行***,包括:数据存储模块,数据存储模块以StateDB作为智能合约;并行线程池,每一轮并行执行的交易将需要执行的智能合约初始化为vm,分配给并行线程池中的多个线程来执行,多个线程之间通过信号来控制执行进度;虚拟机vm,用于解释执行智能合约语言的中间代码并支持回滚功能;缓存模块StateCache,作为StateDB的缓存装置。采用智能合约并行模型,以StateDB作为智能合约的数据存储模块。智能合约的执行结果,实质上可以视为是一组对StateDB的读写<k,v>数据操作的集合。并行的智能合约执行会使得多个读写操作的集合同时执行,本模型通过同步、回滚等方式,使得并行的过程不会对执行结果与有序串行的执行结果产生差异。
Description
技术领域
本发明涉及区块链技术领域,尤其涉及一种基于StateDB的智能合约并行运行***及并行运行方法。
背景技术
在传统的区块链项目中,区块链***将外部世界的数据请求打包成为特定数据格式的交易并且广播至区块链网络,多个交易被打包为区块并且共识执行。第二代区块链技术中,如以太坊等项目使用了智能合约作为拓展区块链功能的技术。智能合约以代码的形式存在,交易通过运行特定的智能合约来完成更加复杂的需求。区块作为整个区块链网络进行共识的单元,承载着交易的数据传输功能。一个区块中会存储着多个交易。交易按照顺序串行执行。有序、串行的执行特点保证了在当前区块的交易执行阶段中,交易内在的逻辑正确性。此外,如以太坊等基于StateDB数据存储方式,数据的写入顺序将会影响这个数据的状态。多个不同的节点执行有序、串行的交易序列将会使得其StateDB由之前的状态转换的下一个固定的状态。然而,使用并发的方式执行交易会破坏已有交易顺序,并且对写入StateDB数据的顺序也造成了不可预知的影响。
发明内容
有鉴于此,本发明提供一种基于StateDB的智能合约并行运行***及并行运行方法,以StateDB作为智能合约的数据存储模块。智能合约的执行结果,实质上可以视为是一组对StateDB的读写<k,v>数据操作的集合。并行的智能合约执行会使得多个读写操作的集合同时执行,本模型通过同步、回滚等方式,使得并行的过程不会对执行结果与有序串行的执行结果产生差异。
本发明的目的在于提供一种基于StateDB的智能合约并行运行***,包括:
数据存储模块,所述数据存储模块以StateDB作为智能合约;
并行线程池,每一轮并行执行的交易将需要执行的智能合约初始化为vm,分配给所述并行线程池中的多个线程来执行,所述多个线程之间通过信号来控制执行进度;
虚拟机vm,用于解释执行智能合约语言的中间代码并支持回滚功能;
缓存模块StateCache,作为StateDB的缓存装置,每一轮并行开始时,所述缓存模块StateCache初始化,用于缓存所有线程中所述虚拟机vm解释执行所述智能合约源代码中对StateDB的读写记录,所述缓存模块StateCache以{vm优先级序号,本条记录序号,读/写操作,键值,数据值}的形式记录所述虚拟机vm的访问操作。
优选的,智能合约语言为Task语言,文法和C语言类似,拥有3种数据类型:String、int、float,并且支持函数声明、调用参数传值以及递归调用的特性,Task语言的通过***调用的方式与StateDB进行交互。
优选的,当所述智能合约语言源代码中出现了对所述数据存储模块进行交互的动作时,所述智能合约编译器将所述动作编译为一条四元式,所述四元式作为一种中间代码,包含了Task源代码所携带的所有信息,并且易于vm直接解释执行,所述虚拟机vm在执行所述四元式之前,将当前的运行栈备份到运行栈池中,当所述虚拟机vm出现StateDB的读写冲突问题时,将会放弃当前的运行栈,并且从所述运行栈池中寻找一个符合回滚位置的运行栈,作为当前的运行栈,继续执行。
优选的,每一个所述虚拟机vm都有访问所述缓存模块StateCache的权利,但是同一时间只有一个所述虚拟机vm可以访问所述缓存模块StateCache,所述虚拟机vm对所述缓存模块StateCache的访问是互斥的。
优选的,所述虚拟机vm的访问操作的记录条目以链表的形式存在。
优选的,当所有的所述虚拟机vm都运行结束后,StateCache中仍然留存的写操作是本次并行执行智能合约对StateDB真正产生修改的正确写入操作序列,缓存模块StateCache将其按照虚拟机vm优先级进行降序排列并且写入StateDB即可。
本发明的目的还在于提供一种基于StateDB的智能合约并行运行方法,包括步骤:
步骤1,初始化:
在每一轮中,x个交易并行执行,初始化x个执行智能合约的虚拟机vm并且载入智能合约,所述虚拟机vm的优先级以被搭载的交易的顺序为准,越靠前的交易优先级越高,以线程池作为多线程并行执行的载体,每一个vm由一个线程来执行;
步骤2,当虚拟机vm执行到一条需要与StateDB交互的指令时,即读/写StateDB时,并不直接对StateDB进行操作,而是与StateCache进行交互。
优选的,所述步骤2包括:
(1)对<key,value>的读操作:
读操作发生后,首先检查StateDB中的写操作记录,查看是否存在对key的写操作,会出现如下的两种情况:
情况1.StateCache中没有对key的写操作记录
此时可以从真实的StateDB中获取该key的value值,返回value,并且记录该读操作,对StateDB的读操作不改变StateDB的状态;
情况2.StateCache中存在对key的写操作记录
将这些写操作按照所属虚拟机vm分类,记为多个<vm,wset>,其中wset代表以执行顺序排列的写操作列表,遍历每一个<vm,wset>,若虚拟机vm优先级低于本次的读操作,则将回滚至wset中第一条写操作尚未发生的状态,并且从StateCache中删除该条写操作;
之后,检查剩余的写操作,若仍存在对key的写操作记录,则选择最晚发生的一条,将其写入的数据值作为本次读操作的结果返回,并且记录本次读操作。
(2)对<key,value>的写操作
首先检查StateDB中的读操作记录,查看是否存在对key的读操作,会出现如下的两种情况:
情况1.StateCache中没有的key的读操作记录
此时还没有任何vm对key的数据进行读取,故写入key的value不对任何vm产生影响。在StateCache中添加本次的写操作记录。
情况2.StateCache中存在对key的读操作记录
将这些读操作按照所属vm分类,记为多个<vm,rset>,其中rset代表以执行顺序排列的读操作列表。遍历每一个<vm,rset>,若vm优先级低于本次的读操作,则将回滚至rset中第一条读操作尚未发生的状态,并且从StateCache中删除该条读操作;之后,记录本次写操作。
优选的,所述并行运行方法遵守的并行执行原则包括:
a、交易存在既定的顺序,即交易存在优先级。顺序靠后(优先级低)的交易不能因为并行提前而改变顺序靠前(优先级高)的交易的执行结果。
b、并行运行时,对于StateDB的任意一条<k,v>数据:
顺序靠前(优先级高)的交易的读操作不能晚于顺序靠后(优先级低)的交易的写操作;
顺序靠前(优先级高)的交易的写操作一定先于顺序靠后(优先级低)的交易的写操作。
优选的,所述方法为了保证上文中的并行执行原则的应对策略包括:
(1)在一轮并行执行中,当某一个合约对一个数据<k,v>执行读操作时,检查本轮所有已发生的写操作。这些写操作的发起者对应的交易若优先级低于当前合约对应的交易,则将优先级低的交易对应的合约执行状态回滚至尚未对该<k,v>进行写操作的执行状态。
(2)在一轮并行执行中,当某一个合约对一个数据<k,v>执行写操作时,检查本轮所有已发生的读操作,这些读操作的发起者对应的交易若优先级低于当前合约对应的交易,则将优先级低的交易对应的合约执行状态回滚至尚未对该<k,v>进行读操作的状态。
本发明的有益效果:
本发明采用智能合约并行模型,以StateDB作为智能合约的数据存储模块。智能合约的执行结果,实质上可以视为是一组对StateDB的读写<k,v>数据操作的集合。并行的智能合约执行会使得多个读写操作的集合同时执行,本模型通过同步、回滚等方式,使得并行的过程不会对执行结果与有序串行的执行结果产生差异。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要的附图做简单的介绍,显而易见地,下面描述的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为根据本发明实施例的智能合约并行运行***架构原理组成图。
具体实施方式
一、在介绍本实施例之前,介绍相关的概念:
1、数据存储模块——StateDB
由以太坊提出的一种用于存储区块链中账户状态等数据的存储模型,可以视为一种特殊的kv数据库。代码示例如下:
StateDB实现了Merkle Patricia Trie(MPT树)用以组织数据的存储过程。除了传统K-V数据库中get、update、delete方法分别完成对数据的获取、写入、删除之外,StateDB还存在一个字节数组类型的字段:rootHash。由于MPT树的特性,每一次写操作都会改变rootHash。所以,在使用StateDB进行数据存储的过程中,写入数据的内容的不同或写入的顺序不同都将会使得StateDB计算出不同的rootHash值。
在区块进行共识的过程中,***希望节点之间的StateDB保持相同的状态。区块中存在记录rootHash的字段,通过对比rootHash的内容,相同则认为StateDB状态相同。
2、智能合约与交易执行
(1)智能合约
智能合约本质是一段脚本代码,用于完成特定的任务。在以太坊中,智能合约用于改变StateDB的状态。
交易通过指定某一个智能合约并且提供运行该智能合约需要提供的参数,完成其需要的任务需求。
区块链节点是执行智能合约的主体,其拥有智能合约的运行环境,通过从StateDB中加载交易指定的智能合约代码,并且从交易中解析其运行需要的参数,从而执行该智能合约。
(2)交易执行
在大多数区块链***的共识机制实现中,区块作为共识的主体,其中的交易序列会在特定的时期被各个区块链节点执行。交易的执行会修改StateDB,从而使得StateDB的rootHash发生变化。而在区块的共识中,rootHash作为共识的一部分,区块链节点之间希望保持rootHash相同,以证明自身的StateDB中全部的数据都和被共识的区块的发起者相同(即节点之间的数据完全同步)。
由于StateDB的特性,致使执行交易序列的节点需要通过对交易序列进行有序、串行的执行,以保证参与共识的节点在执行本次交易序列时每一次对StateDB的写入动作均保持一致,这样使得每一个节点在执行交易序列之后StateDB从一个确定的状态转移到另一个确定的状态,并且节点之间状态一致。
二、本实施例的应用背景
并行智能合约的本质是通过多线程技术将本应该串行执行的交易并行执行,即使用多个线程同时运行对应的智能合约,达到加速等效果。
然而智能合约的并行存在一定程度的问题,其中最大的问题是共享数据的读写冲突问题。
即核心问题为:数据读写冲突
例如,并行执行两个智能合约C1和C2,两个智能合约均对于某一条数据(其键值为"key1")有如下的操作:
由于并行执行C1和C2代码,并且对同一个StateDB进行操作,使得在StateDB中以"key1"为键的数据发生了读写冲突,并且并行执行无法预测C1和C2的这两行代码在真正执行中的先后顺序。
如果智能合约是使用图灵完备的编程语言所编写,以下的例子会导致更加错误的结果:Account1是一个账户,在执行如下的智能合约之前,其账户中的Balance(余额)为200;
C1、C2和C3均为与Account1余额相关的智能合约并且按照存在逻辑上的顺序(顺序为C1->C2->C3)。其代码如下:
若C1、C2和C3并行执行,则很难预测在C3智能合约中,Account1能否完成正常的购买。因为在C3的代码中存在if-else分支,而Account1的Balance值决定了分支的走向。但是C1和C2合约并行执行导致无法预知C3在执行if-else分支时Account1的Balance值是否大于等于500。
在这个例子中,有序串行得出的正确结果是:Account1在C2中获得足够的余额并且在C3中购买成功。并行执行C1、C2和C3也应当获得如此结果。但是因为并行存在执行顺序的不可预测性导致无法得出正确的结果。进一步,在共识过程中,多个节点自身并行执行区块的交易,会导致执行结果互不相同,很难进行共识,这对于区块链的验证区块过程是不可接受的。
三、参见图1,本实施例基于StateDB的智能合约并行运行***,包括:
数据存储模块,所述数据存储模块以StateDB作为智能合约;
并行线程池,每一轮并行执行的交易将需要执行的智能合约初始化为vm,分配给所述并行线程池中的多个线程来执行,所述多个线程之间通过信号来控制执行进度;
虚拟机vm,用于解释执行智能合约语言的中间代码并支持回滚功能;
缓存模块StateCache,作为StateDB的缓存装置,每一轮并行开始时,所述缓存模块StateCache初始化,用于缓存所有线程中所述虚拟机vm解释执行所述智能合约源代码中对StateDB的读写记录。
其中,智能合约语言为Task语言。
其中,当所述智能合约语言源代码中出现了对所述数据存储模块进行交互的动作时,所述智能合约编译器将所述动作编译为一条四元式,所述虚拟机vm在执行所述四元式之前,将当前的运行栈备份到运行栈池中,当所述虚拟机vm出现StateDB的读写冲突问题时,将会放弃当前的运行栈,并且从所述运行栈池中寻找一个符合回滚位置的运行栈,作为当前的运行栈,继续执行。
其中,每一个所述虚拟机vm都有访问所述缓存模块StateCache的权利,但是同一时间只有一个所述虚拟机vm可以访问所述缓存模块StateCache,所述虚拟机vm对所述缓存模块StateCache的访问是互斥的。
其中,所述缓存模块StateCache以{vm优先级序号,本条记录序号,读/写操作,键值,数据值}的形式记录所述虚拟机vm的访问操作
其中,所述虚拟机vm的访问操作的记录条目以链表的形式存在。
其中,当所有的所述虚拟机vm都运行结束后,StateCache中仍然留存的写操作是本次并行执行智能合约对StateDB真正产生修改的正确写入操作序列,缓存模块StateCache将其按照虚拟机vm优先级进行降序排列并且写入StateDB即可。
本实施例中,为了验证并行算法,在此设计了Task语言作为智能合约的编程语言。Task语言是一种简单的脚本语言,文法和C语言类似,拥有3种数据类型:String、int、float,并且支持函数声明、调用(参数传值)、递归调用等特性。
Task语言的通过***调用的方式与StateDB进行交互,如下为Task代码范例——transfer.task代码文件的文本,用于模拟账户A向账户B发起一笔数量为trans的转账。在StateDB中,账户A与账户B以<账户名,余额值>的形式存在。本段代码将账户A与账户B的余额从StateDB中取出,并且计算转账后两者的新余额,并写回StateDB。
在代码中,GET_INT()和_UPDATE_()均为Task的***调用,用于和StateDB直接交互。Task语言拥有自己的编译器,被编译的Task语言会生成四元式序列,供虚拟机使用。例如transfer.task在编译完成后生成的四元式序列如下:
0:OUTSIDE_DEC String dbName
1:OUTSIDE_DEC String accountA_ID
2:OUTSIDE_DEC String accountB_ID
3:OUTSIDE_DEC int trans
4:FUNCTION_DEC void main
5:TDEC int~t0
6:GETINT~t0 dbName accountA_ID
7:DEC int a
8:ASSIGN int a~t0
9:TDEC int~t1
10:GETINT~t1 dbName accountB_ID
11:DEC int b
12:ASSIGN int b~t1
13:TDEC int~t2
14:LTINT~t2 a trans
15:BNE~t2 1~label0
16:RET
17:LABEL~label0
18:TDEC int~t3
19:SUBINT~t3 a trans
20:ASSIGN int a~t3
21:TDEC int~t4
22:ADD~t4 b trans
23:ASSIGN int b~t4
24:UPDATE dbName accountA_ID a
25:UPDATE dbName accountB_ID b
26:FUNCTION_END main
如上的四元式序列是Task语言编译器将Task源代码编译完毕之后的结果。四元式作为一种中间代码,包含了Task源代码所携带的所有信息,并且易于vm直接解释执行。为了验证并行效果,项目实现了一套解释执行Task语言中间代码的vm(虚拟机)。除了支持对Task的解释执行外,vm还支持回滚功能。当Task源代码中出现了对StateDB进行交互的动作时,Task编译器将会将该动作编译为一条四元式。虚拟机vm在执行该四元式之前,将会把当前的运行栈备份到运行栈池(RuntimeStack Pool)中。当vm出现上述的StateDB的读写冲突问题是,将会放弃当前的运行栈,并且从运行栈池中寻找一个符合回滚位置的运行栈,作为当前的运行栈,继续执行。
StateCache实现:
每一轮并行开始时,将会初始化一个StateCache用来缓存所有线程中vm解释执行Task源代码中对StateDB的读写记录。每一个vm都有访问StateCache的权利,但是同一时间只有一个vm可以访问StateCache(vm对StateCache的访问是互斥的)。StateCache将会以{vm优先级序号,本条记录序号,读/写操作,键值,数据值}的形式记录vm的访问操作。所有的记录条目以链表的形式存在。
当所有的vm都运行结束后,StateCache中仍然留存的写操作是本次并行执行智能合约对StateDB真正产生修改的正确写入操作序列,StateCache将其按照vm优先级进行降序排列并且写入StateDB即可。
本实施例的基于StateDB的智能合约并行运行方法,包括步骤:
为了保证执行结果与有序串行的执行结果相同,则需要遵守如下的并行执行原则:
a、交易存在既定的顺序,即交易存在优先级。顺序靠后(优先级低)的交易不能因为并行提前而改变顺序靠前(优先级高)的交易的执行结果。
b、并行运行时,对于StateDB的任意一条<k,v>数据:
顺序靠前(优先级高)的交易的读操作不能晚于顺序靠后(优先级低)的交易的写操作;
顺序靠前(优先级高)的交易的写操作一定先于顺序靠后(优先级低)的交易的写操作。
1、应对策略
为了保证上文中的并行执行原则,需要如下的应对策略:
(1)在一轮并行执行中,当某一个合约对一个数据<k,v>执行读操作时,检查本轮所有已发生的写操作。这些写操作的发起者对应的交易若优先级低于当前合约对应的交易,则将优先级低的交易对应的合约执行状态回滚至尚未对该<k,v>进行写操作的执行状态。
(2)在一轮并行执行中,当某一个合约对一个数据<k,v>执行写操作时,检查本轮所有已发生的读操作,这些读操作的发起者对应的交易若优先级低于当前合约对应的交易,则将优先级低的交易对应的合约执行状态回滚至尚未对该<k,v>进行读操作的状态。
2、运行时并行算法
(1)初始化:
在每一轮中,x个交易并行执行,初始化x个vm(执行智能合约的虚拟机)并且载入智能合约,vm的优先级以被搭载的交易的顺序为准(越靠前的交易优先级越高)。以线程池作为多线程并行执行的载体,每一个vm由一个线程来执行。由于vm是多线程执行,所以执行的进度和速度均不可控。当然,如果按照优先级,串行执行这些线程,必然可以得到正确的执行结果。
(2)StateCache(StateDB缓存层):
当虚拟机vm执行到一条需要与StateDB交互的指令时(即读/写StateDB),并不直接对StateDB进行操作,而是与StateCache进行交互。StateCache是单一的,每一个虚拟机vm都可以与StateCache操作,虚拟机vm对StateCache的操作是互斥的。StateCache记录每一个线程中的虚拟机vm对StateDB的操作记录,记录的形式为:{vm优先级序号,本条记录序号,读/写操作,键值,数据值}
3、虚拟机vm对StateCache进行读/写操作时,可能发生的情况与对应的解决方式如下:
(1)对<key,value>的读操作:
读操作发生后,首先检查StateDB中的写操作记录,查看是否存在对key的写操作,会出现如下的两种情况:
情况1.StateCache中没有对key的写操作记录
此时可以从真实的StateDB中获取该key的value值,返回value,并且记录该读操作。(对StateDB的读操作不改变StateDB的状态)
情况2.StateCache中存在对key的写操作记录
将这些写操作按照所属虚拟机vm分类,记为多个<vm,wset>,其中wset代表以执行顺序排列的写操作列表。遍历每一个<vm,wset>,若虚拟机vm优先级低于本次的读操作,则将回滚至wset中第一条写操作尚未发生的状态,并且从StateCache中删除该条写操作。
之后,检查剩余的写操作,若仍存在对key的写操作记录,则选择最晚发生的一条,将其写入的数据值作为本次读操作的结果返回,并且记录本次读操作。这样做的目的是防止低优先级的vm提前写入数据,导致高优先级的vm读取了错误的数据。
(2)对<key,value>的写操作
与读操作类似的,写操作发生后,首先检查StateDB中的读操作记录,查看是否存在对key的读操作,会出现如下的两种情况:
情况1.StateCache中没有的key的读操作记录
此时还没有任何vm对key的数据进行读取,故写入key的value不对任何vm产生影响。在StateCache中添加本次的写操作记录。
情况2.StateCache中存在对key的读操作记录
将这些读操作按照所属vm分类,记为多个<vm,rset>,其中rset代表以执行顺序排列的读操作列表。遍历每一个<vm,rset>,若vm优先级低于本次的读操作,则将回滚至rset中第一条读操作尚未发生的状态,并且从StateCache中删除该条读操作。之后,记录本次写操作。这样做的目的是防止低优先级的vm提前读取数据,因为需要保证高优先级的vm写入数据动作在低优先级的vm的读取数据之前发生。
本实施例采用智能合约并行模型,以StateDB作为智能合约的数据存储模块。智能合约的执行结果,实质上可以视为是一组对StateDB的读写<k,v>数据操作的集合。并行的智能合约执行会使得多个读写操作的集合同时执行,本模型通过同步、回滚等方式,使得并行的过程不会对执行结果与有序串行的执行结果产生差异。
本发明虽然已经参考特定的说明性实施例进行了描述,但是不会受到这些实施例的限定而仅仅受到附加权利要求的限定。本领域技术人员应当理解可以在不偏离本发明的保护范围和精神的情况下,对本发明的实施例进行修改。
Claims (10)
1.一种基于StateDB的智能合约并行运行***,其特征在于包括:
数据存储模块,所述数据存储模块以StateDB作为智能合约;
并行线程池,每一轮并行执行的交易将需要执行的智能合约初始化为vm,分配给所述并行线程池中的多个线程来执行,所述多个线程之间通过信号来控制执行进度;
虚拟机vm,用于解释执行智能合约语言的中间代码并支持回滚功能;
缓存模块StateCache,作为StateDB的缓存装置,每一轮并行开始时,所述缓存模块StateCache初始化,用于缓存所有线程中所述虚拟机vm解释执行所述智能合约源代码中对StateDB的读写记录,所述缓存模块StateCache以{vm优先级序号,本条记录序号,读/写操作,键值,数据值}的形式记录所述虚拟机vm的访问操作。
2.根据权利要求1所述的一种基于StateDB的智能合约并行运行***,其特征在于:所述智能合约语言为Task语言,文法和C语言类似,拥有3种数据类型:String、int、float,并且支持函数声明、调用参数传值以及递归调用的特性,Task语言的通过***调用的方式与StateDB进行交互。
3.根据权利要求2所述的一种基于StateDB的智能合约并行运行***,其特征在于:当所述智能合约语言源代码中出现了对所述数据存储模块进行交互的动作时,所述智能合约编译器将所述动作编译为一条四元式,所述四元式作为一种中间代码,包含了Task源代码所携带的所有信息,并且易于vm直接解释执行,所述虚拟机vm在执行所述四元式之前,将当前的运行栈备份到运行栈池中,当所述虚拟机vm出现StateDB的读写冲突问题时,将会放弃当前的运行栈,并且从所述运行栈池中寻找一个符合回滚位置的运行栈,作为当前的运行栈,继续执行。
4.根据权利要求1所述的一种基于StateDB的智能合约并行运行***,其特征在于:每一个所述虚拟机vm都有访问所述缓存模块StateCache的权利,但是同一时间只有一个所述虚拟机vm可以访问所述缓存模块StateCache,所述虚拟机vm对所述缓存模块StateCache的访问是互斥的。
5.根据权利要求4所述的一种基于StateDB的智能合约并行运行***,其特征在于:所述虚拟机vm的访问操作的记录条目以链表的形式存在。
6.根据权利要求1所述的一种基于StateDB的智能合约并行运行***,其特征在于:当所有的所述虚拟机vm都运行结束后,StateCache中仍然留存的写操作是本次并行执行智能合约对StateDB真正产生修改的正确写入操作序列,缓存模块StateCache将其按照虚拟机vm优先级进行降序排列并且写入StateDB即可。
7.一种基于权利要求1-6任一所述StateDB的智能合约并行运行***的运行方法,其特征在于包括步骤:
步骤1,初始化:
在每一轮中,x个交易并行执行,初始化x个执行智能合约的虚拟机vm并且载入智能合约,所述虚拟机vm的优先级以被搭载的交易的顺序为准,越靠前的交易优先级越高,以线程池作为多线程并行执行的载体,每一个vm由一个线程来执行;
步骤2,当虚拟机vm执行到一条需要与StateDB交互的指令时,即读/写StateDB时,并不直接对StateDB进行操作,而是与StateCache进行交互。
8.根据权利要求7所述的方法,其特征在于所述步骤2包括:
(1)对<key,value>的读操作:
读操作发生后,首先检查StateDB中的写操作记录,查看是否存在对key的写操作,会出现如下的两种情况:
情况1.StateCache中没有对key的写操作记录
此时可以从真实的StateDB中获取该key的value值,返回value,并且记录该读操作,对StateDB的读操作不改变StateDB的状态;
情况2.StateCache中存在对key的写操作记录
将这些写操作按照所属虚拟机vm分类,记为多个<vm,wset>,其中wset代表以执行顺序排列的写操作列表,遍历每一个<vm,wset>,若虚拟机vm优先级低于本次的读操作,则将回滚至wset中第一条写操作尚未发生的状态,并且从StateCache中删除该条写操作;
之后,检查剩余的写操作,若仍存在对key的写操作记录,则选择最晚发生的一条,将其写入的数据值作为本次读操作的结果返回,并且记录本次读操作。
(2)对<key,value>的写操作
首先检查StateDB中的读操作记录,查看是否存在对key的读操作,会出现如下的两种情况:
情况1.StateCache中没有的key的读操作记录
此时还没有任何vm对key的数据进行读取,故写入key的value不对任何vm产生影响。在StateCache中添加本次的写操作记录。
情况2.StateCache中存在对key的读操作记录
将这些读操作按照所属vm分类,记为多个<vm,rset>,其中rset代表以执行顺序排列的读操作列表。遍历每一个<vm,rset>,若vm优先级低于本次的读操作,则将回滚至rset中第一条读操作尚未发生的状态,并且从StateCache中删除该条读操作;之后,记录本次写操作。
9.根据权利要求8所述的方法,其特征在于所述并行运行方法遵守的并行执行原则包括:
a、交易存在既定的顺序,即交易存在优先级。顺序靠后和优先级低的交易不能因为并行提前而改变顺序靠前和优先级高的交易的执行结果。
b、并行运行时,对于StateDB的任意一条<k,v>数据:
顺序靠前和优先级高的交易的读操作不能晚于顺序靠后和优先级低的交易的写操作;顺序靠前和优先级高的交易的写操作一定先于顺序靠后和优先级低的交易的写操作。
10.根据权利要求7所述的方法,其特征在于所述方法为了保证上文中的并行执行原则的应对策略包括:
(1)在一轮并行执行中,当某一个合约对一个数据<k,v>执行读操作时,检查本轮所有已发生的写操作;所述写操作的发起者对应的交易若优先级低于当前合约对应的交易,则将优先级低的交易对应的合约执行状态回滚至尚未对该<k,v>进行写操作的执行状态;
(2)在一轮并行执行中,当某一个合约对一个数据<k,v>执行写操作时,检查本轮所有已发生的读操作,这些读操作的发起者对应的交易若优先级低于当前合约对应的交易,则将优先级低的交易对应的合约执行状态回滚至尚未对该<k,v>进行读操作的状态。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011533147.9A CN112579291A (zh) | 2020-12-22 | 2020-12-22 | 一种基于StateDB的智能合约并行运行***及并行运行方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011533147.9A CN112579291A (zh) | 2020-12-22 | 2020-12-22 | 一种基于StateDB的智能合约并行运行***及并行运行方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112579291A true CN112579291A (zh) | 2021-03-30 |
Family
ID=75139437
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011533147.9A Pending CN112579291A (zh) | 2020-12-22 | 2020-12-22 | 一种基于StateDB的智能合约并行运行***及并行运行方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112579291A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113360252A (zh) * | 2021-08-11 | 2021-09-07 | 北京微芯感知科技有限公司 | 基于容器的加速智能合约执行方法、装置及存储介质 |
CN113434522A (zh) * | 2021-05-08 | 2021-09-24 | 华东师范大学 | 一种面向联盟链的状态树上的并行更新方法及更新*** |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109636592A (zh) * | 2017-10-20 | 2019-04-16 | 北京航空航天大学 | 高性能智能合约设计 |
CN111611315A (zh) * | 2020-05-25 | 2020-09-01 | 辽宁大学 | 面向金融大数据的多叉树结构区块链集成优化存储方法 |
CN111813788A (zh) * | 2020-05-20 | 2020-10-23 | 北京金山云网络技术有限公司 | 信息的查询方法和装置、信息的同步方法和装置 |
US20200349568A1 (en) * | 2019-04-30 | 2020-11-05 | Alibaba Group Holding Limited | Method and device for avoiding double-spending problem in read-write set-model-based blockchain technology |
-
2020
- 2020-12-22 CN CN202011533147.9A patent/CN112579291A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109636592A (zh) * | 2017-10-20 | 2019-04-16 | 北京航空航天大学 | 高性能智能合约设计 |
US20200349568A1 (en) * | 2019-04-30 | 2020-11-05 | Alibaba Group Holding Limited | Method and device for avoiding double-spending problem in read-write set-model-based blockchain technology |
CN111813788A (zh) * | 2020-05-20 | 2020-10-23 | 北京金山云网络技术有限公司 | 信息的查询方法和装置、信息的同步方法和装置 |
CN111611315A (zh) * | 2020-05-25 | 2020-09-01 | 辽宁大学 | 面向金融大数据的多叉树结构区块链集成优化存储方法 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113434522A (zh) * | 2021-05-08 | 2021-09-24 | 华东师范大学 | 一种面向联盟链的状态树上的并行更新方法及更新*** |
CN113434522B (zh) * | 2021-05-08 | 2023-06-09 | 华东师范大学 | 一种面向联盟链的状态树上的并行更新方法及更新*** |
CN113360252A (zh) * | 2021-08-11 | 2021-09-07 | 北京微芯感知科技有限公司 | 基于容器的加速智能合约执行方法、装置及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6721944B2 (en) | Marking memory elements based upon usage of accessed information during speculative execution | |
US6353881B1 (en) | Supporting space-time dimensional program execution by selectively versioning memory updates | |
US7870545B2 (en) | Protecting shared variables in a software transactional memory system | |
US6684398B2 (en) | Monitor entry and exit for a speculative thread during space and time dimensional execution | |
EP2176763B1 (en) | Memory transaction grouping | |
EP1190315B1 (en) | Facilitating garbage collection during object versioning for space and time dimensional computing | |
US20100070730A1 (en) | Minimizing memory access conflicts of process communication channels | |
CN105493041A (zh) | 在访问动态类型化对象过程中的并发内联高速缓存优化 | |
JP6432450B2 (ja) | 並列計算装置、コンパイル装置、並列処理方法、コンパイル方法、並列処理プログラムおよびコンパイルプログラム | |
US6463526B1 (en) | Supporting multi-dimensional space-time computing through object versioning | |
CN112579291A (zh) | 一种基于StateDB的智能合约并行运行***及并行运行方法 | |
WO2003046716A1 (en) | Aggressive prefetch of address chains | |
WO2001093029A2 (en) | Speculative program execution with value prediction | |
JP2005529383A (ja) | シングルスレッドアプリケーションを支援する時間多重化推論的マルチスレッディング | |
EP1190318A1 (en) | Marking fields within objects with timestamps in order to improve efficiency | |
CN112487092B (zh) | 一种基于区块链的智能合约调用方法及装置 | |
US8839213B2 (en) | Optimizing primitives in software transactional memory | |
KR100763199B1 (ko) | 가상 머신 환경에서의 메소드 호출 방법 및 상기 방법을수행하는 가상 머신이 탑재된 시스템 | |
US9047139B2 (en) | Primitives for software transactional memory | |
EP4083785B1 (en) | Profiling and optimization of compiler-generated code | |
WO2000070451A1 (en) | Parallel join operation to support space and time dimensional program execution | |
US20050251795A1 (en) | Method, system, and program for optimizing code | |
WO2002003194A2 (en) | Multi-entry threading method and apparatus for automatic and directive-guided parallelization of a source program | |
Brownhill et al. | Percolation scheduling for non-VLIW machines | |
Aksenov et al. | Execution of nvram programs with persistent stack |
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 | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20210330 |
|
WD01 | Invention patent application deemed withdrawn after publication |