在搭建了一个以太坊全节点后,可以进一步获取和整理链上的数据,包括区块,交易,token,和转账等信息。Ethereum-ETL就是一个封装了解析以太坊数据结构并以结构化表的形式输出的工具。
GitHub地址
以下表以csv格式输出
blocks区块表 块信息transactions 交易表 交易信息tokens token表 该工具目前输出721和20标准的tokentoken_transfers token交易表receipts 回执表 特定交易的结果回执,包含打包信息,如果是部署合约交易则带合约地址logs 包含触发的内外部交易产生的事件日志traces 交易trace及详细信息 使用方式pip3 install ethereum-etl #python3版本
客户端指令支持单表和全表输出
ethereumetl export_all -s 0 -e 8000000 -b 4000000 -p localhost:8545 -o 800output -w 20
-s -e分别指定需要同步的开始和结束区块
-b 以hdfs的文件形式输出,此参数指定每个分区的区块数量
-p 以太坊节点的地址
-o 目录名
-w 线程池数量
参数源码
cli包作为客户端接受用户指令作为入口
开始执行各个表的具体任务,export_all_common使用组合模式触发各个表的job
拿到具体表对象后使用使用模板类base_job执行表对象的流程
start默认开启一个csv的输出流对象,除此之外,可以构建Kafka,postgres等多种输出sink
根据batch数量和json-rpc签名构造请求对象,再对传入的客户端地址发出请求
用每个表的mapper解析response结果
最后执行输出流对象的export_item方法
以上是普通的区块和交易表导出,过程比较简单
token交易获取通过eth_getFilterLogs来获取指定区块,再利用token_transfer_extractor工具类通过解析topic数组来抽取token转账的交易
receipts和logs的获取先是从transaction导出文件中获取hash列表,写入缓存中
再创建receipts和logs的job对象ExportReceiptsJob,所以,这两张表的导出和前面的交易表是有先后顺序的
contracts和tokens的获取合约则从之前的receipts_file中利用extract_csv_column_unique方法获取合约列表,eth_getCode方法获取合约的bytecode
判断合约类型的方法市面上所有的符合eip标准的合约都可以称之为代币token,主流的有erc20和erc721分别集成eip20和eip721,另外还有erc1155,用作为道具等创建场景的token类型,每种标准体现出的是具体的函数签名,只要一个合约的abi体现出相应的签名则能说明其token类型。
本项目分别解析其abi中是否有721和20的签名来区分两种token类型
tokens表的获取逻辑和合约的类似
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)