用于将以太坊区块链数据导出为CSV或JSON的工具

ethereum-etl的Python项目详细描述


以太坊ETL

在https://gitter.im/ethereum-eth加入聊天构建状态加入电报组

安装以太坊ETL:

pip3 install ethereum-etl

导出块和事务(schema,引用:):

> ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000\
--provider-uri https://mainnet.infura.io --blocks-output blocks.csv --transactions-output transactions.csv

导出ERC2 0和ERC721传输(架构引用):

> ethereumetl export_token_transfers --start-block 0 --end-block 500000\
--provider-uri file://$HOME/Library/Ethereum/geth.ipc --output token_transfers.csv

导出跟踪(架构引用):

> ethereumetl export_traces --start-block 0 --end-block 500000\
--provider-uri file://$HOME/Library/Ethereum/parity.ipc --output traces.csv

流块、事务、日志、令牌持续地传输到控制台(引用):

> pip3 install ethereum-etl[streaming]
> ethereumetl stream --start-block 500000 -e block,transaction,log,token_transfer --log-file log.txt

在此处查找其他命令

有关最新版本,请查看回购协议并致电

> pip3 install -e . 
> python3 ethereumetl.py

限制

目录

模式

blocks.csv

<表><广告>列键入< /广告><正文>数字bigint散列十六进制字符串父哈希十六进制字符串nonce十六进制字符串SHA3叔叔十六进制字符串原木开花十六进制字符串事务根目录十六进制字符串状态根十六进制字符串收据根十六进制字符串矿工地址难度数字总难度数字尺寸bigint额外数据十六进制字符串气体极限bigint使用的气体bigint时间戳bigint交易计数bigint

transactions.csv

<表><广告>列键入< /广告><正文>散列十六进制字符串noncebigint块哈希十六进制字符串块号bigint交易指数bigint起始地址地址收件人地址地址值数字气体bigint天然气价格bigint输入十六进制字符串块时间戳bigint

token_transfers.csv

<表><广告>列键入< /广告><正文>令牌地址地址起始地址地址收件人地址地址值数字事务哈希十六进制字符串对数索引bigint块号bigint

收据.csv

<表><广告>列键入< /广告><正文>事务哈希十六进制字符串交易指数bigint块哈希十六进制字符串块号bigint累计用气量bigint使用的气体bigint合同地址地址根十六进制字符串状态bigint

logs.csv

<表><广告>列键入< /广告><正文>对数索引bigint事务哈希十六进制字符串交易指数bigint块哈希十六进制字符串块号bigint地址地址数据十六进制字符串主题字符串

contracts.csv

<表><广告>列键入< /广告><正文>地址地址字节码十六进制字符串功能说明字符串是否为ERC2 0布尔型是否为ERC721布尔型块号bigint

tokens.csv

<表><广告>列键入< /广告><正文>地址地址符号字符串姓名字符串小数bigint供应总量数字

traces.csv

<表><广告>列键入< /广告><正文>块号bigint事务哈希十六进制字符串交易指数bigint起始地址地址收件人地址地址值数字输入十六进制字符串输出十六进制字符串跟踪类型字符串呼叫类型字符串奖励类型字符串气体bigint使用的气体bigint子竞赛bigint<跟踪地址字符串错误字符串状态bigint

您可以在https://github.com/medvedev1088/ethereum-etl-aiflow/tree/master/dags/resources/stages/raw/schemas" rel="nofollow">https://github.com/medvedev1088/ethereum etl aiflow中找到列描述

注意:对于地址类型,所有十六进制字符都是小写的。 booleantype可以有两个值:truefalse

限制

  • 如果契约是一个代理,它将所有调用转发给一个代理,则接口检测不起作用, 这意味着对于代理合同,is erc20is erc721将始终为false,并且它们将在令牌中丢失
  • ERC20的元数据方法(symbolnamedecimalstotal_supply)是可选的,因此大约10%的 合同缺少此数据。还有一些合同(EOS)实现了这些方法,但是返回类型错误, 因此,在这种情况下,元数据列也会丢失。
  • token_transfers.valuetokens.decimalstokens.total_supply在bigquery表中有类型string, 因为数字类型不能处理32字节的整数。你应该用 强制转换(值为float64)(可能丢失精度)或 安全强制转换(数值形式)(可能溢出)以转换为数字。
  • 未实现decimals()函数但具有 回退函数返回布尔值 将在CSV的小数列中有01

