本发明专利技术公开了一种基于抽象语法树的智能合约数据提取和同步方法。首先对智能合约源代码进行词法分析和语法分析,生成抽象语法树;对该抽象语法树进行由顶至下的遍历分析,针对每个合约中的状态变量记录其序号及类型,并据此计算出该智能合约中的数据对应于存储MPT树中的索引值;当有新的交易产生时,根据交易所在的区块头的状态MPT树根重构存储MPT树,根据索引值查询存储MPT树获取到状态变量实际值,并将该数据同步到外部存储层中。使用本发明专利技术能够有效提取和同步智能合约应用中变量的数据,用于后续查询和分析。
【技术实现步骤摘要】
智能合约数据提取和同步方法、系统和平台
本专利技术涉及区块链
,特别涉及一种智能合约数据提取和同步方法、系统和平台。
技术介绍
智能合约是区块链2.0的核心,具有图灵完备性,它是由事件驱动的、具有状态的、运行在可复制的共享区块链数据账本上的计算机程序,能够实现自主调用或被调用的处理数据,接受、储存和转发数字货币对应的价值,以及控制和管理各类在区块链上的智能数字资产等功能。同时,智能合约中的数据是与应用强相关的。对于以太坊上的去中心化应用而言,大量的业务数据都被保存在智能合约中,比如在医疗记录交换的去中心化应用中,智能合约中保存了用户访问医疗记录的权限信息,医疗记录的元数据信息等。在用户使用和管理者维护时,智能合约中的业务数据被频繁读取和使用。然而,以太坊对于这部分内容的查询却并不友好。若要从外界读取合约中的数据,需要合约的编写者主动在合约中定义和实现读取函数,其次,用户在读取时需要向以太坊客户端发起交易请求,在以太坊交易完成后才能从该交易的返回值中获取到需要读取的值,最后,以太坊本身采用的底层数据组织方式和数据结构对于智能合约中数据的查询也并不友好。由于以太坊在每次执行交易进行读取时需要先构建MPT树并进行读取,MPT的读取类似于前缀树,时间复杂度为O(m)(其中m为前缀长度),其效率也受到一定影响。最后,由于部分已部署在区块链上的合约并没有对所有的合约内的状态变量建立读取函数,因此难以获取这部分变量的状态,对应用用户与应用管理者都造成了困扰。现有的一些区块链数据抽取方案关注于区块链本身数据的读取和查询,比如区块数据、交易数据等。其原因在于区块数据和交易数据可以直接通过以太坊提供的事件机制进行订阅,以太坊会自动推送其数据,因而其实现难度较低。但目前却鲜有对以太坊智能合约中的数据进行直接查询的方法。
技术实现思路
有鉴于此,本专利技术提供了一种基于抽象语法树的智能合约数据抽取和同步方法,能够有效提取和同步智能合约内部状态变量的值,方便后续的查询与分析。本专利技术的有益效果包括:(1)本专利技术提出的基于抽象语法树的智能合约数据抽取和同步方法,能够自动地分析和计算出智能合约中状态变量的存储键值,并直接方便地读取智能合约中的变量数据,简化了操作过程,提高了读取效率。(2)本专利技术能够通过对交易载荷的分析,智能识别当前交易调用的是哪一个合约方法,并结合抽象语法树,自动判断出该合约方法对哪部分状态变量进行了更新,从而形成待更新列表,进行增量更新,减小了更新负担,保证了同步效率。(3)本专利技术能够快速、方便地提取和同步基于以太坊的去中心化应用的智能合约内部数据,在保证数据准确的同时解决了去中心化应用数据查询困难、分析困难的问题。附图说明通过参考附图阅读下文的详细描述,本专利技术示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本专利技术的若干实施方式,其中:图1为根据本专利技术实施例之一的智能合约数据提取和同步方法流程图。图2为根据本专利技术实施例之一的智能合约数据提取和同步系统模块示意图。具体实施方式根据一个或者多个实施例,一种基于抽象语法树的智能合约数据提取和同步方法,包括:步骤一、利用ANTLR4对智能合约进行词法分析和语法分析,生成抽象语法树;步骤二、对抽象语法树进行逐步遍历分析,针对每个合约中的状态变量记录其序号及类型,并据此计算出该智能合约中的数据对应于存储MPT树中的索引值;步骤三、对抽象语法树进行逐步遍历分析,针对每个合约中的方法节点,解析出所有该方法涉及到的状态变量;步骤四、当有新的交易产生时,根据交易关联合约的ABI和交易载荷解析出交易所执行的方法,并根据交易所执行的方法涉及到的状态变量生成待更新列表;步骤五、当有新的交易产生时,根据交易所在的区块头的状态MPT树根重构存储MPT树,对待更新列表中的状态变量,根据索引值获取到状态变量实际值,并将该数据同步到外部存储层中。优选的,步骤一获得抽象语法树后,进一步删除抽象语法树中与智能合约数据提取和同步无关的冗余节点,得到与智能合约数据提取和同步相关的保留节点;步骤二对保留节点进行遍历分析。优选的,所述冗余节点包括:说明编译版本的节点、导入外部源文件的节点、合约种类为Library的合约节点,其他节点归为保留节点。优选的,删除冗余节点,留下保留节点的过程为:1)遍历根节点的子节点,检测每个子节点的nodeType(节点类型)属性,将属性值为ContractDefinition的节点归为保留节点,其他属性值对应的节点归为冗余节点;2)进入保留节点进一步遍历,检测合约类型属性contractKind,将属性值为Contract的节点归为保留节点,其他节点归为冗余节点。优选的,重构存储MPT树的方式如下:从当前交易中获取到状态根,该状态根即为状态MPT树的根节点哈希,使用该哈希可以获取到根节点对象,使用根节点可以访问到其子节点,依照此方式可以还原出整棵状态MPT树;查询该棵状态MPT树,获取到智能合约账户的存储MPT树的树根,使用类似方式重构出整棵存储MPT树。在整颗存储MPT树重构完成之后,对于每笔交易,本专利技术将重新查询并同步该交易所更新的数据值,将最新的数据值同步到外部数据库中以备后续查询和分析使用。根据一个或者多个实施例,一种基于抽象语法树的智能合约数据提取与同步方法:利用开源的词法分析与语法分析工具ANTLR4获取源代码程序的抽象语法树;直接对抽象语法树进行逐步遍历分析,针对每个合约检测其合约中的状态变量所在当前合约中的序号和类型;结合上述当前合约中的序号和类型两部分信息计算出每个状态变量在状态MPT树中对应的Key值;对抽象语法树进行逐步遍历分析,针对每个合约检测其合约中的函数,并分析出合约中每个函数对应当前合约中的状态变量的待更新列表;监听以太坊中新交易的事件,并筛选出对应于当前合约的所有交易事件;对于每一笔当前合约的交易事件,分析其交易载荷,判断该交易对应于当前智能合约的哪一个方法调用,并结合前述待更新列表对外部数据库的数据进行增量更新。根据一个或者多个实施例,如图1所示,基于抽象语法树的智能合约数据提取与同步方法包括如下步骤:步骤(1),利用ANTLR4对智能合约涉及的源代码进行词法分析和语法分析生成抽象语法树。本步骤中,使用Solidity语言编写智能合约,并使用定义好的Solidity语言语法文件Solidity.g4,其中,该文件包括词法规范内容与语法规范内容。使用Java的ANTLR4SDK对Solidity源代码文件与语法文件进行解析,构建抽象语法树对象ParsedTree。步骤(2),对抽象语法树进行逐步遍历分析,针对每个合约中的状态变量记录其序号及类型,并据此计算出该智能合约中的数据对应于存储MPT树中的索引值。设立如下本文档来自技高网...
【技术保护点】
1.一种智能合约数据提取和同步方法,其特征在于,包括:/n步骤一、对所述智能合约数据进行词法分析和语法分析,生成抽象语法树;/n步骤二、对所述抽象语法树进行逐步遍历分析,针对每个智能合约中的状态变量记录其序号及类型,并根据状态变量的序号及类型计算出该智能合约中的数据对应于存储MPT树中的索引值;/n步骤三、对抽象语法树进行逐步遍历分析,针对每个智能合约中的方法节点,解析出所有该方法涉及到的状态变量/n步骤四、当有新的交易产生时,根据交易关联合约的abi和交易载荷解析出交易所执行的方法,并根据交易所执行的方法涉及到的状态变量生成待更新列表,/n同时,根据交易所在的区块头的状态MPT树根重构存储MPT树,对待更新列表中的状态变量,根据索引值获取到状态变量实际值,并将该数据同步到外部存储层中。/n
【技术特征摘要】
1.一种智能合约数据提取和同步方法,其特征在于,包括:
步骤一、对所述智能合约数据进行词法分析和语法分析,生成抽象语法树;
步骤二、对所述抽象语法树进行逐步遍历分析,针对每个智能合约中的状态变量记录其序号及类型,并根据状态变量的序号及类型计算出该智能合约中的数据对应于存储MPT树中的索引值;
步骤三、对抽象语法树进行逐步遍历分析,针对每个智能合约中的方法节点,解析出所有该方法涉及到的状态变量
步骤四、当有新的交易产生时,根据交易关联合约的abi和交易载荷解析出交易所执行的方法,并根据交易所执行的方法涉及到的状态变量生成待更新列表,
同时,根据交易所在的区块头的状态MPT树根重构存储MPT树,对待更新列表中的状态变量,根据索引值获取到状态变量实际值,并将该数据同步到外部存储层中。
2.根据权利要求1所述的方法,其特征在于,在步骤一中获得抽象语法树后,进一步删除抽象语法树中与智能合约数据提取和同步无关的冗余节点,得到与智能合约数据提取和同步相关的保留节点,在步骤二中进一步对保留节点进行遍历分析。
3.根据权利要求1所述的方法,其特征在于,对智能合约中状态变量的序号和类型的记录方式为,设立两个参数,分别保存在智能合约中出现的状态变量信息和结构体信息,遍历抽象语法树时根据节点的不同类型将信息存储到对应的参数中。
4.根据权利要求1所述的方法,其特征在于,解析状态变量的方法是,
遍历抽象语法树,进入到函数节点时判断函数内的赋值语句中的被赋值变量是否在曾在状态变量中定义过,且没有在函数内部声明,若是,则将该状态变量与该方法关联起来。
5.根据权利要求1所述的方法,其特征在于,所述生成待更新列表的方法为:
1)获取到智能合约对应的abi;
2)获取到智能合约生成的交易,对该交易的载荷进行解析,确定生成该交易所调用的智能合约函数名;
【专利技术属性】
技术研发人员:卢暾,王泓机,张绍华,顾宁,戴炳荣,李超,
申请(专利权)人:复旦大学,上海计算机软件技术开发中心,
类型:发明
国别省市:上海;31
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。