CN110264361A - 一种区块链的数据解析方法及装置 - Google Patents

一种区块链的数据解析方法及装置 Download PDF

Info

Publication number
CN110264361A
CN110264361A CN201910550186.0A CN201910550186A CN110264361A CN 110264361 A CN110264361 A CN 110264361A CN 201910550186 A CN201910550186 A CN 201910550186A CN 110264361 A CN110264361 A CN 110264361A
Authority
CN
China
Prior art keywords
transaction
data
event
code
parsing
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
Application number
CN201910550186.0A
Other languages
English (en)
Inventor
张龙
范瑞彬
张开翔
毛嘉宇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
WeBank Co Ltd
Original Assignee
WeBank Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by WeBank Co Ltd filed Critical WeBank Co Ltd
Priority to CN201910550186.0A priority Critical patent/CN110264361A/zh
Publication of CN110264361A publication Critical patent/CN110264361A/zh
Priority to PCT/CN2020/097235 priority patent/WO2020259417A1/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/64Protecting data integrity, e.g. using checksums, certificates or signatures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06QINFORMATION 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/00Finance; Insurance; Tax strategies; Processing of corporate or income taxes
    • G06Q40/04Trading; Exchange, e.g. stocks, commodities, derivatives or currency exchange

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Business, Economics & Management (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Finance (AREA)
  • Accounting & Taxation (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • General Health & Medical Sciences (AREA)
  • Bioethics (AREA)
  • Health & Medical Sciences (AREA)
  • Development Economics (AREA)
  • Economics (AREA)
  • Marketing (AREA)
  • Strategic Management (AREA)
  • Technology Law (AREA)
  • General Business, Economics & Management (AREA)
  • Stored Programmes (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种区块链的数据解析方法及装置,用以降低解析区块链中的数据的成本以及提高数据解析的性能。在该方法中,首先获取用户业务的智能合约,所述智能合约中包括用于创建实现所述用户业务的构造方法、事件方法以及非常量方法;并根据所述构造方法、事件方法以及非常量方法中的至少一个方法,生成数据解析代码,所述数据解析代码包括用于对所述用户业务的事件数据进行解析的事件数据解析代码和用于对所述用户业务的交易数据进行解析的交易数据解析代码;然后,使用所述数据解析代码对区块链中的每一个区块中的数据进行解析,获取所述事件数据和所述交易数据。

Description

一种区块链的数据解析方法及装置
技术领域
本发明涉及科技金融(Fintech)领域,尤其涉及一种区块链的数据解析方法及装置。
背景技术
区块链(Block chain)技术与金融领域的结合,使得传统金融业正在逐步向科技金融(Finteh)转变。在结合了区块链技术的科技金融中,较为重要的是对区块链中的数据(例如,合约账户数据、交易数据和事件数据)进行处理,例如,解析数据或者同步数据等。
针对解析数据,目前提出了两个解决方案:
第一种解决方案:在智能合约(Smart contract)的层面设计一套专用接口,当业务需要时,通过智能调用智能合约中的专用接口解析区块链中的数据。
第二种解决方案:通过预先保存待解析的数据在区块链上的地址,然后根据该地址调用相关接口,获取该数据。
然而,针对上述第一种解决方案,由于专用接口的代码需要占用一定的存储空间,尤其当该专用接口的数量较多时,该专用接口将导致存储空间开销大,造成较高的成本。且,由于当该专用接口较复杂时,可能需要多次调用不同接口才能获取数据,导致性能差。而针对第二种解决方案,由于地址都是针对特定的智能合约,当有新的业务或者智能合约变更时,不能复用,则需要技术人员重新修改代码,且,第二种解决方案在获取数据时,需要根据数据结构定义中的寻址规则去计算数据地址,运算量加大。
可见,现有技术中解析区块链中的数据存在成本高且性能差的技术问题。
发明内容
本发明提供一种区块链的数据解析方法及装置,用以降低解析区块链中的数据的成本以及提高数据解析的性能。
本发明第一方面提供了一种区块链的数据解析方法,所述方法包括:
获取用户业务的智能合约,所述智能合约中包括用于创建实现所述用户业务的构造方法、事件方法以及非常量方法;
根据所述构造方法、事件方法以及非常量方法中的至少一个方法,生成数据解析代码,所述数据解析代码包括用于对所述用户业务的事件数据进行解析的事件数据解析代码和用于对所述用户业务的交易数据进行解析的交易数据解析代码;
使用所述数据解析代码对区块链中的每一个区块中的数据进行解析,获取所述事件数据和所述交易数据。
在本申请实施例中,生成事件数据解析代码和交易数据解析代码的过程根据所依赖的方法不同,具有不同的生成方式。
在一种可能的实施方式中,根据所述构造方法、事件方法以及非常量方法中的至少一个方法,生成所述事件数据解析代码,包括:
编译所述智能合约,得到与所述智能合约对应的JAVA合约文件,所述JAVA合约文件中至少包括用于获取所述事件方法中的事件对象的获取方法、与所述事件方法对应的事件类以及所述智能合约的二进制编码,所述智能合约的二进制编码中至少包括所述构造方法、所述事件方法以及所述非常量方法中每个方法访问所述区块链的字段类型;
加载所述JAVA合约文件,通过反射获取所述事件类;
通过JAVA对象与第一字段类型之间的第一映射关系,将所述事件类中的与所述第一字段类型相同的字段转化为JAVA对象,从而获取与所述事件类对应的第一POJO对象,所述第一字段类型为所述事件方法中用于访问所述区块链的字段类型;
将所述第一POJO对象填入预设的事件数据解析模板,生成所述事件数据解析代码,所述预设的事件数据解析函数模板中至少包括调用模块、第一解析模块、第一实例化模块以及第一存储模块,所述调用模块用于调用所述获取方法,所述第一解析模块用于解析所述事件对象并获取解析后的事件数据,所述第一实例化模块用于将解析后的事件数据转换为第一POJO对象实例,以及,所述第一存储模块用于将所述第一POJO对象实例***数据库表,所述数据库表用于存储所述事件数据和所述交易数据。
相应地,使用所述事件数据解析代码对区块链中的每一个区块中的数据进行解析,以获取所述事件数据,包括:
获取所述区块链中的其中一个区块,所述其中一个区块为所述区块链中的任意一个区块;
运行所述事件数据解析代码,通过所述事件数据解析代码中的调用模块获取所述区块中的事件对象列表,所述事件对象列表包括所述事件对象的至少一个取值;
通过所述事件数据解析代码中的解析模块解析所述事件对象的至少一个取值,获得至少一个解析后的事件数据;
通过所述事件数据解析代码中的实例化模块将所述至少一个解析后的事件数据分别转化为至少一个第一POJO对象实例,所述至少一个POJO第一对象实例与所述至少一个解析后的事件数据一一对应;
通过所述事件数据解析代码中的存储模块将所述至少一个POJO对象实例***所述数据库表中。
在一种可能的实施方式中,根据所述构造方法、事件方法以及非常量方法中的至少一个方法,生成所述交易数据解析代码,包括:
编译所述智能合约,得到与所述智能合约对应的JAVA合约文件,所述JAVA合约文件中至少包括所述智能合约的二进制编码以及二进制字符串,所述智能合约的二进制编码中至少包括所述构造方法以及所述非常量方法中每个方法访问所述区块链的字段类型,所述二进制字符串为所述智能合约的递归长度前缀编码;
加载所述JAVA合约文件,解析所述二进制编码,获取交易方法,所述交易方法包括所述构造方法和所述非常量方法;
通过JAVA对象与第二字段类型之间的第二映射关系,将所述交易方法中的与所述第二字段类型相同的字段转化为JAVA对象,从而获取与所述交易方法对应的第二POJO对象,所述第二字段类型为所述交易方法中用于访问所述区块链的字段类型;
将所述第二POJO对象填充预设的交易数据解析模板,生成所述交易数据解析代码,所述预设的交易数据解析模板至少包括匹配模块、第二解析模块、第二实例化模块以及第二存储模块,所述匹配模块用于确定所述交易方法为所述构造方法或为所述非常量方法,所述第二解析模块用于解析所述交易方法并获取交易数据,所述第二实例化模块用于将交易数据转换为第二POJO对象实例,以及,所述第二存储模块用于将所述第二POJO对象实例***数据库表,所述数据库表用于存储所述事件数据和所述交易数据。
在本申请实施例中,根据交易数据解析代码获取交易数据,可以包括但不限于如下两种情况:
第一种情况,使用所述交易数据解析代码对区块链中的每一个区块中的数据进行解析,以获取所述交易数据,包括:
获取所述区块链中的其中一个区块,所述其中一个区块为所述区块链中的任意一个区块;
通过预设的交易获取接口,获取所述区块中的第一交易;
运行所述交易数据解析代码,通过交易数据解析代码中的匹配模块获取所述第一交易中的目标字段,并根据所述目标字段确定所述第一交易的交易类型,所述交易类型包括第一交易类型和第二交易类型,所述第一交易类型为与所述构造方法对应的交易类型,所述第二交易类型为与所述非常量方法对应的交易类型,所述目标字段用于指示所述第一交易的交易对象;
在确定所述第一交易的交易类型为所述第一交易类型时,通过所述匹配模块获取所述第一交易的递归长度前缀编码,确定所述第一交易的递归长度前缀编码是否包括所述二进制字符串;
在为是时,通过所述交易数据解析代码中的第二解析模块,对第一剩余字符串进行解析,获取所述第一交易的第一交易数据,所述第一剩余字符串为所述第一交易的递归长度前缀编码中去除与所述二进制字符串相同的符号之后的字符串;
通过所述交易数据解析代码中的第二实例化模块将所述第一交易数据转化为第二POJO对象实例;
通过所述交易数据解析代码中的第二存储模块将所述第二POJO对象实例***所述数据库表中。
第二种情况,在运行所述交易数据解析代码,通过交易数据解析代码中的匹配模块获取所述第一交易中的目标字段,并根据所述目标字段确定所述第一交易的交易类型之后,所述方法还包括:
在所述第一交易的交易类型为所述第二交易类型时,通过所述匹配模块获取所述第一交易的递归长度前缀编码,确定所述第一交易的递归长度前缀编码是否包括所述交易数据解析代码所对应的非常量方法的签名;
在为是时,通过所述交易数据解析代码中的第二解析模块,对第二剩余编码进行解析,获取所述第一交易的第二交易数据,所述第二剩余编码为所述第一交易的编码中去除与所述签名相同的符号之后的字符串;
通过所述交易数据解析代码中的第二实例化模块将所述第二交易数据转化为第二POJO对象实例;
通过所述交易数据解析代码中的第二存储模块将所述第二POJO对象实例***所述数据库表中。
本发明第二方面提供一种区块链的数据解析装置,包括:
获取单元,用于获取用户业务的智能合约,所述智能合约中包括用于创建实现所述用户业务的构造方法、事件方法以及非常量方法;
生成单元,用于根据所述构造方法、事件方法以及非常量方法中的至少一个方法,生成数据解析代码,所述数据解析代码包括用于对所述用户业务的事件数据进行解析的事件数据解析代码和用于对所述用户业务的交易数据进行解析的交易数据解析代码;
解析单元,用于使用所述数据解析代码对区块链中的每一个区块中的数据进行解析,获取所述事件数据和所述交易数据。
在一种可能的实施方式中,所述生成单元具体用于:
编译所述智能合约,得到与所述智能合约对应的JAVA合约文件,所述JAVA合约文件中至少包括用于获取所述事件方法中的事件对象的获取方法、与所述事件方法对应的事件类以及所述智能合约的二进制编码,所述智能合约的二进制编码中至少包括所述构造方法、所述事件方法以及所述非常量方法中每个方法访问所述区块链的字段类型;
加载所述JAVA合约文件,通过反射获取所述事件类;
通过JAVA对象与第一字段类型之间的第一映射关系,将所述事件类中的与所述第一字段类型相同的字段转化为JAVA对象,从而获取与所述事件类对应的第一POJO对象,所述第一字段类型为所述事件方法中用于访问所述区块链的字段类型;
将所述第一POJO对象填入预设的事件数据解析模板,生成所述事件数据解析代码,所述预设的事件数据解析函数模板中至少包括调用模块、第一解析模块、第一实例化模块以及第一存储模块,所述调用模块用于调用所述获取方法,所述第一解析模块用于解析所述事件对象并获取解析后的事件数据,所述第一实例化模块用于将解析后的事件数据转换为第一POJO对象实例,以及,所述第一存储模块用于将所述第一POJO对象实例***数据库表,所述数据库表用于存储所述事件数据和所述交易数据。
在一种可能的实施方式中,所述解析单元具体用于:
获取所述区块链中的其中一个区块,所述其中一个区块为所述区块链中的任意一个区块;
运行所述事件数据解析代码,通过所述事件数据解析代码中的调用模块获取所述区块中的事件对象列表,所述事件对象列表包括所述事件对象的至少一个取值;
通过所述事件数据解析代码中的解析模块解析所述事件对象的至少一个取值,获得至少一个解析后的事件数据;
通过所述事件数据解析代码中的实例化模块将所述至少一个解析后的事件数据分别转化为至少一个第一POJO对象实例,所述至少一个POJO第一对象实例与所述至少一个解析后的事件数据一一对应;
通过所述事件数据解析代码中的存储模块将所述至少一个POJO对象实例***所述数据库表中。
在一种可能的实施方式中,所述生成单元具体用于:
编译所述智能合约,得到与所述智能合约对应的JAVA合约文件,所述JAVA合约文件中至少包括所述智能合约的二进制编码以及二进制字符串,所述二进制编码中至少包括所述构造方法以及所述非常量方法中每个方法访问所述区块链的字段类型,所述二进制字符串为所述智能合约的递归长度前缀编码;
加载所述JAVA合约文件,解析所述二进制编码,获取交易方法,所述交易方法包括所述构造方法和所述非常量方法;
通过JAVA对象与第二字段类型之间的第二映射关系,将所述交易方法中的与所述第二字段类型相同的字段转化为JAVA对象,从而获取与所述交易方法对应的第二POJO对象,所述第二字段类型为所述交易方法中用于访问所述区块链的字段类型;
将所述第二POJO对象填入预设的交易数据解析模板,生成所述交易数据解析代码,所述预设的交易数据解析模板至少包括匹配模块、第二解析模块、第二实例化模块以及第二存储模块,所述匹配模块用于确定所述交易方法为所述构造方法或为所述非常量方法,所述第二解析模块用于解析所述交易方法并获取交易数据,所述第二实例化模块用于将交易数据转换为第二POJO对象实例,以及,所述第二存储模块用于将所述第二POJO对象实例***数据库表,所述数据库表用于存储所述事件数据和所述交易数据。
在一种可能的实施方式中,所述解析单元具体用于:
获取所述区块链中的其中一个区块,所述其中一个区块为所述区块链中的任意一个区块;
通过预设的交易获取接口,获取所述区块中的第一交易;
运行所述交易数据解析代码,通过交易数据解析代码中的匹配模块获取所述第一交易中的目标字段,并根据所述目标字段确定所述第一交易的交易类型,所述交易类型包括第一交易类型和第二交易类型,所述第一交易类型为与所述构造方法对应的交易类型,所述第二交易类型为与所述非常量方法对应的交易类型,所述目标字段用于指示所述第一交易的交易对象;
在确定所述第一交易的交易类型为所述第一交易类型时,通过所述匹配模块获取所述第一交易的递归长度前缀编码,确定所述第一交易的递归长度前缀编码是否包括所述二进制字符串;
在为是时,通过所述交易数据解析代码中的第二解析模块,对第一剩余字符串进行解析,获取所述第一交易的第一交易数据,所述第一剩余字符串为所述第一交易的递归长度前缀编码中去除与所述二进制字符串相同的符号之后的字符串;
通过所述交易数据解析代码中的第二实例化模块将所述第一交易数据转化为第二POJO对象实例;
通过所述交易数据解析代码中的第二存储模块将所述第二POJO对象实例***所述数据库表中。
在一种可能的实施方式中,所述解析单元还用于:
在所述第一交易的交易类型为所述第二交易类型时,通过所述匹配模块获取所述第一交易的递归长度前缀编码,确定所述第一交易的递归长度前缀编码是否包括所述交易数据解析代码所对应的非常量方法的签名;
在为是时,通过所述交易数据解析代码中的第二解析模块,对第二剩余编码进行解析,获取所述第一交易的至少一个第二交易数据,所述第二剩余编码为所述第一交易的编码中去除与所述签名相同的符号之后的字符串;
通过所述交易数据解析代码中的第二实例化模块将所述第二交易数据转化为第二POJO对象实例;
通过所述交易数据解析代码中的第二存储模块将所述第二POJO对象实例***所述数据库表中。
本发明第三方面提供一种电子设备,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行所述区块链的数据解析方法。
本发明第三方面提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行所述区块链的数据解析方法。
在本发明实施例中,可以自动根据用户业务的智能合约,生成用于解析数据的代码,也就是说,针对不同的用户业务,只需要用户导入与各个用户业务对应的智能合约即可,无需新增接口或者无需预先存储用于数据解析的代码,从而可以减小用于数据解析的代码占用的存储空间,可以降低解析区块链中的数据的成本。且,根据智能合约生成的代码是与智能合约中的接口一一对应的,因此,在进行数据解析时,不需要调用多个接口或者不需要计算待解析数据的地址,从而可以提高数据解析的性能。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供数据解析方法所适用的***架构的结构框图;
图2为本发明实施例提供的区块链的数据解析方法的流程图;
图3为本发明实施例中生成事件数据解析代码的流程图;
图4为本发明实施例中生成交易数据解析代码的流程图;
图5为本发明实施例中对区块中的事件数据进行解析的流程图;
图6为本发明实施例中对区块中的第一交易的交易数据进行解析的流程图;
图7为本发明实施例中提供的区块链的数据解析的一种示例的结构图;
图8为本发明实施例中提供的区块链的数据解析的另一种示例的结构图。
具体实施方式
本发明提供一种区块链的数据解析方法及装置,用以降低解析区块链中的数据的成本以及提高数据解析的性能。
为了便于理解,下面对本发明实施例中可能涉及的名词进行定义和解释。
区块链:是由一系列区块组成的一条链,每个块上除了记录本块的数据还会记录上一块的Hash(哈希)值,通过这种方式组成一条链。区块链的核心理念有两个,一个是密码学技术,另一个是去中心化思想,基于这两个理念做到区块链上的历史信息无法被篡改。一个区块由块头和块体组成,其中块头定义包括该区块高度h,上一个区块的Hash值prevHash等重要字段,而块体主要存储交易数据。
智能合约:是一种旨在以信息化方式传播、验证或执行合同的计算机协议,智能合约的执行过程会以交易的形式在区块链上共识、确认,其允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。
web3jsdk:JAVA语言访问区块链的桥接层,提供相关应用程序编程接口(Application Programming Interface,API)对区块链进行访问。
Solidity:一种智能合约高级语言,运行在以太坊虚拟机(EVM)之上,主要用于编写智能合约。
JAVA:一门面向对象的编程语言,用以编写桌面应用程序、Web应用程序、分布式***和嵌入式***应用程序等。
opcode:智能合约编译后的操作指令。
Event:智能合约的一种方法类型,可以将参数存储在交易的日志中,便于对智能合约执行情况进行跟踪。
简单的Java对象(Plain Ordinary Java Object,POJO):实际就是普通JavaBeans,可以理解为是JAVA中的接口、类和对象。
递归长度前缀(Recursive Length Prefix,RLP):是一种编码规则,可用于编码任意嵌套的二进制数组数据。RLP编码的结果也是二进制序列,主要用来序列化/反序列化数据。
应用程序二进制接口(Application Binary Interface,ABI):描述了应用程序和操作***之间,一个应用和它的库之间,或者应用的组成部分之间的低接口。
需要说明的是,本发明实施例中的第一、第二仅用于区分不同的对象,不表示各个对象的重要性或者优先级。
下面,对本发明实施例中的应用场景进行介绍。
图1示例性的示出了本发明实施例提供数据解析方法所适用的***架构,该***架构可以包括数据解析装置100和区块链200。需要说明的是,在图1中,数据解析装置100与区块链200是两个独立的模块,在其他的示例中,该数据解析装置100也可以设置在区块链200中,在此不作限制。
其中,区块链200可以包括多个区块,例如,在图1所示的***架构中,区块链200包括2个区块,分别为区块A和区块B。每个区块中可以根据用户业务设置多个智能合约,例如,在区块A中设置有智能合约1,在区块B中设置有智能合约2。
数据解析装置100可以通过不同的接口,获取并解析区块链200中每个区块中的任意一种数据,例如,可以通过合约接口获取合约账户数据,可以通过区块接口获取区块数据,这两种数据不解析。然而,由于区块链中的事件数据和交易数据依赖智能合约,比较复杂,因此,数据解析装置100需要对这两种数据进行解析。
在现有技术中,在解析事件数据或交易数据时,要么预先设置与每个智能合约对应的专用接口,要么通过预先保存待解析的数据的地址,具体请参考背景技术中描述的第一种解决方案和第二种解决方案,在此不再赘述。但是,采用现有技术中的方法解析事件数据或交易数据存在成本高且性能差的技术问题。
为了解决上述技术问题,本发明提供一种区块链的数据解析方法,该方法应用于图1所示的数据解析装置100中。请参考图2,为该方法流程图,该流程图的描述如下:
S21、获取用户业务的智能合约,所述智能合约中包括用于创建实现所述用户业务的构造方法、事件方法以及非常量方法。
在具体实施过程中,数据解析装置100可以通过预设的接口,获取用户提供的智能合约,或者,也可以通过其他方式获取该智能合约,在本发明实施例中不对此进行限制。智能合约可以通过不同的编程语言进行编写,为方便说明,下文中以智能合约为采用Solidity编程语言编写的智能合约为例。
作为一种示例,假设用户业务为保存用户信息(UserInfo),数据解析装置100获取的UserInfo智能合约可以如下所示:
Contract UserInfo{
bytes32_userName;
uint8_sex;
function UserInfo(bytes32 userName,uint8 sex)public{
_userName=userName;
_sex=sex;
}
event modifyUserNameEvent(bytes32 userName,uint8 sex,address con);
function modifyUserName(bytes32 userName)public returns(bytes32){
_userName=userName;
modifyUserNameEvent(_userName,_sex,address(this));
return_userName;
}
}
在该UserInfo智能合约中,包括一个用于创建该UserInfo智能合约实例的构造方法,即:
function UserInfo(bytes32 userName,uint8 sex)public{
_userName=userName;
_sex=sex;
}
以及,一个用于记录每次修改用户名之后用户的信息的事件方法,即:eventmodifyUserNameEvent(bytes32 userName,uint8 sex,address con)。以及,一个用于修改用户的姓名的非常量(constant)方法,即:
function modifyUserName(bytes32 userName)public returns(bytes32){
_userName=userName;
modifyUserNameEvent(_userName,_sex,address(this));
return_userName;
}
在上述UserInfo智能合约中,该智能合约仅包括一个构成方法、一个事件方法以及一个非常量方法,应该理解为是对智能合约的一种示例,而不是限制智能合约中只能包括一个构造方法、一个事件方法以及一个非常量方法,在实际使用过程中,一个智能合约也可以包括多个构造方法或者多个事件方法或者多个非常量方法,在此不再赘述。
S22、根据所述构造方法、事件方法以及非常量方法中的至少一个方法,生成数据解析代码。
在本发明实施例中,主要用于解析区块中的交易数据和事件数据,因此,生成的数据解析代码包括用于对所述用户业务的事件数据进行解析的事件数据解析代码和用于对所述用户业务的交易数据进行解析的交易数据解析代码。
下面,将分别介绍事件数据解析代码的生成过程和交易数据解析代码的生成过程。
针对事件数据解析代码,请参考图3,为生成事件数据解析代码的流程图,该流程图描述如下:
S31、编译所述智能合约,得到与所述智能合约对应的JAVA合约文件。
在根据智能合约生成事件数据解析代码之前,首先要通过编译器,编译该智能合约,从而得到编译后的合约文件。
作为一种示例,可以通过编译器将智能合约编译为JAVA代码文件。继续以智能合约为UserInfo智能合约为例,对该UserInfo智能合约进行编译的代码可以如下所示:
pragma solidity^0.4.7;
Contract UserInfo{
bytes32_userName;
uint8_sex;
function UserInfo(bytes32 userName,uint8 sex)public{
_userName=userName;
_sex=sex;
}
event modifyUserNameEvent(bytes32 userName,uint8 sex,address con);
function modifyUserName(bytes32 userName)public returns(bytes32){
_userName=userName;
modifyUserNameEvent(_userName,_sex,address(this));
return_userName;
}
}
在使用上述代码对该UserInfo智能合约进行编译后,则得到对应的JAVA文件,该JAVA文件即JAVA合约文件。当然,根据编译所使用的编程语言不同,合约文件也可以是其他类型的文件,例如,若采用PHP编程语言进行编译,则得到了编译后的PHP文件,在此不对合约文件的类型进行限制。为方便说明,在下文中以该合约文件为JAVA文件为例。
在本发明实施例中,所述JAVA合约文件中至少包括用于获取所述事件方法中的事件对象的获取方法、与所述事件方法对应的事件类以及所述智能合约的二进制编码,所述智能合约中的二进制编码中至少包括所述构造方法、所述事件方法以及所述非常量方法中每个方法访问所述区块链的字段类型。
具体来讲,当该UserInfo智能合约采用JAVA编译器进行编译后,可以得到包括但不限于如下内容的JAVA文件:
在上述JAVA文件中,getModifyUserNameEventEvents即用于获取事件方法中的事件对象的获取方法,public static class ModifyUserNameEventResponse{}即与事件方法对应的事件类,String ABI即所述智能合约的二进制编码,该ABI中包括该智能合约中所有方法的类型、输入参数、输出参数以及每个方法用于访问区块链的字段类型以及字段名称等,二进制(binary)字符串为该智能合约的RLP编码,用于对合约实例进行签名。当然,该JAVA文件也可以包括其他内容,在此不一一举例。
S32、加载所述JAVA合约文件,通过反射获取所述事件类。
在上述JAVA文件中,该事件类为modifyUserNameEvent类。
S33、通过JAVA对象与第一字段类型之间的第一映射关系,将所述事件类中的与所述第一字段类型相同的字段转化为JAVA对象,从而获取与所述事件类对应的第一POJO对象。
在本发明实施例中,该第一字段类型为所述事件方法中用于访问所述区块链的字段类型。作为一种示例,该第一字段类型可以为web3jsdk类型。
沿用上述例子,当获取该JAVA文件中的modifyUserNameEvent类后,首先定位modifyUserNameEvent类中字段类型为web3jsdk类型的字段,例如,该web3jsdk类型的字段可以包括Bytes32、Uint8、Address。然后,根据第一映射关系,将该字段转化为JAVA对象。该第一映射关系可以为:Bytes32对应为String、Uint8对应为int、Address对应为String,该第一映射关系可以是预先存储在数据解析装置100中的。当将该JAVA文件中的web3jsdk类型的字段转化为JAVA对象之后,则可以生成与modifyUserNameEvent类对应的第一POJO对象。例如,与modifyUserNameEvent类的POJO对象的代码如下所示:
S34、将所述第一POJO对象填入预设的事件数据解析模板,生成所述事件数据解析代码。
申请人通过研究事件数据解析流程,得知:针对所有的事件数据,其处理流程基本相同,可以分为如下步骤:调用get函数获取事件对象,然后解析该事件对象,获取该事件对象的事件数据,然后将解析得到的事件数据转换为JAVA对象实例,从而将该JAVA对象实例***数据库表。因此,在本发明实施例中,可以将该处理流程预先设置为多个模块,形成预设的事件数据解析模板,存储在数据解析装置100中,从而,当获取待解析的智能合约中的事件对象后,则直接根据字段类型,将该事件对象填充至该预设的事件数据解析模板,从而得到用于解析该智能合约中的事件数据的事件数据解析代码。这样,当解析不同的智能合约中事件数据时,只需要获取对应的智能合约即可,无需新增接口或者重新修改代码,实现方式简单,且支持二次开发。
作为一种示例,该预设的事件数据解析函数模板中至少包括调用模块、第一解析模块、第一实例化模块以及第一存储模块。其中,该调用模块用于调用所述获取方法,该第一解析模块用于解析所述事件对象并获取解析后的事件数据,该第一实例化模块用于将解析后的事件数据转换为第一POJO对象实例,以及,该第一存储模块用于将所述第一POJO对象实例***数据库表,所述数据库表用于存储所述事件数据和所述交易数据。
针对交易数据解析代码,请参考图4,为生成交易数据解析代码的流程图,该流程图描述如下:
S41、编译所述智能合约,得到与所述智能合约对应的JAVA合约文件。
在本发明实施例中,所述JAVA合约文件中至少包括所述智能合约的二进制编码以及二进制字符串,所述二进制编码中至少包括所述构造方法以及所述非常量方法中每个方法访问所述区块链的字段类型,所述二进制字符串为所述智能合约的递归长度前缀编码。
步骤S41与步骤S31相同,在此不再赘述。
S42、加载所述JAVA合约文件,解析所述二进制编码,获取交易方法。
加载该JAVA文件后,获取该JAVA文件中的ABI字符串,解析该ABI字符串,获取该JAVA文件中的交易方法。例如,可以获取交易方法的名称以及参数字段等。该交易方法包括步骤S21中的构造方法和非常量方法,在此不再赘述。
作为另一种示例,该交易方法也可以从操作指令(opcode)中获取,例如,在获取该JAVA文件中的opcode后,解析opcode,从而获取opcode中的交易方法。
为了保证获取的交易方法的准确性,在获取交易方法后,可以根据获取的交易方法的名称和/或参数字段,确定该交易方法是否是构造方法或者非常量方法,若不是,则退出该流程,若是,则继续后续流程。
S43、通过JAVA对象与第二字段类型之间的第二映射关系,将所述交易方法中的与所述第二字段类型相同的字段转化为JAVA对象,从而获取与所述交易方法对应的第二POJO对象,所述第二字段类型为所述交易方法中用于访问所述区块链的字段类型。
在本发明实施例中,该第二字段类型为所述交易方法中用于访问所述区块链的字段类型。作为一种示例,该第二字段类型可以与第一字段类型相同,例如为web3jsdk类型,或者,该第二字段类型也可以是与第一字段类型不同的其他类型,在此不作限制。
步骤S43与步骤S33相似,在此不再赘述。
S44、将所述第二POJO对象填充预设的交易数据解析模板,生成所述交易数据解析代码。
与步骤S34中相似的原理,申请人通过研究交易数据解析流程,得到针对交易数据的处理过程分为步骤:由于交易数据解析比较复杂,没有办法像事件数据一样直接定位(例如,不同直接通过get函数获取),只能通过匹配方式进行交易匹配,从而确定该交易方法是构造方法还是非常量方法,然后解析交易方法的编码字符串(例如RLP编码字符串),获取该交易方法的交易数据,从而将解析得到的交易数据转换为POJO对象实例,从而根据字段类型,将该POJO对象实例***数据库表。因此,在本发明实施例中,可以将该处理流程预先设置为多个模块,形成预设的交易数据解析模板,存储在数据解析装置100中,从而,当获取待解析的智能合约中的交易方法后,则直接将该交易方法对应的POJO对象填充至该预设的交易数据解析模板,从而得到用于解析该智能合约中的交易数据的交易数据解析代码。
作为一种示例,该预设的交易数据解析模板至少包括匹配模块、第二解析模块、第二实例化模块以及第二存储模块。其中,该匹配模块用于确定所述交易方法为所述构造方法或为所述非常量方法,该第二解析模块用于解析所述交易方法并获取交易数据,该第二实例化模块用于将交易数据转换为第二POJO对象实例,以及,该第二存储模块用于将所述第二POJO对象实例***数据库表。
需要说明的是,当智能合约中既包括事件方法,也包括交易方法,数据解析装置100可以先生成事件数据解析代码,然后再生成交易数据解析代码;也可以先生成交易数据解析代码,然后再生成事件数据解析代码,或者并行生成交易数据解析代码和事件数据解析代码,在此不对其执行的先后顺序进行限制。
S23、使用所述数据解析代码对区块链中的每一个区块中的数据进行解析,获取数据。
当获取与智能合约对应的交易数据解析代码和事件数据解析代码后,则可以运行该交易数据解析代码和事件数据解析代码,来获取每个区块中与该只能合约对应的交易数据和事件数据。
下面分别对事件数据的获取方法和交易数据的获取方法进行说明。
针对事件数据,请参考图5,为使用事件数据解析代码获取事件数据的流程图,该流程图描述如下:
S51、获取所述区块链中的其中一个区块,所述其中一个区块为所述区块链中的任意一个区块。
数据解析装置100可以依次获取区块链中的每一个区块,例如,以图1所示的区块链为例,先获取区块A,对区块A中的事件数据解析完成后,在获取区块B。或者,数据解析装置100也可以随机获取其中一个区块,在此不作限制。需要说明的是,针对每个区块,获取该区块中的事件数据的方式相同,在下文中以区块链中的其中一个区块为例进行说明。
S52、运行所述事件数据解析代码,通过所述事件数据解析代码中的调用模块获取所述区块中的事件对象列表。
当数据解析装置100获取一个区块后,则调用生成的事件数据解析代码,通过调用模块确定该区块中是否存在与该智能合约对应的事件数据,可以理解为,若通过调用模块能够获取对应的事件对象列表,则表示该区块中存在与该智能合约对应的事件数据,否则,则不包括与该智能合约对应的事件数据。
针对前述的UserInfo智能合约,该调用模块会通过get函数,例如,getModifyUserNameEventEvents,获取对应的事件数据列表,例如,List<ModifyUserNameEventResponse>,如果能够获取该List<ModifyUserName--EventResponse>,则表明该区块中存在事件数据,否则,该区块中不存在事件数据。
在本发明实施例中,所述事件对象列表包括所述事件对象的至少一个取值。例如,针对前述的UserInfo智能合约中的userName,在第一时刻,用户设置了userName为第一取值,在第二时刻,用户设置userName为第二取值,则与userName对应的事件对象列表中,则包括该第一取值和该第二取值。
另外需要说明的是,在本发明实施例中,UserInfo智能合约中仅包括一个事件方法,从而数据解析装置100只生成了一个事件数据解析代码,但是在实际使用过程中,一个智能合约中可能包括多个事件方法,从而,数据解析装置100针对一个智能合约会生成多个事件数据解析代码。在这种情况下,当数据解析装置100解析一个区块中的事件数据时,则需要遍历与该智能合约对应的多个事件数据解析代码,如果运行所有的事件数据解析代码都无法获取事件数据列表,则表示该区块中不存在事件数据,否则该区块中存在事件数据。
S53、通过所述事件数据解析代码中的解析模块解析所述事件对象的至少一个取值,获得至少一个解析后的事件数据。
当获取事件对象的至少一个取值后,则通过解析模块对该至少一个取值进行解析,从而获取对应的事件数据。
S54、通过所述事件数据解析代码中的实例化模块将所述至少一个解析后的事件数据分别转化为至少一个第一POJO对象实例。
具体来讲,该至少一个POJO第一对象实例与该至少一个解析后的事件数据一一对应。例如,该事件对象包括2个取值,则解析该2个取值得到2个事件数据,然后,将每个事件数据转化为POJO对象实例,从而得到2个第一POJO对象实例。
S55、通过所述事件数据解析代码中的存储模块将所述至少一个POJO对象实例***所述数据库表中。
当获取与每个事件数据对应的第一POJO对象实例后,则将该获取的第一POJO对象实例***数据库表中,完成对事件数据解析以及同步的过程。
针对交易数据,请参考图6,为使用交易数据解析代码获取交易数据的流程图,该流程图描述如下:
S601、获取所述区块链中的其中一个区块,所述其中一个区块为所述区块链中的任意一个区块。
步骤S601与步骤S51相同,在此不再赘述。
S602、通过预设的交易获取接口,获取所述区块中的第一交易。
该交易获取接口与现有技术中相似,在此不再赘述。
S603、运行所述交易数据解析代码,通过交易数据解析代码中的匹配模块获取所述第一交易中的目标字段,并根据所述目标字段确定所述第一交易的交易类型。
在本发明实施例中,所述交易类型包括第一交易类型和第二交易类型,所述第一交易类型为与所述构造方法对应的交易类型,所述第二交易类型为与所述非常量方法对应的交易类型。该目标字段用于指示该第一交易的交易对象,作为一种示例,该目标字段为To字段。当获取第一交易后,则运行交易数据解析代码,获取该交易中的To字段,确定其是否为空(null),如果为null,则确定第一交易是第一交易类型,否则,确定该第一交易为第二交易类型。
在本申请实施例中,当确定第一交易的交易类型为第一交易类型后,则执行步骤S604~步骤S606以及步骤S610,当确定第一交易的交易类型为第二交易类型后,则执行步骤S607~步骤S610。
另外,与事件数据解析过程相似,若数据解析装置100针对一个智能合约生成了多个交易数据解析代码,则数据解析装置100需要遍历与该智能合约对应的多个交易数据解析代码,在本发明实施例中,以运行一个交易数据解析代码为例进行说明。
S604、在所述第一交易的交易类型为所述第一交易类型时,通过所述匹配模块获取所述第一交易的递归长度前缀编码,确定所述第一交易的递归长度前缀编码是否包括所述二进制字符串。
在本发明实施例中,与构造方法对应的交易数据的存储格式为:binary+encode(data),其中,binary为智能合约的RLP编码字符串,encode为交易数据的编码函数。因此,当确定该第一交易的交易类型为与构造方法对应的交易类型后,则需要比较所有的智能合约的binary字符串,从而确定是与哪一个智能合约的构造方法对应的交易。
具体来讲,前述UserInfo智能合约中的构造方法为UserInfo(bytes32userName,uint8 sex)。当确定该第一交易是与构造方法对应的交易后,则获取UserInfo智能合约的JAVA文件中的binary(长度为M),然后获取该第一交易的RLP编码(长度为N),如果第一交易的RLP编码的前M个字符串和JAVA文件中的binary一样,则该第一交易为执行UserInfo智能合约的构造方法所得。
S605、在为是时,通过所述交易数据解析代码中的第二解析模块,对第一剩余字符串进行解析,获取所述第一交易的第一交易数据,所述第一剩余字符串为所述第一交易的递归长度前缀编码中去除与所述二进制字符串相同的符号之后的字符串。
在确定该第一交易的RLP编码的前M个字符串和JAVA文件中的binary一样后,则去掉该第一交易的RLP编码的前M个字符,即去掉第一交易的binary头,得到长度为(N-M)的第一剩余字符串,然后对该第一剩余字符串进行decode(data)操作,decode()操作是根据每个字段的类型偏移量计算的,从而获取第一交易中各个字段的取值,该各个字段的取值即为至少一个第一交易数据。
具体来讲,第一交易为执行UserInfo智能合约的构造方法所得,则通过解析可以得到字段userName和字段sex的取值,然后,对这两个字段的取值进行解析,则得到第一交易中的至少一个第一交易数据。
S606、通过所述交易数据解析代码中的第二实例化模块将所述第一交易数据转化为第二POJO对象实例。
步骤S606与步骤S54相似,在此不再赘述。
S607、在所述第一交易的交易类型为所述第二交易类型时,通过所述匹配模块获取所述第一交易的递归长度前缀编码,确定所述第一交易的递归长度前缀编码是否包括所述交易数据解析代码所对应的非常量方法的签名。
在本发明实施例中,与非常量方法对应的交易数据的存储格式为:functionSignature+encode(data),其中functionSignature为该非常量方法的签名。因此,当确定该第一交易的交易类型为与非常量方法对应的交易类型后,则需要比较所有的智能合约的非常量方法的签名,从而确定是哪一个非常量方法对应的交易。
具体来讲,前述UserInfo智能合约中的非常量方法为modifyUserName(bytes32userName)。当确定该第一交易是与非常量方法对应的交易后,则获取UserInfo智能合约的JAVA文件中的modifyUserName(bytes32 userName)方法的签名(长度为L),然后获取该第一交易的RLP编码(长度为N),如果第一交易的RLP编码的前L个字符串和modifyUserName(bytes32 userName)方法的签名一样,则该第一交易为执行UserInfo智能合约的非常量方法所得。
S608、在为是时,通过所述交易数据解析代码中的第二解析模块,对第二剩余编码进行解析,获取所述第一交易的第二交易数据,所述第二剩余编码为所述第一交易的编码中去除与所述签名相同的符号之后的字符串。
在确定该第一交易的RLP编码的前L个字符串和modifyUserName(bytes32userName)方法的签名一样后,则去掉该第一交易的RLP编码的前L个字符,即去掉第一交易的签名头,得到长度为(N-L)的第二剩余字符串,然后对该第二剩余字符串进行decode(data)操作,从而获取第一交易中各个字段的取值,该各个字段的取值即为至少一个第一交易数据。
具体来讲,第一交易为执行UserInfo智能合约的非常量方法所得,则通过解析可以得到字段userName、字段sex以及字段address的取值,然后,对这三个字段的取值进行解析,则得到第一交易中的至少一个第一交易数据。
S609、通过所述交易数据解析代码中的第二实例化模块将所述第二交易数据转化为第二POJO对象实例。
S610、通过所述交易数据解析代码中的第二存储模块将所述第二POJO对象实例***所述数据库表中。
步骤S609~步骤S610与步骤S54~步骤S55相似,在此不再赘述。
在上述技术方案中,通过自动根据用户业务的智能合约,生成用于解析数据的代码,也就是说,针对不同的用户业务,只需要用户导入与各个用户业务对应的智能合约即可,无需新增接口或者无需预先存储用于数据解析的代码,从而可以减小用于数据解析的代码占用的存储空间,可以降低解析区块链中的数据的成本。且,根据智能合约生成的代码是与智能合约中的接口一一对应的,因此,在进行数据解析时,不需要调用多个接口或者不需要计算待解析数据的地址,从而可以提高数据解析的性能。
本发明第二方面提供一种区块链的数据解析装置,请参考图7所示,为该数据解析装置的结构示意图,该数据解析装置包括:
获取单元701,用于获取用户业务的智能合约,所述智能合约中包括用于创建实现所述用户业务的构造方法、事件方法以及非常量方法;
生成单元702,用于根据所述构造方法、事件方法以及非常量方法中的至少一个方法,生成数据解析代码,所述数据解析代码包括用于对所述用户业务的事件数据进行解析的事件数据解析代码和用于对所述用户业务的交易数据进行解析的交易数据解析代码;
解析单元703,用于使用所述数据解析代码对区块链中的每一个区块中的数据进行解析,获取所述事件数据和所述交易数据。
由于该数据解析装置是在与本发明提供的区块链的数据解析方法的相同构思下提出的,因此前述图2-图6实施例中的区块链的数据解析方法的各种变化方式和具体实施例同样适用于本实施例的数据解析装置,通过前述对区块链的数据解析方法的详细描述,本领域技术人员可以清楚的知道本实施例中数据解析装置的实施过程,所以为了说明书的简洁,在此不再详述。
本发明第三方面提供一种区块链的数据解析装置,请参考图8所示,为该数据解析装置的结构图,该数据解析装置包括处理器801、收发器802、存储器803,其中,处理器801、存储器803与收发器802之间通过总线接口连接;
处理器801控制收发器802获取用户业务的智能合约,所述智能合约中包括用于创建实现所述用户业务的构造方法、事件方法以及非常量方法;
处理器801根据所述构造方法、事件方法以及非常量方法中的至少一个方法,生成数据解析代码,所述数据解析代码包括用于对所述用户业务的事件数据进行解析的事件数据解析代码和用于对所述用户业务的交易数据进行解析的交易数据解析代码;以及,
使用所述数据解析代码对区块链中的每一个区块中的数据进行解析,获取所述事件数据和所述交易数据。
可选的,处理器801具体可以是中央处理器、特定应用集成电路(英文:Application Specific Integrated Circuit,简称:ASIC),可以是一个或多个用于控制程序执行的集成电路,可以是使用现场可编程门阵列(英文:Field Programmable GateArray,简称:FPGA)开发的硬件电路,可以是基带处理器。
可选的,处理器801可以包括至少一个处理核心。
可选的,电子设备还包括存储器803,存储器803可以包括只读存储器(英文:ReadOnly Memory,简称:ROM)、随机存取存储器(英文:Random Access Memory,简称:RAM)和磁盘存储器。存储器803用于存储处理器801运行时所需的数据。存储器的数量为一个或多个。
由于该数据解析装置是在与本发明提供的区块链的数据解析方法的相同构思下提出的,因此前述图2-图6实施例中的区块链的数据解析方法的各种变化方式和具体实施例同样适用于本实施例的数据解析装置,通过前述对区块链的数据解析方法的详细描述,本领域技术人员可以清楚的知道本实施例中数据解析装置的实施过程,所以为了说明书的简洁,在此不再详述。
本发明第四方面提供了一种计算机装置,所述计算机装置包括:
至少一个处理器,以及,
与所述至少一个处理器通信连接的存储器、通信接口;
其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述至少一个处理器通过执行所述存储器存储的指令,利用所述通信接口执行如图2~图6所示的实施例中的方法。
本发明第五方面提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机指令,当所述计算机指令在计算机上运行时,使得计算机执行如图2~图6所示的实施例中的方法。
本领域内的技术人员应明白,本发明的实施例可提供为方法、***、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

Claims (9)

1.一种区块链的数据解析方法,其特征在于,所述方法包括:
获取用户业务的智能合约,所述智能合约中包括用于创建实现所述用户业务的构造方法、事件方法以及非常量方法;
根据所述构造方法、事件方法以及非常量方法中的至少一个方法,生成数据解析代码,所述数据解析代码包括用于对所述用户业务的事件数据进行解析的事件数据解析代码和用于对所述用户业务的交易数据进行解析的交易数据解析代码;
使用所述数据解析代码对区块链中的每一个区块中的数据进行解析,获取所述事件数据和所述交易数据。
2.根据权利要求1所述的方法,其特征在于,根据所述构造方法、事件方法以及非常量方法中的至少一个方法,生成所述事件数据解析代码,包括:
编译所述智能合约,得到与所述智能合约对应的JAVA合约文件,所述JAVA合约文件中至少包括用于获取所述事件方法中的事件对象的获取方法、与所述事件方法对应的事件类以及所述智能合约的二进制编码,所述智能合约的二进制编码中至少包括所述构造方法、所述事件方法以及所述非常量方法中每个方法访问所述区块链的字段类型;
加载所述JAVA合约文件,通过反射获取所述事件类;
通过JAVA对象与第一字段类型之间的第一映射关系,将所述事件类中的与所述第一字段类型相同的字段转化为JAVA对象,从而获取与所述事件类对应的第一POJO对象,所述第一字段类型为所述事件方法中用于访问所述区块链的字段类型;
将所述第一POJO对象填入预设的事件数据解析模板,生成所述事件数据解析代码,所述预设的事件数据解析函数模板中至少包括调用模块、第一解析模块、第一实例化模块以及第一存储模块,所述调用模块用于调用所述获取方法,所述第一解析模块用于解析所述事件对象并获取解析后的事件数据,所述第一实例化模块用于将解析后的事件数据转换为第一POJO对象实例,以及,所述第一存储模块用于将所述第一POJO对象实例***数据库表,所述数据库表用于存储所述事件数据和所述交易数据。
3.根据权利要求2所述的方法,其特征在于,使用所述事件数据解析代码对区块链中的每一个区块中的数据进行解析,以获取所述事件数据,包括:
获取所述区块链中的其中一个区块,所述其中一个区块为所述区块链中的任意一个区块;
运行所述事件数据解析代码,通过所述事件数据解析代码中的调用模块获取所述区块中的事件对象列表,所述事件对象列表包括所述事件对象的至少一个取值;
通过所述事件数据解析代码中的解析模块解析所述事件对象的至少一个取值,获得至少一个解析后的事件数据;
通过所述事件数据解析代码中的实例化模块将所述至少一个解析后的事件数据分别转化为至少一个第一POJO对象实例,所述至少一个第一POJO对象实例与所述至少一个解析后的事件数据一一对应;
通过所述事件数据解析代码中的存储模块将所述至少一个POJO对象实例***所述数据库表中。
4.根据权利要求1所述的方法,其特征在于,根据所述构造方法、事件方法以及非常量方法中的至少一个方法,生成所述交易数据解析代码,包括:
编译所述智能合约,得到与所述智能合约对应的JAVA合约文件,所述JAVA合约文件中至少包括所述智能合约的二进制编码以及二进制字符串,所述二进制编码中至少包括所述构造方法以及所述非常量方法中每个方法访问所述区块链的字段类型,所述二进制字符串为所述智能合约的递归长度前缀编码;
加载所述JAVA合约文件,解析所述二进制编码,获取交易方法,所述交易方法包括所述构造方法和所述非常量方法;
通过JAVA对象与第二字段类型之间的第二映射关系,将所述交易方法中的与所述第二字段类型相同的字段转化为JAVA对象,从而获取与所述交易方法对应的第二POJO对象,所述第二字段类型为所述交易方法中用于访问所述区块链的字段类型;
将所述第二POJO对象填入预设的交易数据解析模板,生成所述交易数据解析代码,所述预设的交易数据解析模板至少包括匹配模块、第二解析模块、第二实例化模块以及第二存储模块,所述匹配模块用于确定所述交易方法为所述构造方法或为所述非常量方法,所述第二解析模块用于解析所述交易方法并获取交易数据,所述第二实例化模块用于将交易数据转换为第二POJO对象实例,以及,所述第二存储模块用于将所述第二POJO对象实例***数据库表,所述数据库表用于存储所述事件数据和所述交易数据。
5.根据权利要求4所述的方法,其特征在于,使用所述交易数据解析代码对区块链中的每一个区块中的数据进行解析,以获取所述交易数据,包括:
获取所述区块链中的其中一个区块,所述其中一个区块为所述区块链中的任意一个区块;
通过预设的交易获取接口,获取所述区块中的第一交易;
运行所述交易数据解析代码,通过交易数据解析代码中的匹配模块获取所述第一交易中的目标字段,并根据所述目标字段确定所述第一交易的交易类型,所述交易类型包括第一交易类型和第二交易类型,所述第一交易类型为与所述构造方法对应的交易类型,所述第二交易类型为与所述非常量方法对应的交易类型,所述目标字段用于指示所述第一交易的交易对象;
在确定所述第一交易的交易类型为所述第一交易类型时,通过所述匹配模块获取所述第一交易的递归长度前缀编码,确定所述第一交易的递归长度前缀编码是否包括所述二进制字符串;
在为是时,通过所述交易数据解析代码中的第二解析模块,对第一剩余字符串进行解析,获取所述第一交易的第一交易数据,所述第一剩余字符串为所述第一交易的递归长度前缀编码中去除与所述二进制字符串相同的符号之后的字符串;
通过所述交易数据解析代码中的第二实例化模块将所述第一交易数据转化为第二POJO对象实例;
通过所述交易数据解析代码中的第二存储模块将所述第二POJO对象实例***所述数据库表中。
6.根据权利要求5所述的方法,其特征在于,在运行所述交易数据解析代码,通过交易数据解析代码中的匹配模块获取所述第一交易中的目标字段,并根据所述目标字段确定所述第一交易的交易类型之后,所述方法还包括:
在所述第一交易的交易类型为所述第二交易类型时,通过所述匹配模块获取所述第一交易的递归长度前缀编码,确定所述第一交易的递归长度前缀编码是否包括所述交易数据解析代码所对应的非常量方法的签名;
在为是时,通过所述交易数据解析代码中的第二解析模块,对第二剩余编码进行解析,获取所述第一交易的第二交易数据,所述第二剩余编码为所述第一交易的编码中去除与所述签名相同的符号之后的字符串;
通过所述交易数据解析代码中的第二实例化模块将所述第二交易数据转化为第二POJO对象实例;
通过所述交易数据解析代码中的第二存储模块将所述第二POJO对象实例***所述数据库表中。
7.一种区块链的数据解析装置,其特征在于,包括:
获取单元,用于获取用户业务的智能合约,所述智能合约中包括用于创建实现所述用户业务的构造方法、事件方法以及非常量方法;
生成单元,用于根据所述构造方法、事件方法以及非常量方法中的至少一个方法,生成数据解析代码,所述数据解析代码包括用于对所述用户业务的事件数据进行解析的事件数据解析代码和用于对所述用户业务的交易数据进行解析的交易数据解析代码;
解析单元,用于使用所述数据解析代码对区块链中的每一个区块中的数据进行解析,获取所述事件数据和所述交易数据。
8.一种电子设备,其特征在于,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行权利要求1-6任一所述的方法。
9.一种非暂态计算机可读存储介质,其特征在于,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行权利要求1~6任一所述方法。
CN201910550186.0A 2019-06-24 2019-06-24 一种区块链的数据解析方法及装置 Pending CN110264361A (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN201910550186.0A CN110264361A (zh) 2019-06-24 2019-06-24 一种区块链的数据解析方法及装置
PCT/CN2020/097235 WO2020259417A1 (zh) 2019-06-24 2020-06-19 一种区块链的数据解析方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910550186.0A CN110264361A (zh) 2019-06-24 2019-06-24 一种区块链的数据解析方法及装置

Publications (1)

Publication Number Publication Date
CN110264361A true CN110264361A (zh) 2019-09-20

Family

ID=67920915

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910550186.0A Pending CN110264361A (zh) 2019-06-24 2019-06-24 一种区块链的数据解析方法及装置

Country Status (2)

Country Link
CN (1) CN110264361A (zh)
WO (1) WO2020259417A1 (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110738567A (zh) * 2019-09-25 2020-01-31 支付宝(杭州)信息技术有限公司 基于fpga的安全智能合约处理器的交易处理方法及装置
CN110827034A (zh) * 2019-10-31 2020-02-21 支付宝(杭州)信息技术有限公司 用于发起区块链交易的方法及装置
CN111161059A (zh) * 2019-11-29 2020-05-15 合肥学院 一种将事务处理泛化成交易的方法
WO2020259417A1 (zh) * 2019-06-24 2020-12-30 深圳前海微众银行股份有限公司 一种区块链的数据解析方法及装置
CN112860712A (zh) * 2021-04-13 2021-05-28 深圳前海移联科技有限公司 一种基于区块链的交易数据库构建方法、***及电子设备

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10452998B2 (en) * 2017-03-19 2019-10-22 International Business Machines Corporation Cognitive blockchain automation and management
CN107038242B (zh) * 2017-04-24 2020-02-07 杭州趣链科技有限公司 一种面向区块链全局智能合约业务数据解析方法
CN107274186A (zh) * 2017-05-11 2017-10-20 上海点融信息科技有限责任公司 在区块链中获得智能合约接口的方法和设备
CN107918666B (zh) * 2017-11-24 2020-05-12 中钞***产业发展有限公司杭州区块链技术研究院 一种区块链上的数据同步方法和***
CN110264361A (zh) * 2019-06-24 2019-09-20 深圳前海微众银行股份有限公司 一种区块链的数据解析方法及装置

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2020259417A1 (zh) * 2019-06-24 2020-12-30 深圳前海微众银行股份有限公司 一种区块链的数据解析方法及装置
CN110738567A (zh) * 2019-09-25 2020-01-31 支付宝(杭州)信息技术有限公司 基于fpga的安全智能合约处理器的交易处理方法及装置
CN110827034A (zh) * 2019-10-31 2020-02-21 支付宝(杭州)信息技术有限公司 用于发起区块链交易的方法及装置
CN110827034B (zh) * 2019-10-31 2021-10-22 支付宝(杭州)信息技术有限公司 用于发起区块链交易的方法及装置
CN111161059A (zh) * 2019-11-29 2020-05-15 合肥学院 一种将事务处理泛化成交易的方法
CN111161059B (zh) * 2019-11-29 2023-10-31 合肥学院 一种将事务处理泛化成交易的方法
CN112860712A (zh) * 2021-04-13 2021-05-28 深圳前海移联科技有限公司 一种基于区块链的交易数据库构建方法、***及电子设备
CN112860712B (zh) * 2021-04-13 2024-02-09 深圳前海移联科技有限公司 一种基于区块链的交易数据库构建方法、***及电子设备

Also Published As

Publication number Publication date
WO2020259417A1 (zh) 2020-12-30

Similar Documents

Publication Publication Date Title
CN110264361A (zh) 一种区块链的数据解析方法及装置
CN105335412B (zh) 用于数据转换、数据迁移的方法和装置
CN107924326A (zh) 对经更新的类型的迁移方法进行覆盖
CN106598579A (zh) 区块链上集成动态类型编程语言方法和装置
CN103677952B (zh) 编解码器生成装置及方法
CN106970820A (zh) 代码存储方法及代码存储装置
CN108595276A (zh) 业务逻辑的处理方法、***、计算机设备和存储介质
US10402380B1 (en) Interactive user interface for schema transformation
CN113132371A (zh) 报文转换的方法、装置、计算机可读存储介质与处理器
CN101499015A (zh) 一种高级语言转换成其它高级语言的方法及转换器
CN102707948A (zh) 一种源代码生成方法
CN102520963B (zh) 基于强类型关系映射实现业务逻辑处理的方法及***
CN106293770A (zh) 一种表数据的通用导表***和方法
CN101202736A (zh) 一种在通讯网络中实现编解码的方法
US7890548B2 (en) Automation process system and method to upgrade from non-unicode transformation support to unicode data transformation support
CN113254026B (zh) 低代码开发方法及装置
CN104572102A (zh) Java中的中文乱码解决方法
US9684497B1 (en) Optimized compiling of a template function
EP4195092A1 (en) Text processing method and apparatus, system, device, and storage medium
EP3005087A1 (en) Declarative configuration elements
CN110297945A (zh) 基于xbrl的数据信息处理方法及***
CN113849781B (zh) Go语言源代码混淆方法、***、终端及存储介质
US20200356570A1 (en) Interactive user interface having transform operators for schema transformation
CN114356379A (zh) 基于备份的服务升级方法、装置、设备及存储介质
CN110019177A (zh) 规则存储的方法和装置

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