CN109684189B - 区块链智能合约的逻辑验证方法和装置及计算机存储介质 - Google Patents
区块链智能合约的逻辑验证方法和装置及计算机存储介质 Download PDFInfo
- Publication number
- CN109684189B CN109684189B CN201710978144.8A CN201710978144A CN109684189B CN 109684189 B CN109684189 B CN 109684189B CN 201710978144 A CN201710978144 A CN 201710978144A CN 109684189 B CN109684189 B CN 109684189B
- Authority
- CN
- China
- Prior art keywords
- chain
- intelligent contract
- logic
- function
- gasoline
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3612—Software analysis for verifying properties of programs by runtime analysis
-
- 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
- G06F9/45508—Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明涉及区块链智能合约的逻辑验证方法和装置及计算机存储介质。该方法包括:对区块链应用的智能合约集合进行解析来生成关系图谱,关系图谱包括智能合约集合中的所有公共函数、变量以及它们之间的调用关系;基于关系图谱构造多种类型的逻辑链;在模拟的区块链网络上对所构造的逻辑链进行仿真;以及记录仿真的执行日志,来验证智能合约集合的逻辑正确性。根据本发明的方法和装置可以收集并分析智能合约的函数执行日志,以便发现逻辑错误。
Description
技术领域
本发明涉及区块链领域,更具体地涉及一种区块链智能合约的逻辑验证方法和装置及计算机存储介质。
背景技术
近来区块链(blockchain)的相关技术日益普及。之前传统应用的执行都是依赖于一个中心权威的机构,有了区块链技术之后,可以将应用以去中心化的方式执行,不需要中心权威机构就能执行相应的功能。区块链提供了一种不需要信任的网络架构,网络用户在没有信任的前提下就可以执行交易。这种去中心权威的方式依赖于3种技术的应用:用加密方式存储数据;点对点的网络;节点自治所依赖的智能合约。
智能合约是区块链网络上可以自动执行的脚本。智能合约一旦部署在区块链网络上,就不能再修改。最重要的是,一旦部署好了,它内部的公开函数都可以被其他任何人调用。所以最好在发布之前,就能确保智能合约的正确性。
在保证代码正确性方面,传统的方法是使用数学的形式化验证,是基于符号执行的。这种方式从代码推理的角度考虑,分析静态代码的每条可能路径。但是这种方式不太适合区块链的智能合约。相对传统的程序,智能合约的函数可以被其他人无序地调用。另一个特征是智能合约的函数调用过程中,不能保证原子性操作。
基于此,本发明提出了采用动态仿真的方式,来验证智能合约的逻辑正确性的方法和装置。
发明内容
在下文中给出关于本发明的简要概述,以便提供关于本发明的某些方面的基本理解。应当理解,这个概述并不是关于本发明的穷举性概述。它并不是意图确定本发明的关键或重要部分,也不是意图限定本发明的范围。其目的仅仅是以简化的形式给出某些概念,以此作为稍后论述的更详细描述的前序。
本发明的一个主要目的在于,提供了一种区块链智能合约的逻辑验证方法,包括:对区块链应用的智能合约集合进行解析来生成关系图谱,关系图谱包括智能合约集合中的所有公共函数、变量以及它们之间的调用关系;基于关系图谱构造多种类型的逻辑链;在模拟的区块链网络上对所构造的逻辑链进行仿真;以及记录仿真的执行日志,来验证智能合约集合的逻辑正确性。
根据本发明的一个方面,提供一种区块链智能合约的逻辑验证装置,包括:关系图谱生成单元,被配置为对区块链应用的智能合约集合进行解析来生成关系图谱,关系图谱包括智能合约集合中的所有公共函数、变量以及它们之间的调用关系;逻辑链构造单元,被配置为基于关系图谱构造多种类型的逻辑链;逻辑链仿真单元,被配置为在模拟的区块链网络上对所构造的逻辑链进行仿真;以及逻辑正确性验证单元,被配置为记录仿真的执行日志,来验证智能合约集合的逻辑正确性。
另外,本发明的实施例还提供了用于实现上述方法的计算机程序。
此外,本发明的实施例还提供了至少非暂态计算机可读存储介质形式的计算机程序产品,其上记录有用于实现上述方法的计算机程序代码。
通过以下结合附图对本发明的最佳实施例的详细说明,本发明的这些以及其他优点将更加明显。
附图说明
参照下面结合附图对本发明实施例的说明,会更加容易地理解本发明的以上和其它目的、特点和优点。附图中的部件只是为了示出本发明的原理。在附图中,相同的或类似的技术特征或部件将采用相同或类似的附图标记来表示。
图1示出了用于验证区块链智能合约的逻辑正确性的系统框架图;
图2示出了根据本发明的一个实施例的区块链智能合约的逻辑验证方法200的示例性过程的流程图;
图3示出了一个智能合约的示意图;
图4示出了对应于图3中的智能合约的JSON解析格式的示意图;
图5是示出根据本发明的另一个实施例的区块链智能合约的逻辑验证装置500的示例性配置的框图;以及
图6是示出可以用于实施本发明的区块链智能合约的逻辑验证方法和装置的计算设备的示例性结构图。
具体实施方式
在下文中将结合附图对本发明的示范性实施例进行描述。为了清楚和简明起见,在说明书中并未描述实际实施方式的所有特征。然而,应该了解,在开发任何这种实际实施例的过程中必须做出很多特定于实施方式的决定,以便实现开发人员的具体目标,例如,符合与系统及业务相关的那些限制条件,并且这些限制条件可能会随着实施方式的不同而有所改变。此外,还应该了解,虽然开发工作有可能是非常复杂和费时的,但对得益于本公开内容的本领域技术人员来说,这种开发工作仅仅是例行的任务。
在此,还需要说明的一点是,为了避免因不必要的细节而模糊了本发明,在附图中仅仅示出了与根据本发明的方案密切相关的设备结构和/或处理步骤,而省略了与本发明关系不大的其他细节。
本发明提出一种采用动态仿真的方式,验证智能合约的逻辑正确性的方法和装置。首先,解析智能合约的集合,转换成一个关系图谱。智能合约的所有公共函数、参数以及它们之间的调用关系都会显示在关系图谱上。其次,从关系图谱上抽出三种类型的逻辑链:顺序链、并行链、异常链等。最后,在模拟的区块链网络上,采用不同的执行方式来仿真各种类型的逻辑链。在仿真执行之后,收集并分析智能合约的函数执行日志,以便发现逻辑错误。
下面结合附图详细说明根据本发明的实施例的区块链智能合约的逻辑验证方法和装置。下文中的描述按如下顺序进行:
1.区块链智能合约的逻辑验证方法
2.区块链智能合约的逻辑验证装置
3.用以实施本申请的方法和装置的计算设备
1.区块链智能合约的逻辑验证方法
图1示出了用于验证区块链智能合约的逻辑正确性的系统框架图。根据图1所示的系统,首先,分析智能合约集合,解析并抽取其中的公共函数以及公共的变量,其中,Func_1、Func_2…表示函数,Var_1、Var_2…表示变量,它们之间的函数调用关系也展示在关系图谱上。之后,基于这些公共函数和变量,以及它们之间的调用关系,构造几种不同类型的逻辑链。一共有3种不同类型的逻辑链:顺序链、并行链以及异常链。之后,在模拟的区块链网络中,对这三种逻辑链进行仿真,每种逻辑链对应不同的仿真模式。在执行仿真之后,将相关的日志信息发送给用户,便于用户确认逻辑的正确性。
图2示出了根据本发明的一个实施例的区块链智能合约的逻辑验证方法200的示例性过程的流程图。下面将结合图2具体说明区块链智能合约的逻辑验证方法200的过程。
首先,在步骤S202中,对区块链应用的智能合约集合进行解析来生成关系图谱,关系图谱包括智能合约集合中的所有公共函数、变量以及它们之间的调用关系。
一个基于区块链的去中心化应用,可能会包含多个智能合约。这些智能合约表示的是应用的逻辑关系,是应用程序的核心。区块链智能合约的特性是,一旦部署就没法更改,一旦部署其所有的公共函数都可以被其他人随意调用。所以,智能合约的逻辑正确性是非常重要的。
目前,以太坊是最有名的区块链平台,solidity语言是使用最多的编写智能合约的语言之一。
图3示出了一个以solidity语言编写的以太坊智能合约。智能合约的结构中,包括一系列状态变量、函数、函数修改器、结构类型以及枚举类型等。
具体的智能合约的结构定义,可以参见https://solidity.readthedocs.io/en/ develop/structure-of-a-contract.html。
经过语法分析,智能合约解析器可以将合约解析成JSON(JS对象标记)格式,基于智能合约的JSON对象标记格式的解析结果可以生成关系图谱。JSON解析结果展示一些接口信息,告诉外界如何通过接口调用合约的各个部件,如变量、函数等。JSON解析结果还包括一些solidity特定的信息,如函数的可见度、变量的可访问的程度等。比如,函数的可见度可以指定为“外部的”、“公开的”、“内部的”或是“私有的”,默认都是“公开的”。对于变量来说,它的可见性可以指定为“公开的”、“内部的”,默认是“内部的”。
图4示出了一个简单的JSON解析格式,对应于图3中的智能合约。
这里采用了开源的智能合约解析器,参见:https://github.com/ConsenSys/ solidity-parser。
基于智能合约解析器的JSON格式,可以生成关系图谱。如图1的左部所示,示出了一个简单的智能合约关系图谱。其中,公开的函数表示成椭圆形节点,公开的变量表示为方形节点。函数之间的调用关系用带箭头的粗线表示,函数调用变量的关系用带箭头的细线表示。有些变量可能会由多个智能合约共享,比如“Var_2”,“Var_3”,它们之间用双向箭头表示。
接着,在步骤S204中,基于关系图谱构造多种类型的逻辑链。
公共函数及变量是调用智能合约的入口,它们之间的调用关系展示在关系图谱中。这些调用关系代表的是智能合约期望的、正确的调用方式。然而,黑客一般不会遵从正常的调用方式。因此,为了确保智能合约的逻辑正确性,需要考虑所有预期的和非预期的调用方式。
在一个示例中,可以构造三种不同的逻辑链:顺序链、并行链以及异常链。
下面将分别说明顺序链、并行链以及异常链的构造方法。
顺序链
顺序链是通过关系图谱中节点遍历得到的,但只考虑函数节点。采用的是广度优先的遍历方式,跟随着每条边的指向。具体的构造过程如下:
(1)在关系图谱中,收集没有链入信息(即入度为零)的函数节点;
(2)根据函数的调用关系,采用广度优先的遍历方式进行遍历;
(3)收集所有的遍历路径,获得的遍历路径集合即为顺序链集合。
以图1中左图中的关系图谱为例,收集到的顺序链集合如下:
{Func_1,Func_2,Func_4 Func_3,Func_5 Func_6Func_7}
更多关于广度优先的遍历方式的信息,可以参考
http://baike.baidu.com/item/%E5%B9%BF%E5%BA%A6%E4%BC%98% E5%85%88%E9%81%8D%E5%8E%86。
并行链
并行链是基于关系图谱的公共变量分析获得的。具体的构造过程如下:
(1)收集关系图谱中的所有变量节点,去除没有函数调用的节点;
(2)如果两个或多个节点是相关的,或是同一个,比如“Var_2”、“Var_3”,只保留其中的一个;
(3)收集所有的变量节点关联的函数节点,记为集合C;
按照以下方式处理集合C中的每个函数:
(3.1)如果函数节点没有链入信息,则将其放入到集合P;
(3.2)如果函数节点有链入信息,假设这个节点为Nf。在顺序链的集合中,查找包含Nf的最长顺序链,然后将其放入到集合P中;
(4)重复步骤(3.2),直到所有的变量节点都已经处理完毕。
以图1中的关系图谱为例,解析的顺序链如下:
{{Func_1,Func_2},{Func_4→Func_3,Func_5→Func_6→Func_7}}
在这个集合中,{Func_1,Func_2}是“Var_1”相关的并行链,{Func_4→Func_3,Func_5→Func_6→Func_7}是与“Var_2/Var_3”相关的并行链。
异常链
接下来,说明异常链的具体构造过程。构造异常链的目的,是准备一些非开发者期望的函数调用,这些调用顺序是智能合约开发者未曾考虑到的。简单起见,用数字n代表图1中的Func_n.
(1)获得关系图谱中没有链入信息的函数节点的集合,如{1,2,4,5};
(2)构造每两个函数节点的两两组合,如下:
{12,14,15,
21,24,25,
41,42,45,
51,52,54};
再构造三个函数节点的三三组合,要求覆盖步骤2中的所有两两组合,比如:
{124,251,415,521,142,454}
最终,这些集合代表了以下的异常链:
{Func_1→Func_2→Func_4,Func_2→Func_5→Func_1,
Func_4→Func_1→Func_5,Func_5→Func_2→Func_1,
Func_1→Func_4→Func_2,Func_4→Func_5→Func_4}。
在构造好这些逻辑链之后,接下来,在步骤S206中,在模拟的区块链网络上对所构造的逻辑链进行仿真。
仿真的目的是要检验逻辑链执行的正确性。由于构造真实的区块链网络需要很多的时间、机器资源,在本发明的方法中,采用模拟的区块链网络,比如开源的TestRPC网络。它可以模拟区块链客户端的所有动作,辅助开发者快速开发。
TestRPC是基于以太坊区块链的。它有多个参数配置信息,如下:
“-a”或“--accounts”用于指定调用智能合约的账户的用户的个数;
“-b”或“--blocktime”用于指定挖矿的时间,以秒为单位。在区块链应用系统中,所有的智能合约函数调用都被表示成交易,这些交易必须由旷工挖矿进行验证。这个命令可以指定挖矿的时间间隔,默认的是0,意味着无需挖矿;
“-l”or“--gasLimit”用于分配函数执行中的汽油(gas)分配。在区块链网络中,为了避免恶意的循环调用,每次调用智能合约的函数,都需要指定一定量的汽油信息。一旦汽油用光了,函数的执行就停止了。这些汽油可以用以太币购买,以太币是以太坊区块链网络中的电子货币。
关于TestRPC的更多信息,参考https://github.com/ethereumjs/testrpc。
此外,为了方便用户分配汽油,需要知道每个函数调用的汽油使用量。可以采用开源项目Solc,它是以太坊智能合约的编译器,它的一个命令(--gas)是用于估计每个函数调用的最大汽油使用量。关于Solc的更多信息,请参考https://github.com/ethereum/solc- js。
接下来是在模拟的区块链网络上,采用配置好的汽油信息,对逻辑链进行仿真。不同类型的逻辑链采用不同的仿真模型,下面分别进行说明。
顺序链的多次循环执行
顺序链表示开发者期望的智能合约的调用方式。大多数情况下,它们的执行结果都会与开发者的设计思想一致。然而,在多次循环执行的情况下,就不一定能保证结果正确了,比如100次循环。在循环过程中,只设定一个账户(account)调用,因为不需要挖矿,所以可以将挖矿时间设定为0s。
此外,循环调用需要模拟两种不同的汽油额度分配,一个是全额汽油,一个是部分汽油。以顺序链“Func_5→Func_6→Func_7”为例,它的汽油最小额度是3个函数“Func_5”、“Func_6”以及“Func_7”的最小汽油使用量总和,假定为N。那么,在模拟循环100次的情况下,指定两种不同的汽油额度为50N及100N。
并行链的多账户并行仿真
一组并行链代表的是与同一个变量相关的逻辑链。并行链最大的风险是账户并发导致的错误。
以{Func_4→Func_3,Func_5→Func_6→Func_7}这个并行链为例,如果Func_4→Func_3修改Var_2为5,与此同时会同步给Var_3。但是在此期间,Func_5→Func_6→Func_7可能会修改变量Var_3。这样,就会影响第一个顺序链的结果。
基于并发的考虑,在对并行链仿真过程中,需要采用多个账户,账户的个数与并行链的个数相同(即并行链所包含的顺序链的个数)。每个账户对应并行链中的一条链。汽油的分配依赖于并行链中的所有函数的汽油消耗。比如,在这个并行链中,汽油的分配额度为5个函数“Func_4”,“Func_3”,“Func_5”,“Func_6”和“Func_7”所需的最小汽油量的总和。
同时,为了验证并发的效果,并行链还需要在3中不同的挖矿时间下进行仿真:0秒,5秒以及10秒。
异常链的逻辑仿真
针对异常链,重点关注它在执行过程中的正确性,所以只需要执行一次。对于每条异常链,只需要分配一个账户信息来调用,也无需挖矿。汽油消耗量由异常链所包含的所有函数的最小汽油量决定,其中函数的汽油消耗量包括函数背后隐藏的顺序链的汽油消耗。
以“Func_1→Func_2→Func_4”这个异常链为例,函数Func_4有一个隐含的顺序链:Func_4→Func_3。基于此,这条异常链的汽油消耗量为“Func_1”,“Func_2”,“Func_4”与“Func_3”的所有汽油消耗量总和。假如Func_4有一个或多个隐含的顺序链(与一个或多个顺序链关联),会以汽油消耗量最大的那条为基准,即以该顺序链所消耗的汽油量作为Func_4的汽油消耗量。
仿真实验会在两种不同的汽油分配情况进行:半个额度的汽油消耗量,全额度的汽油消耗量。
下面的表1针对不同类型的逻辑链采用不同的仿真模型给出了说明。
表1.动态仿真的模型设计
最后,在步骤S208中,记录仿真的执行日志,来验证智能合约集合的逻辑正确性。
在仿真执行之后,收集并分析智能合约的函数执行日志。可以将相关的日志信息发送给用户,便于用户确认逻辑的正确性。
智能合约的几种典型的逻辑错误包括:并发、异常的函数调用等。
2.区块链智能合约的逻辑验证装置
图5是示出根据本发明的另一个实施例的区块链智能合约的逻辑验证装置500的示例性配置的框图。
如图5所示,区块链智能合约的逻辑验证装置500包括关系图谱生成单元502、逻辑链构造单元504、逻辑链仿真单元506、和逻辑正确性验证单元508。
关系图谱生成单元502被配置为对区块链应用的智能合约集合进行解析来生成关系图谱,关系图谱包括智能合约集合中的所有公共函数、变量以及它们之间的调用关系。
逻辑链构造单元504被配置为基于关系图谱构造多种类型的逻辑链。
逻辑链仿真单元506被配置为在模拟的区块链网络上对所构造的逻辑链进行仿真。
逻辑正确性验证单元508被配置为记录仿真的执行日志,来验证智能合约集合的逻辑正确性。
在一个示例中,逻辑链构造单元504包括:顺序链构造子单元、并行链构造子单元和异常链构造子单元(图中未示出)。
其中,顺序链构造子单元被配置为:在关系图谱中,收集入度为零的函数节点;根据函数的调用关系,进行广度优先遍历;以及收集所有遍历路径的集合作为顺序链的集合。
其中,逻辑链仿真单元506包括顺序链仿真子单元(图中未示出),顺序链仿真子单元被配置为:对于顺序链进行M次迭代仿真,M为大于1的整数;将顺序链的挖矿时间设置为0秒;以及将顺序链的汽油使用分配分别设置为M*N或者0.5*M*N进行仿真,N为该顺序链的所有函数在执行时所需的最小汽油量总和。
其中,并行链构造子单元被配置为:在关系图谱中,收集有函数调用的所有变量节点;如果两个或多个变量节点相关的,或是同一个,则仅保留其中之一;收集所有变量节点关联的所有函数节点的第一集合;对于第一集合中的每个函数节点执行以下处理:如果该函数节点的入度为零,则将其放入第二集合;如果该函数节点的入度不为零,则从顺序链的集合中查找包含该函数节点的最长顺序链,将该最长顺序链放入第二集合;以及将得到的第二集合作为并行链的集合。
其中,逻辑链仿真单元506包括并行链仿真子单元(图中未示出),并行链仿真子单元被配置为:对于并行链进行多账户并行仿真,账户的个数与并行链的个数相同;将并行链的挖矿时间分别设置为0秒、5秒或10秒;以及将并行链的汽油使用分配设置为该并行链中的所有函数在执行时所需的最小汽油量总和。
其中,异常链构造子单元被配置为:在关系图谱中,收集入度为零的函数节点的集合;对于集合中的每两个函数节点进行两两组合;进行三个函数节点的组合以覆盖所有两个函数节点的两两组合;以及将所得到的三个函数节点的组合作为异常链的集合。
其中,逻辑链仿真单元506还包括异常链仿真子单元(图中未示出),异常链仿真子单元被配置为:对于异常链仅执行一次仿真;将异常链的挖矿时间设置为0秒;以及将异常链的汽油使用分配分别设置为N或者0.5*N,其中,N为该异常链中所有函数在执行时所需要的最小汽油量总和,其中,如果该异常链中的某个函数关联一个或多个顺序链,则以消耗最大汽油量的顺序链所消耗的汽油量作为该函数消耗的汽油量。
关系图谱生成单元进一步被配置为:将智能合约解析为JSON对象标记格式;以及基于智能合约的JSON对象标记格式的解析结果来生成关系图谱。
其中,JSON对象标记格式的智能合约提供与智能合约的变量和函数的交互接口,并表示变量的可访问性和函数的可见度,其中,变量的可访问性可以指定为“公开的”、“内部的”,默认是“内部的”;函数的可见度可以指定为“外部的”、“公开的”、“内部的”或是“私有的”,默认都是“公开的”。
关于区块链智能合约的逻辑验证装置500的各个部分的操作和功能的细节可以参照结合图1-4描述的本发明的区块链智能合约的逻辑验证方法的实施例,这里不再详细描述。
在此需要说明的是,图5所示的区块链智能合约的逻辑验证装置500及其组成单元的结构仅仅是示例性的,本领域技术人员可以根据需要对图5所示的结构框图进行修改。
本发明提出了一种对智能合约进行动态仿真以进行智能合约的逻辑验证的方法和装置,具有以下特征:
解析智能合约,抽取其中的公共函数、公共变量以及它们之间的调用关系,构造成一个关系图谱;
基于这个关系图谱,构造三种不同类型的逻辑链:顺序链、并行链以及异常链;
不同的逻辑链采用不同的仿真模型,包括循环次数、调用账户个数、挖矿时间以及汽油额度分配等;
基于这种仿真的方式,可以检测智能合约的几种典型的逻辑错误:并发、异常的函数调用等。
[3.用以实施本申请的方法和装置的计算设备]
以上结合具体实施例描述了本发明的基本原理,但是,需要指出的是,对本领域的普通技术人员而言,能够理解本发明的方法和装置的全部或者任何步骤或者部件,可以在任何计算装置(包括处理器、存储介质等)或者计算装置的网络中,以硬件、固件、软件或者它们的组合加以实现,这是本领域普通技术人员在阅读了本发明的说明的情况下运用他们的基本编程技能就能实现的。
因此,本发明的目的还可以通过在任何计算装置上运行一个程序或者一组程序来实现。所述计算装置可以是公知的通用装置。因此,本发明的目的也可以仅仅通过提供包含实现所述方法或者装置的程序代码的程序产品来实现。也就是说,这样的程序产品也构成本发明,并且存储有这样的程序产品的存储介质也构成本发明。显然,所述存储介质可以是任何公知的存储介质或者将来所开发出来的任何存储介质。
在通过软件和/或固件实现本发明的实施例的情况下,从存储介质或网络向具有专用硬件结构的计算机,例如图6所示的通用计算机600安装构成该软件的程序,该计算机在安装有各种程序时,能够执行各种功能等等。
在图6中,中央处理单元(CPU)601根据只读存储器(ROM)602中存储的程序或从存储部分608加载到随机存取存储器(RAM)603的程序执行各种处理。在RAM 603中,也根据需要存储当CPU 601执行各种处理等等时所需的数据。CPU 601、ROM 602和RAM 603经由总线604彼此链路。输入/输出接口605也链路到总线604。
下述部件链路到输入/输出接口605:输入部分606(包括键盘、鼠标等等)、输出部分607(包括显示器,比如阴极射线管(CRT)、液晶显示器(LCD)等,和扬声器等)、存储部分608(包括硬盘等)、通信部分609(包括网络接口卡比如LAN卡、调制解调器等)。通信部分609经由网络比如因特网执行通信处理。根据需要,驱动器610也可链路到输入/输出接口605。可拆卸介质611比如磁盘、光盘、磁光盘、半导体存储器等等根据需要被安装在驱动器610上,使得从中读出的计算机程序根据需要被安装到存储部分608中。
在通过软件实现上述系列处理的情况下,从网络比如因特网或存储介质比如可拆卸介质611安装构成软件的程序。
本领域的技术人员应当理解,这种存储介质不局限于图6所示的其中存储有程序、与设备相分离地分发以向用户提供程序的可拆卸介质611。可拆卸介质611的例子包含磁盘(包含软盘(注册商标))、光盘(包含光盘只读存储器(CD-ROM)和数字通用盘(DVD))、磁光盘(包含迷你盘(MD)(注册商标))和半导体存储器。或者,存储介质可以是ROM 602、存储部分608中包含的硬盘等等,其中存有程序,并且与包含它们的设备一起被分发给用户。
本发明还提出一种存储有机器可读取的指令代码的程序产品。指令代码由机器读取并执行时,可执行上述根据本发明实施例的方法。
相应地,用于承载上述存储有机器可读取的指令代码的程序产品的存储介质也包括在本发明的公开中。存储介质包括但不限于软盘、光盘、磁光盘、存储卡、存储棒等。
本领域的普通技术人员应理解,在此所例举的是示例性的,本发明并不局限于此。
在本说明书中,“第一”、“第二”以及“第N个”等表述是为了将所描述的特征在文字上区分开,以清楚地描述本发明。因此,不应将其视为具有任何限定性的含义。
作为一个示例,上述方法的各个步骤以及上述设备的各个组成模块和/或单元可以实施为软件、固件、硬件或其组合,并作为相应设备中的一部分。上述装置中各个组成模块、单元通过软件、固件、硬件或其组合的方式进行配置时可使用的具体手段或方式为本领域技术人员所熟知,在此不再赘述。
作为一个示例,在通过软件或固件实现的情况下,可以从存储介质或网络向具有专用硬件结构的计算机(例如图6所示的通用计算机600)安装构成该软件的程序,该计算机在安装有各种程序时,能够执行各种功能等。
在上面对本发明具体实施例的描述中,针对一种实施方式描述和/或示出的特征可以以相同或类似的方式在一个或更多个其他实施方式中使用,与其他实施方式中的特征相组合,或替代其他实施方式中的特征。
应该强调,术语“包括/包含”在本文使用时指特征、要素、步骤或组件的存在,但并不排除一个或更多个其他特征、要素、步骤或组件的存在或附加。
此外,本发明的方法不限于按照说明书中描述的时间顺序来执行,也可以按照其他的时间顺序地、并行地或独立地执行。因此,本说明书中描述的方法的执行顺序不对本发明的技术范围构成限制。
本发明及其优点,但是应当理解在不超出由所附的权利要求所限定的本发明的精神和范围的情况下可以进行各种改变、替代和变换。而且,本发明的范围不仅限于说明书所描述的过程、设备、手段、方法和步骤的具体实施例。本领域内的普通技术人员从本发明的公开内容将容易理解,根据本发明可以使用执行与在此的相应实施例基本相同的功能或者获得与其基本相同的结果的、现有和将来要被开发的过程、设备、手段、方法或者步骤。因此,所附的权利要求旨在在它们的范围内包括这样的过程、设备、手段、方法或者步骤。
基于以上的说明,可知公开至少公开了以下技术方案:
附记1、一种区块链智能合约的逻辑验证方法,包括:
对区块链应用的智能合约集合进行解析来生成关系图谱,所述关系图谱包括智能合约集合中的所有公共函数、变量以及它们之间的调用关系;
基于所述关系图谱构造多种类型的逻辑链;
在模拟的区块链网络上对所构造的逻辑链进行仿真;以及
记录仿真的执行日志,来验证所述智能合约集合的逻辑正确性。
附记2、根据附记1所述的方法,其中,所述多种类型的逻辑链包括:
顺序链、并行链和异常链。
附记3、根据附记2所述的方法,其中,所述顺序链通过以下步骤构造:
在所述关系图谱中,收集入度为零的函数节点;
根据函数的调用关系,进行广度优先遍历;以及
收集所有遍历路径的集合作为所述顺序链的集合。
附记4、根据附记2或3所述的方法,其中,在模拟的区块链网络上对所构造的顺序链进行仿真包括:
对于所述顺序链进行M次迭代仿真,M为大于1的整数;
将所述顺序链的挖矿时间设置为0秒;以及
将所述顺序链的汽油使用分配分别设置为M*N或者0.5*M*N进行仿真,N为该顺序链的所有函数在执行时所需的最小汽油量总和。
附记5、根据附记3所述的方法,其中,所述并行链通过以下步骤构造:
在所述关系图谱中,收集有函数调用的所有变量节点;
如果两个或多个变量节点相关的,或是同一个,则仅保留其中之一;
收集所有变量节点关联的所有函数节点的第一集合;
对于所述第一集合中的每个函数节点执行以下处理:
如果该函数节点的入度为零,则将其放入第二集合;
如果该函数节点的入度不为零,则从顺序链的集合中查找包含该函数节点的最长顺序链,将该最长顺序链放入所述第二集合;以及
将得到的所述第二集合作为所述并行链的集合。
附记6、根据附记2或5所述的方法,其中,在模拟的区块链网络上对所构造的并行链进行仿真包括:
对于所述并行链进行多账户并行仿真,账户的个数与并行链的个数相同;
将所述并行链的挖矿时间分别设置为0秒、5秒或10秒;以及
将所述并行链的汽油使用分配设置为该并行链中的所有函数在执行时所需的最小汽油量总和。
附记7、根据附记4所述的方法,其中,所述异常链通过以下步骤构造:
在所述关系图谱中,收集入度为零的函数节点的集合;
对于所述集合中的每两个函数节点进行两两组合;
进行三个函数节点的组合以覆盖所有两个函数节点的两两组合;以及
将所得到的三个函数节点的组合作为所述异常链的集合。
附记8、根据附记7所述的方法,其中,在模拟的区块链网络上对所构造的异常链进行仿真包括:
对于所述异常链仅执行一次仿真;
将所述异常链的挖矿时间设置为0秒;以及
将所述异常链的汽油使用分配分别设置为N或者0.5*N,其中,N为该异常链中所有函数在执行时所需要的最小汽油量总和,
其中,如果该异常链中的某个函数关联一个或多个顺序链,则以消耗最大汽油量的顺序链所消耗的汽油量作为该函数消耗的汽油量。
附记9、根据附记1所述的方法,其中,对区块链应用的智能合约集合进行解析来生成关系图谱包括:
将所述智能合约解析为JSON对象标记格式;以及
基于所述智能合约的JSON对象标记格式的解析结果生成所述关系图谱。
附记10、根据附记9所述的方法,其中,
所述JSON对象标记格式的智能合约提供与所述智能合约的变量和函数的交互接口,并表示所述变量的可访问性和所述函数的可见性,
其中,所述变量的可访问性包括公共和内部,所述函数的可见性包括外部、公共、内部和私有,
其中,在所述关系图谱中使用公共的函数和变量。
附记11、一种区块链智能合约的逻辑验证装置,包括:
关系图谱生成单元,被配置为对区块链应用的智能合约集合进行解析来生成关系图谱,所述关系图谱包括智能合约集合中的所有公共函数、变量以及它们之间的调用关系;
逻辑链构造单元,被配置为基于所述关系图谱构造多种类型的逻辑链;
逻辑链仿真单元,被配置为在模拟的区块链网络上对所构造的逻辑链进行仿真;以及
逻辑正确性验证单元,被配置为记录仿真的执行日志,来验证所述智能合约集合的逻辑正确性。
附记12、根据附记11所述的装置,其中,所述逻辑链构造单元包括:
顺序链构造子单元、并行链构造子单元和异常链构造子单元。
附记13、根据附记12所述的方法,其中,所述顺序链构造子单元被配置为:
在所述关系图谱中,收集入度为零的函数节点;
根据函数的调用关系,进行广度优先遍历;以及
收集所有遍历路径的集合作为所述顺序链的集合。
附记14、根据附记12或13所述的方法,其中,所述逻辑链仿真单元包括顺序链仿真子单元,所述顺序链仿真子单元被配置为:
对于所述顺序链进行M次迭代仿真,M为大于1的整数;
将所述顺序链的挖矿时间设置为0秒;以及
将所述顺序链的汽油使用分配分别设置为M*N或者0.5*M*N进行仿真,N为该顺序链的所有函数在执行时所需的最小汽油量总和。
附记15、根据附记13所述的方法,其中,所述并行链构造子单元被配置为:
在所述关系图谱中,收集有函数调用的所有变量节点;
如果两个或多个变量节点相关的,或是同一个,则仅保留其中之一;
收集所有变量节点关联的所有函数节点的第一集合;
对于所述第一集合中的每个函数节点执行以下处理:
如果该函数节点的入度为零,则将其放入第二集合;
如果该函数节点的入度不为零,则从顺序链的集合中查找包含该函数节点的最长顺序链,将该最长顺序链放入所述第二集合;以及
将得到的所述第二集合作为所述并行链的集合。
附记16、根据附记12或15所述的方法,其中,所述逻辑链仿真单元包括并行链仿真子单元,所述并行链仿真子单元被配置为:
对于所述并行链进行多账户并行仿真,账户的个数与并行链的个数相同;
将所述并行链的挖矿时间分别设置为0秒、5秒或10秒;以及
将所述并行链的汽油使用分配设置为该并行链中的所有函数在执行时所需的最小汽油量总和。
附记17、根据附记14所述的方法,其中,所述异常链构造子单元被配置为:
在所述关系图谱中,收集入度为零的函数节点的集合;
对于所述集合中的每两个函数节点进行两两组合;
进行三个函数节点的组合以覆盖所有两个函数节点的两两组合;以及
将所得到的三个函数节点的组合作为所述异常链的集合。
附记18、根据附记17所述的方法,其中,所述逻辑链仿真单元还包括异常链仿真子单元,所述异常链仿真子单元被配置为:
对于所述异常链仅执行一次仿真;
将所述异常链的挖矿时间设置为0秒;以及
将所述异常链的汽油使用分配分别设置为N或者0.5*N,其中,N为该异常链中所有函数在执行时所需要的最小汽油量总和,
其中,如果该异常链中的某个函数关联一个或多个顺序链,则以消耗最大汽油量的顺序链所消耗的汽油量作为该函数消耗的汽油量。
附记19、根据附记11所述的方法,其中,所述关系图谱生成单元进一步被配置为:
将所述智能合约解析为JSON对象标记格式;以及
基于所述智能合约的JSON对象标记格式的解析结果来生成所述关系图谱。
附记20、一种非暂态计算机可读存储介质,其中存储有程序,当所述程序由计算机执行时,使得所述计算机执行根据附记1-10中任意一项所述的方法。
Claims (8)
1.一种区块链智能合约的逻辑验证方法,包括:
对区块链应用的智能合约集合进行解析来生成关系图谱,所述关系图谱包括智能合约集合中的所有公共函数、变量以及它们之间的调用关系;
基于所述关系图谱构造多种类型的逻辑链;
在模拟的区块链网络上对所构造的逻辑链进行仿真;以及
记录仿真的执行日志,来验证所述智能合约集合的逻辑正确性,
其中,所述多种类型的逻辑链包括:顺序链、并行链和异常链,以及
其中,在模拟的区块链网络上对所构造的顺序链进行仿真包括:
对于所述顺序链进行M次迭代仿真,M为大于1的整数;
将所述顺序链的挖矿时间设置为0秒;以及
将所述顺序链的汽油使用分配分别设置为M*N或者0.5*M*N进行仿真,N为该顺序链的所有函数在执行时所需的最小汽油量总和。
2.根据权利要求1所述的方法,其中,所述顺序链通过以下步骤构造:
在所述关系图谱中,收集入度为零的函数节点;
根据函数的调用关系,进行广度优先遍历;以及
收集所有遍历路径的集合作为所述顺序链的集合。
3.根据权利要求2所述的方法,其中,所述并行链通过以下步骤构造:
在所述关系图谱中,收集有函数调用的所有变量节点;
如果两个或多个变量节点相关的,或是同一个,则仅保留其中之一;
收集所有变量节点关联的所有函数节点的第一集合;
对于所述第一集合中的每个函数节点执行以下处理:
如果该函数节点的入度为零,则将其放入第二集合;
如果该函数节点的入度不为零,则从顺序链的集合中查找包含该函数节点的最长顺序链,将该最长顺序链放入所述第二集合;以及
将得到的所述第二集合作为所述并行链的集合。
4.根据权利要求1或3所述的方法,其中,在模拟的区块链网络上对所构造的并行链进行仿真包括:
对于所述并行链进行多账户并行仿真,账户的个数与并行链的个数相同;
将所述并行链的挖矿时间分别设置为0秒、5秒或10秒;以及
将所述并行链的汽油使用分配设置为该并行链中的所有函数在执行时所需的最小汽油量总和。
5.根据权利要求1所述的方法,其中,所述异常链通过以下步骤构造:
在所述关系图谱中,收集入度为零的函数节点的集合;
对于所述集合中的每两个函数节点进行两两组合;
进行三个函数节点的组合以覆盖所有两个函数节点的两两组合;以及
将所得到的三个函数节点的组合作为所述异常链的集合。
6.根据权利要求5所述的方法,其中,在模拟的区块链网络上对所构造的异常链进行仿真包括:
对于所述异常链仅执行一次仿真;
将所述异常链的挖矿时间设置为0秒;以及
将所述异常链的汽油使用分配分别设置为N或者0.5*N,其中,N为该异常链中所有函数在执行时所需要的最小汽油量总和,
其中,如果该异常链中的某个函数关联一个或多个顺序链,则以消耗最大汽油量的顺序链所消耗的汽油量作为该函数所需要的汽油量。
7.一种区块链智能合约的逻辑验证装置,包括:
关系图谱生成单元,被配置为对区块链应用的智能合约集合进行解析来生成关系图谱,所述关系图谱包括智能合约集合中的所有公共函数、变量以及它们之间的调用关系;
逻辑链构造单元,被配置为基于所述关系图谱构造多种类型的逻辑链;
逻辑链仿真单元,被配置为在模拟的区块链网络上对所构造的逻辑链进行仿真;以及
逻辑正确性验证单元,被配置为记录仿真的执行日志,来验证所述智能合约集合的逻辑正确性,
其中,所述多种类型的逻辑链包括:顺序链、并行链和异常链,以及
其中,在模拟的区块链网络上对所构造的顺序链进行仿真包括:
对于所述顺序链进行M次迭代仿真,M为大于1的整数;
将所述顺序链的挖矿时间设置为0秒;以及
将所述顺序链的汽油使用分配分别设置为M*N或者0.5*M*N进行仿真,N为该顺序链的所有函数在执行时所需的最小汽油量总和。
8.一种非暂态计算机可读存储介质,其中存储有程序,当所述程序由计算机执行时,使得所述计算机执行根据权利要求1-6中任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710978144.8A CN109684189B (zh) | 2017-10-18 | 2017-10-18 | 区块链智能合约的逻辑验证方法和装置及计算机存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710978144.8A CN109684189B (zh) | 2017-10-18 | 2017-10-18 | 区块链智能合约的逻辑验证方法和装置及计算机存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109684189A CN109684189A (zh) | 2019-04-26 |
CN109684189B true CN109684189B (zh) | 2022-02-11 |
Family
ID=66183523
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710978144.8A Active CN109684189B (zh) | 2017-10-18 | 2017-10-18 | 区块链智能合约的逻辑验证方法和装置及计算机存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109684189B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110175844A (zh) * | 2019-05-07 | 2019-08-27 | 深圳前海微众银行股份有限公司 | 一种区块链中智能合约的发布方法及装置 |
CN110807195B (zh) * | 2019-09-26 | 2023-08-25 | 图灵人工智能研究院(南京)有限公司 | 一种智能合约的发布方法、发布平台装置及发布系统 |
US11488099B2 (en) | 2019-10-18 | 2022-11-01 | International Business Machines Corporation | Supply-chain simulation |
CN111949532A (zh) * | 2020-08-10 | 2020-11-17 | 上海熙菱信息技术有限公司 | 一种基于契约测试下的风险应对的测试策略 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1577274A (zh) * | 2003-07-01 | 2005-02-09 | 华为技术有限公司 | 自动化仿真方法及系统 |
CN103593291A (zh) * | 2013-11-18 | 2014-02-19 | 北京邮电大学 | 用于包括多个函数测试模块的单元测试方法及装置 |
CN105243018A (zh) * | 2015-10-24 | 2016-01-13 | 北京航空航天大学 | 一种面向对象的类测试数据生成方法 |
CN107103098A (zh) * | 2017-05-12 | 2017-08-29 | 曾建伟 | 一种包含智能合约的区块链网式数据库及工作方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20170140408A1 (en) * | 2015-11-16 | 2017-05-18 | Bank Of America Corporation | Transparent self-managing rewards program using blockchain and smart contracts |
US10762504B2 (en) * | 2016-02-22 | 2020-09-01 | Bank Of America Corporation | System for external secure access to process data network |
-
2017
- 2017-10-18 CN CN201710978144.8A patent/CN109684189B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1577274A (zh) * | 2003-07-01 | 2005-02-09 | 华为技术有限公司 | 自动化仿真方法及系统 |
CN103593291A (zh) * | 2013-11-18 | 2014-02-19 | 北京邮电大学 | 用于包括多个函数测试模块的单元测试方法及装置 |
CN105243018A (zh) * | 2015-10-24 | 2016-01-13 | 北京航空航天大学 | 一种面向对象的类测试数据生成方法 |
CN107103098A (zh) * | 2017-05-12 | 2017-08-29 | 曾建伟 | 一种包含智能合约的区块链网式数据库及工作方法 |
Also Published As
Publication number | Publication date |
---|---|
CN109684189A (zh) | 2019-04-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11868745B2 (en) | System and method for compiling high-level language code into a script executable on a blockchain platform | |
Yamashita et al. | Potential risks of hyperledger fabric smart contracts | |
Hildenbrandt et al. | Kevm: A complete formal semantics of the ethereum virtual machine | |
CN109684189B (zh) | 区块链智能合约的逻辑验证方法和装置及计算机存储介质 | |
US20170235661A1 (en) | Integration of Software Systems via Incremental Verification | |
US11941377B2 (en) | Production-ready attributes creation and management for software development | |
CN110633200A (zh) | 用于测试智能合约的方法和设备 | |
Zhang et al. | Aspect Composition in the Motorola Aspect-Oriented Modeling Weaver. | |
Colombo et al. | Industrial experiences with runtime verification of financial transaction systems: lessons learnt and standing challenges | |
Beutner et al. | AutoHyper: Explicit-state model checking for HyperLTL | |
Clarisó et al. | Towards domain refinement for UML/OCL bounded verification | |
Koval et al. | Lincheck: A practical framework for testing concurrent data structures on JVM | |
US20220179776A1 (en) | Systems and Methods for Automatic Test Generation | |
US20230029250A1 (en) | Type inference in dynamic languages | |
Neto et al. | Segen: Generation of test cases for selenium and selendroid | |
Tschannen | Automatic verification of Eiffel programs | |
Beckert et al. | Towards a usable and sustainable deductive verification tool | |
Jiang et al. | A fast and effective design and implementation of online programming drills | |
Martignano | Bounded model checking and abstract interpretation of large C codebases | |
An et al. | A Validation Methodology for OCaml-to-PVS Translation | |
de Carvalho Conceicao | Validation of Smart Contracts Through Automated Tooling | |
Ganov | Techniques and tools for testing graphical user interfaces | |
Poeplau | Increasing the performance of symbolic execution by compiling symbolic handling into binaries | |
Mota et al. | Formally Verifying a Real World Smart Contract | |
Exman et al. | KODEGEN: A Code Generation and Testing Tool Using Runnable Knowledge |
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 |