导出区块链

如果你想拥有区块链数据平台 在AWS或GCP中为您设置和主持,与我们联系 这里

  1. 安装python 3.5.3+https://www.python.org/downloads/

  2. 如果不需要erc20传输,可以使用infura(infura不支持eth_getfilterlogs json rpc方法)。 为此,请为下面的命令使用-p https://mainnet.infura.io选项。如果你需要转ERC20或者想 将数据导出快40倍,您需要设置一个本地以太坊节点:

  3. 安装gethhttps://github.com/ethereum/go-ethereum/wiki/installing geth

  4. 开始吧。 通过在js控制台中执行eth.syncing来确保下载了所需的块。 您可以在currentblock下面导出块, 无需等到完全同步,因为不需要状态(除非您还需要契约字节码 以及令牌详细信息;对于那些需要等待完全同步的用户。

  5. 安装以太坊ETL:

    > pip3 install ethereum-etl
    
  6. 全部导出:

    > ethereumetl export_all --help
    > ethereumetl export_all -s 0 -e 5999999 -b 100000 -p file://$HOME/Library/Ethereum/geth.ipc -o output
    

    如果路径中没有ethereumetl命令,请改用python3-m ethereumetl

    结果将出现在output子目录中,按配置单元样式分区:

    output/blocks/start_block=00000000/end_block=00099999/blocks_00000000_00099999.csv
    output/blocks/start_block=00100000/end_block=00199999/blocks_00100000_00199999.csv
    ...
    output/transactions/start_block=00000000/end_block=00099999/transactions_00000000_00099999.csv
    ...
    output/token_transfers/start_block=00000000/end_block=00099999/token_transfers_00000000_00099999.csv
    ...
    
  7. < > >

    应该在Linux、Mac、Windows上使用geth和parity。 如果使用奇偶校验,则应使用--no warp选项禁用warp模式,因为warp模式 不会将所有块或接收数据放入数据库https://wiki.parity.io/getting-synced

    如果您看到奇怪的行为,例如csv文件中错误的行数或损坏的文件, 查看此问题:https://github.com/medvedev1088/ethereum etl/issues/28

    2小时后导出

    您可以使用aws自动缩放和数据管道将导出时间减少到几个小时。 阅读本文了解详细信息https://medium.com/@medvedev1088/how-to-export-the-entire-ethereum-blockchain-to-csv-in-2-hours-for-10-69fef511e9a2

    在Docker中运行

    1. 安装dockerhttps://docs.docker.com/install/

    2. 建立Docker图像

      pip3 install ethereum-etl
      
      0
    3. 从图像中运行容器

      pip3 install ethereum-etl
      
      1
    4. 运行流媒体到控制台或发布/订阅

      pip3 install ethereum-etl
      
      2
    5. < > >

      命令参考

      所有命令都接受-h参数以获取帮助,例如:

      pip3 install ethereum-etl
      
      3

      对于--output参数,支持的类型是csv和json。格式类型是从输出文件名推断出来的。

      导出块和事务

      pip3 install ethereum-etl
      
      4

      如果您只想导出事务/块,请省略--blocks output--transactions output选项。

      您可以调整--batch size--max workers以提高性能。

      块和事务模式

      导出令牌传输

      infura不支持此命令中使用的api,因此需要一个本地节点。 如果您想使用infura导出erc20传输,请参阅extract戥u token戥transfers

      pip3 install ethereum-etl
      
      5

      include--tokens<;token1>;--tokens<;token2>;仅过滤某些令牌,例如

      pip3 install ethereum-etl
      
      6

      您可以调整--batch size--max workers以提高性能。

      令牌传输架构

      导出收据和日志

      首先从transactions.csv中提取事务哈希值 (通过导出戋u blocks戋u and戋u transactions导出):

      pip3 install ethereum-etl
      
      7

      然后导出收据和日志:

      pip3 install ethereum-etl
      
      8

      如果您只想导出日志/收据,请省略--收据输出或--日志输出选项。

      您可以调整--batch size--max workers以提高性能。

      向上投票此功能请求https://github.com/paritytech/parity/issues/9075, 它将使收据和原木出口更快。

      收据和日志架构

      提取令牌传输

      第一个导出收据日志,其中包含导出收据日志

      然后从logs.csv文件中提取传输:

      pip3 install ethereum-etl
      
      9

      您可以调整--batch size--max工人以提高绩效。

      令牌传输架构

      出口合同

      首先从receipts.csv中提取合同地址 (导出时使用导出戋u receipts戋u and戋u logs):

      > ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000\
      --provider-uri https://mainnet.infura.io --blocks-output blocks.csv --transactions-output transactions.csv
      
      0

      然后出口合同:

      > ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000\
      --provider-uri https://mainnet.infura.io --blocks-output blocks.csv --transactions-output transactions.csv
      
      1

      您可以调整--batch size--max workers以提高性能。

      合同模式

      导出令牌

      首先从contracts.json (与export戋u contracts一起导出):

      > ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000\
      --provider-uri https://mainnet.infura.io --blocks-output blocks.csv --transactions-output transactions.csv
      
      2

      然后导出erc20/erc721令牌:

      > ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000\
      --provider-uri https://mainnet.infura.io --blocks-output blocks.csv --transactions-output transactions.csv
      
      3

      您可以调整--max workers以提高性能。

      令牌架构

      导出跟踪

      也称为内部交易。 infura不支持此命令中使用的api, 因此,您将需要一个本地奇偶校验存档节点(奇偶校验--跟踪打开)。 确保节点至少有8GB内存,否则将面临超时错误。 请参见此问题。

      > ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000\
      --provider-uri https://mainnet.infura.io --blocks-output blocks.csv --transactions-output transactions.csv
      
      4

      您可以调整--batch size--max workers以提高性能。

      跟踪架构

      导出跟踪

      读取geth和parity tracessv之间的差异rel="nofollow">geth和parity traces.csv之间的差异

      infura不支持此命令中使用的api, 所以您需要一个本地geth存档节点(geth--gcmode archive--syncmode full--ipcapi debug)。 使用rpc时,添加--rpc--rpcapi debug选项。

      > ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000\
      --provider-uri https://mainnet.infura.io --blocks-output blocks.csv --transactions-output transactions.csv
      
      5

      您可以调整--batch size--max workers以提高性能。

      提取痕迹

      > ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000\
      --provider-uri https://mainnet.infura.io --blocks-output blocks.csv --transactions-output transactions.csv
      
      6

      您可以调整--batch size--max workers以提高性能。

      获取日期的块范围

      > ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000\
      --provider-uri https://mainnet.infura.io --blocks-output blocks.csv --transactions-output transactions.csv
      
      7

      获取keccak哈希值

      > ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000\
      --provider-uri https://mainnet.infura.io --blocks-output blocks.csv --transactions-output transactions.csv
      
      8

      > ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000\
      --provider-uri https://mainnet.infura.io --blocks-output blocks.csv --transactions-output transactions.csv
      
      9
      • 默认情况下,此命令将块、事务、日志、令牌传输输出到控制台。
      • 实体类型可以用-e选项指定, 例如,-e block、transaction、log、token_transfer、trace、contract、token
      • 使用--output选项指定发布区块链数据的google pub/sub主题, 例如,项目/<;您的项目>;/主题/比特币区块链。数据将被推送到 项目/<;您的项目>;/主题/比特币区块链。区块项目/<;您的项目>;/主题/比特币区块链。交易 等主题。
      • 该命令将其状态保存为last_synched_block.txt文件,其中定期保存上次同步的块号。
      • 指定--start block--last synced block file选项。--上次同步的块文件应该指向 用于开始对区块链数据进行流式处理的区块号保存位置的文件。
      • 使用--lag选项指定要滞后于区块链头部的块数。这是最简单的方法 处理链式重组-它们离头部越远就越不可能。
      • 您可以调整--period seconds--batch size--block batch size--max workers以提高性能。
      • 如需有关区块链ETL流媒体的信息,请参阅 关于部署到Kubernetes的说明。

      将区块链数据连续传输到google pub/sub:

      > ethereumetl export_token_transfers --start-block 0 --end-block 500000\
      --provider-uri file://$HOME/Library/Ethereum/geth.ipc --output token_transfers.csv
      
      0

      运行测试

      > ethereumetl export_token_transfers --start-block 0 --end-block 500000\
      --provider-uri file://$HOME/Library/Ethereum/geth.ipc --output token_transfers.csv
      
      1

      进行毒性试验

      > ethereumetl export_token_transfers --start-block 0 --end-block 500000\
      --provider-uri file://$HOME/Library/Ethereum/geth.ipc --output token_transfers.csv
      
      2

      以太坊经典支持

      要获取etc csv文件,请确保传入--chainClassicparam要导出的脚本所需的位置。 如果您的--provider uri是infura,则etc不会运行。它将提供警告并将提供程序uri改为https://ethereumclastic.network。为了获得更快的性能,请在本地运行一个客户机以运行Classic,例如奇偶校验链=classic和geth classic。

      geth和parity traces.csv之间的差异

      • to_address字段与callcode跟踪不同(geth似乎返回正确的值,因为to_address的奇偶校验值与父调用的to_address的奇偶校验值相同);
      • geth输出没有奖励跟踪;
      • geth输出没有到u地址从u地址对于自杀跟踪;
      • error字段包含人类可读的错误消息,它们在geth/parity输出中可能有所不同;
      • geth输出没有事务哈希
      • 使用的气体在记录道上为0,在geth中为错误,奇偶校验中为空;
      • 子包的零输出是geth中的0x000…,奇偶校验中的0x

      在Amazon Athena中查询

      • 将文件上载到s3:
      > ethereumetl export_token_transfers --start-block 0 --end-block 500000\
      --provider-uri file://$HOME/Library/Ethereum/geth.ipc --output token_transfers.csv
      
      3
      > ethereumetl export_token_transfers --start-block 0 --end-block 500000\
      --provider-uri file://$HOME/Library/Ethereum/geth.ipc --output token_transfers.csv
      
      4
      • 创建表:
        • 块:schemas/aws/blocks.sql rel="nofollow">schemas/aws/blocks.sql
        • 事务:schemas/aws/transactions.sql rel="nofollow">schemas/aws/transactions.sql
        • token_传输:schemas/aws/token_transfers.sql rel="nofollow">schemas/aws/token_transfers.sql
        • 合同:schemas/aws/contracts.sql rel="nofollow">schemas/aws/contracts.sql
        • 收据:schemas/aws/receipts.sql rel="nofollow">schemas/aws/receipts.sql
        • 日志:schemas/aws/logs.sql rel="nofollow">schemas/aws/logs.sql
        • 令牌:schemas/aws/tokens.sql rel="nofollow">schemas/aws/tokens.sql

      气流dags

      有关说明,请参阅https://github.com/medvedev1088/ethereum-etl-airlow" rel="nofollow">https://github.com/medvedev1088/ethereum etl airlow。

      拼花文件表

      阅读本文了解如何将CSV转换为拼花https://medium.com/@medvedev1088/converting-etreum-etl-files-to-parquet-399e048ddd30

      注意,在配置单元中,十进制类型限制为38位数字https://cwiki.apache.org/confluence/display/hive/languagemanual+types languagemanualtypes decimal 因此,大于38位小数的值将为空。

      在google bigquery中查询

      公共数据集

      您可以在公共bigquery数据集中查询每天更新的数据 https://medium.com/@medvedev1088/ethereum-blockchain-on-google-bigquery-283fb300f579

      如何查询所有以太坊地址的余额

      读这篇文章 https://medium.com/google cloud/how-to-query-balances-for-all-ethereum-addresses-in-bigquery-fb594e4034a7

      在google云平台上构建令牌推荐器

      读这篇文章 https://medium.com/google cloud/building-token-recommender-in-google-cloud-platform-1be5a54698eb

      媒体中的区块链ETL

      欢迎加入QQ群-->: 979659372 Python中文网_新手群

      推荐PyPI第三方库


热门话题
maven字段#getGenericType()抛出java。lang.TypeNotPresentException   用java绘制三角形的几何图形   java无法下载主题和发件人地址(rediff)   java如何使代码线程安全   java在尝试转换FileInputStream中的文件时,我遇到了一个FileNotFound异常   java Moxy和Jackson如何将Json映射到Pojo   在foreach循环中使用BufferedWriter生成新行的java问题   java为什么我的测试在单次执行中运行时间小于1秒,而在maven构建中运行时间大于20秒?   java如何显示下载附件的进度条   了解java rmi的良好实践   .net可以将Java portlet嵌入ASP。网页?   循环如何多次执行Java方法?   java如何确保用户输入在给定的有效范围内?   java单元测试定理   java如何在IntelliJ上运行外部构建项目?   JAVA:试图编写一个检查字符串是否为数字的方法。总是返回错误   javahadoop将特定键的所有map方法生成的所有值都发送到一个reduce方法,对吗?   在java中读取和使用文件