ethereum-etl学习
ethereum-etl学习1
> ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000 \
--blocks-output blocks.csv --transactions-output transactions.csv \
--provider-uri https://mainnet.infura.io/v3/7aef3f0cd1f64408b163814b22cc643c
function export_blocks_and_transactions
def export_blocks_and_transactions(start_block, end_block, batch_size, provider_uri, max_workers, blocks_output,transactions_output, chain='ethereum'):"""Exports blocks and transactions."""provider_uri = check_classic_provider_uri(chain, provider_uri)if blocks_output is None and transactions_output is None:raise ValueError('Either --blocks-output or --transactions-output options must be provided')job = ExportBlocksJob(start_block=start_block,end_block=end_block,batch_size=batch_size,batch_web3_provider=ThreadLocalProxy(lambda: get_provider_from_uri(provider_uri, batch=True)),max_workers=max_workers,item_exporter=blocks_and_transactions_item_exporter(blocks_output, transactions_output),export_blocks=blocks_output is not None,export_transactions=transactions_output is not None)job.run()
功能
导出以太坊链上start到end所有块的信息,输出块信息blocks_output和交易信息transactions_output(可指定为csv文件)
主体
判断在以太坊链中是否存在一个有效的provider_uri
判断输入块号和输出块号是否为同时为空
构建一个挖掘信息的job–ExportBlocksJob
运行job
class ExportBlocksJob
class ExportBlocksJob(BaseJob)
构造(部分)
batch_web3_provider 通过一个代理工厂的方式获取一个web3的连接对象
batch_work_executor 构造批处理的执行者
item_exporter 设置挖掘匹配的字段,以及存储文件
transaction_mapper 实现transaction对象和json的转换解析
block_mapper 实现block和json之间的转换,可以传入transaction_mapper
run()方法调用
def _start(self):self.item_exporter.open()
准备存储block和transaction的文件
def _export(self):self.batch_work_executor.execute(range(self.start_block, self.end_block + 1),self._export_batch,total_items=self.end_block - self.start_block + 1)
调用batch_work_executor的execute方法
_export_batch批次获取以太坊的块内容以及交易信息
def _end(self):self.batch_work_executor.shutdown()self.item_exporter.close()
释放batch_work_executor对象,以及关闭存储block和transaction信息的文件
class BatchWorkExecutor
class BatchWorkExecutor:
构造(部分)
executor 属于FailSafeExecutor对象(嵌套一个BoundedExecutor对象),执行主要工作的
progress_logger 线程安全的自定义程序日志统计(运行时间等)
logger 通过工厂方法获取一个logger实例
execute()方法调用
def execute(self, work_iterable, work_handler, total_items=None):self.progress_logger.start(total_items=total_items)for batch in dynamic_batch_iterator(work_iterable, lambda: self.batch_size):self.executor.submit(self._fail_safe_execute, work_handler, batch)
1.启动progress_logger 开始计时以及打印日志
2.对于每个start_block块号到end_block之间的获取一个块号,通过动态调节(当前存储在内存的batch数量小于等于batch_size,否则释放之前的batch)的批处理函数获取一个当前读取区块链号
3.调用executor 的submit方法
class BoundedExecutor
class BoundedExecutor:
构造
_delegate 通过ThreadPoolExecutor构造一个线程池
_semaphore 通过BoundedSemaphore得到一个有界信号量对象
class FailSafeExecutor
class FailSafeExecutor:
构造
_delegate 引用BoundedExecutor_delegate
_futures 保存多线程运行的一组对象,通过调用done函数判断是否完成
submit()方法调用
def submit(self, fn, *args, **kwargs):self._check_completed_futures()future = self._delegate.submit(fn, *args, **kwargs)self._futures.append(future)return future
1.检查所有之前的线程有没有完成,如果完成则释放线程锁,可以让线程池空出一个位置
2.提交一个新的任务,返回一个线程运行的对象
3.添加到_futures 中方便下次检查
总结
export_blocks_and_transactions这个命令调用时,首先通过一系列的数据校验(包括起始块和目标块的参数,请求地址是否在链上等),然后通过创建ExportBlocksJob对象,把请求的任务进行一个封装,通过BatchWorkExecutor来进行执行。而BatchWorkExecutor中也定义了一个批次处理任务的线程池以及信号量用于管理最多运行的线程数目,同时负责任务的执行。整个链的获取来看,整体并没有考虑到区块链的回滚,以及错误数据获取的情况,缺乏安全性。
ethereum-etl学习相关推荐
- ETL学习之四:SQL Server Integration Services入门
ETL学习之四:SQL Server Integration Services入门 SSIS就是微软在SQL SERVER2005上对DTS的升级,不得不说,微软在BI上是花了很大功夫的,包括提供了S ...
- ETL学习心得:探求数据仓库关键环节ETL的本质【转】
ETL学习心得:探求数据仓库关键环节ETL的本质 做数据仓库系统,ETL是关键的一环.说大了,ETL是数据整合解决方案,说小了,就是倒数据的工具.回忆 一下工作这么些年来,处理数据迁移.转换的工作倒还 ...
- ETL学习总结(2)——ETL数据集成工具之kettle、sqoop、datax、streamSets 比较
前言 对于数据集成类应用,通常会采用ETL工具辅助完成.ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).交互转换(transfo ...
- ETL学习总结(1)——ETL 十大功能特性详解
前言 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行.说白了就是,很有必要去理解一般ETL工具必备的特性和功能,这样才更好的掌握Kettle的使 ...
- ETL学习-前期准备
一.ETL (一).ETL是什么 ETL,Extract-Transform-Load的缩写,中文名为数据抽取.转换和加载.ETL 代表提取.转换和加载,是数据工程师用从不同来源提取数据.将数据转换为 ...
- ETL学习之五:创建新的 Integration Services 项目
在 Microsoft SQL Server 2005 Integration Services (SSIS) 中创建包的第一步就是创建一个 Integration Services 项目.此项目包含 ...
- 【从零开始的大数据学习】Flink官方教程学习笔记(一)
Flink官方教程学习笔记 学习资源 基础Scala语法 Scala数据结构专题 声明变量 代码块 函数(function) 方法(methods) Traits (接口) class(类) tupl ...
- 视频教程-Informatica PowerCenter 10.2 权威指南中文版-ETL
Informatica PowerCenter 10.2 权威指南中文版 2018 -- 今天 派客动力 CTO 2007-2018 Informatica 中国区技术总监 <Informati ...
- 以太坊开发者工具的最新清单
以太坊开发者工具的最新终极清单,用于在以太坊上开发应用程序的可用工具,组件,框架和平台的指南. 对于任何开发者,无论你是一个睁大眼睛的Web3新手还是一个头发灰白的OG加密无政府主义技术霸主,Gith ...
- 100个数据分析常用指标和术语
大家好,我是辰哥~ 有个朋友是金融行业产品经理,最近在对已有的站内用户做分层与标签分类,需要对用户进行聚类分析.一般从事数据分析行业的朋友对这类词并不陌生,但是像市场运营人员就会把这类些名词概念搞混, ...
最新文章
- raid卡组不同raid_乐扩IO-PCE9230-4IR阵列卡组阵列教程
- Vmware Tools安装之Ubuntu7.10问题解决--持续更新中
- [zjoi2017]仙人掌
- InstallShield 常用常量
- fan怎么写 jin_拼音为fan的字
- 用c语言实现简单的tcp协议,实现一个简单的TCP协议下的C/S
- Testing - Codereview Checklist
- ibm服务器单盘从装系统,thinkpad系统重装图文详解
- 人工智能十大算法_套磁amp;科研 |南加利福尼亚大学空间科学研究所终身教授YaoYi Chiang带来数据挖掘算法研究课题...
- DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》证书考试历年真题及其解析之2021年/2022年
- PostgreSQL应用(二,客户端工具————CRUD)
- [人物]USTC十大IT精英
- LM358资料及引脚图
- 小程序在wxml里转数字_微信小程序 之wxml保留小数点后两位数的方法及转化为字符串的方法...
- appium示例代码python_Appium+python测试app实例
- 互联网医疗仅剩的平台型超级独角兽,微医如何冲出重围?
- 盛迈坤电商:拼多多推广数据多久会显示
- spring管理事务管理1----------编程式(以下源码均为spring2.5.6)
- python进行图像滤波_Python图像滤波处理操作示例【基于ImageFilter类】
- IDC许可证是什么,如何办理IDC增值电信业务经营许可证年报
热门文章
- Matlab_Robotic_Toolbox 机器人工具箱
- Mvvm中的Lifecycle
- JBoot框架定时任务一个注解轻松带你实现
- xz1推送android9.0,索尼XZ1/XZP港版正式推送Android 9.0更新 搭载4K HDR显示屏
- Java学习之路 -- Java怎么学?
- 【基础算法】二叉树相关题目
- 强大的项目管理软件:OmniPlan Pro 4 mac中文版
- mysql数据库巡检工作内容_数据库巡检
- Windows11 WSL2 ubuntu中vscode调试代码
- 屏蔽第三方网站中的百度广告和百度推荐