Data-Export数据导出功能介绍
功能介绍
Data-Export为解决查询或分析链上数据,效率低、兼容性差的问题,在链上进行复杂数据分析处理,浪费链上资源问题以及开发能够导出基于自身合约业务数据的应用,重复“造轮子问题,通过提供一种通用化、智能化、标准化的数据导出解决方案,降低区块链数据开发门槛,提升研发效率。
使用者几乎无需编码,只进行简单配置,即可把结构化的数据导出到关系型数据库或ElasticSearch等数据存储中,以便后续业务分析和处理。同时支持多活部署、数据分库分表、导出数据可视化、应用监控等功能,适应各类复杂业务场景,满足业务开发中各项需求,提升使用体验。
特性
支持自动分析、导出智能合约数据
Data-Export支持导出区块链基础数据、基于智能合约自动分析的详情数据。基础数据包含当前块高、交易总量等。如配置了FISO BCOS上运行的合约,则可导出区块链上合约的业务数据,包括event、构造函数、合约地址、执行函数的信息等。
开发者可基于已导出的区块链基础数据,以及智能合约部署合约账户、事件和函数等数据,进行二次开发、定制复杂查询和数据分析的逻辑,快速实现业务需求。
灵活的存储和导出策略
链上存在海量数据时,将数据导出到单个数据库或单个业务表会给运维带来巨大压力,造成数据库性能衰减;如数据量过大,通常需对数据进行分片,将同一表内的数据拆分到多个或同个数据库的多张表中,即分库分表。
为此,Data-Export支持可配置的多数据源存储、读写分离和分库分表。Data-Export也支持ElasticSearch,方便海量数据的存储、查询、检索。
数据导出策略方面,Data-Export提供灵活可配置的区块、交易、事件、账户等数据导出功能,可过滤不需要的事件、函数以及其中的具体字段。如某个合约事件信息无需导出,则可通过配置来过滤该事件信息。
支持多活部署
在大数据、高可用的场景中,单节点部署的数据导出服务通常无法满足业务需要,且一旦单机服务宕机,则无法获取最新数据。多节点部署方案,可将导出任务独立分片到多节点执行,即便个别节点宕机时也能保证任务正常执行,同时还能提升数据导出的效率。
Data-Export支持灵活的分布式部署和任务调度,保证数据导出的高效率和高可用,具备分布式任务协调服务、横向扩展、灵活伸缩的能力。
丰富的API及可视化能力
在数据查询上,Data-Export支持丰富的Restful API数据查询接口,方便用户对链上导出数据完成通用查询操作。
在数据可视化上,Data-Export集成了swagger插件,提供可视化互动API控制台;集成了可视化数据插件Grafana,实现直观、实时、可视化的展示区块链数据;支持自动生成FISCO BCOS链上数据监控视图,让用户对链上数据了如指掌。
架构
codegen模块:代码生成
该模块负责相关合约代码和配置文件的生成,包括合约解析、代码模板、代码生成、组件组装等子模块。
codegen运行模式如下图:
各子模块功能如下:
合约解析模块:解析智能合约文件,获取合约中的交易和event对象。
代码模板模块:用于生成获取交易/event数据的代码模板。
代码生成模块:根据获取的交易和event对象,填充代码模板,生成代码文件。
组件组装模块:用于将生成的代码和core组装成一个独立服务。
core模块:核心模块
该模块是Data-Export的核心模块,它被打包为一个可执行的BootJar包,内置开箱即用的Restful API,开发者可便捷地获得数据导出服务。同时,core自身也是一个示例,向开发者展示了如何组合利用各功能模块Jar包,来开发一个功能完整的数据导出系统。
运行模式如下图:
链上数据由Data-Export任务调度模块统一调度,由BlocakFetcher从链上获取数据到本地处理节点,交由对应的BlockHandler进行解析,最后将解析后的数据封装,交由db数据存储模块进行持久化。
如上所述,Data-Export对于链上数据处理的核心流程为数据获取、解析、持久化三步,其中涉及功能模块包括线程管理、多活管理、数据管理、异常监控、用户访问。
线程管理子模块
该模块旨在单节点运行情况下,最大限度地提升数据导出和处理效率,包括链上数据的获取、解析、任务调度和执行等,均由线程管理模块统一调度。
多活管理子模块
该模块集成了Elastic-Job,现已支持分布式部署、任务分片、弹性扩容、并行调度和定制化流程任务。该组件可在分布式环境下,通过SimpleJob对区块进行抓取,并由DataflowJob对区块进行解析处理。
数据管理子模块
该模块集成了Sharding-JDBC,支持分库分表和读写分离,开发者使用时只需设置分片数,系统会自动生成分片策略配置,将海量数据导出到不同的库表中。
异常监控子模块
该模块负责对导出数据的异常进行监控和处理,包括在任务异常失败时,对区块数据进行回滚,并重试补偿,以及对任务超时的校验。
Data-Export通过脚本监控数据源和链上数据,来确保导出任务的正确执行,监控主要基于两个维度:
(1)一段时间内,DB中的数据开始落后于链上数据,直到达到某个阈值;
(2)链上块高增加,一段时间内,DB中块高不变。
一旦触发其中某一个的条件,则会输出报警日志。
用户访问子模块
该模块提供两种数据访问方式,一种是API方式,支持用户系统本地调用;另一种为REST方式,可通过http方式访问,降低业务耦合性,支持跨平台调用。
用户接口按照数据类型分成四类接口:区块数据接口、账户数据接口、交易数据接口和事件数据接口。其中,每类接口中都支持基于块高、hash或账户的查询,同样也支持基于时间、特定字段的复杂查询.
extractor模块:数据获取
该模块进一步封装了区块链底层平台FISCO BCOS SDK的逻辑,可以更便捷地调用上链功能,获取区块链数据,包括区块高度、交易详情、区块详情等信息。
运行模式如下图:
parser模块:数据解析
该模块封装了区块解析功能,可对链上数据进行分析处理。extractor模块获取链上数据后,由parser模块对合约和区块信息进行完整的解析处理,获得区块、函数、事件、账户等数据详情。
运行模式如下图:
各子模块功能如下:
合约加载:解析器执行前,会加载合约的BIN、ABI和配置信息,计算所有合约函数的MethodId。
账户解析:通过Block获取区块的合约地址,通过合约地址获取runcode后,由预先加载的合约BIN信息,识别账户的类型,最终解析出账户。
函数解析:如函数为构造函数,通过加载合约可解析出函数的值传递信息;如函数非构造函数,则transaction中的to字段即为合约地址。通过合约地址获得函数所属的合约,并根据transaction中附带的input和预先加载的methodId进行比对,可获得函数名。在精准定位了函数所属合约和函数名以后,会触发transactionHandler,并执行对应的解析工作。
事件解析: 基于已解析的transactionHash与合约名映射,可以获取合约名称;根据特定的合约名称,会自动触发该合约下的eventHandler,并执行对应解析工作。
区块解析: 根据获得的Block对象属性解析,获得区块概要信息。
db模块:数据存储
该模块封装了数据存储和查询逻辑,并提供数据存储扩展接口,可进行定制开发,目前默认支持mysql和ElasticSearch的存储。
Data-Export通过db模块将数据导出到存储介质中,每一类数据都有特定的存储格式和模型,包括区块原始数据、解析后的区块数据、合约信息、事件数据和交易数据等多种存储模型,存储模型如下:
存储模型 | 表 | 说明 |
---|---|---|
区块原始数据 | block_raw_data | 区块原始数据表 |
tx_raw_data | 交易原始数据表 | |
tx_receipt_raw_data | 交易回执原始数据表 | |
解析后的区块数据 | block_detail_info | 区块详细数据表 |
block_tx_detail_info | 交易数据表 | |
合约信息 | contract_info | 合约信息表 |
deployed_account_info | 已部署合约详情信息表 | |
事件数据 | 合约名称_事件名称 | 合约事件信息表 |
交易数据 | 合约名称_函数名称 | 合约函数信息表 |
common模块:公共模块
该模块封装了一些公用的数据结构、工具类和公共参数等,包括:
-
链上数据类型转换工具,提供solidity和java类型转换功能支持。
-
合约类扫描解析工具,对配置合约类进行解析,提取有效信息。
-
用于模块间交互的数据对象,在模块间传递信息。
-
全局静态参数,包括任务状态等枚举。
-
时间、格式等常用工具。