本文转载自微信公众号「区块链研究实验室」,作者链三丰。转载本文请联系区块链研究实验室公众号。
本文中,将和大家介绍如何从以太坊中提取链上数据并将其数据流传输到QuestDB以便于进行进一步的分析和可视化。
先决条件
- Python 3.6+
- 码头工人
- Infura帐户
访问以太坊链上数据
Infura是由Consensys提供支持的开发平台,具有免费层(每天10万个请求),我们可以从以太坊主网和Testnets提取数据。
注册一个免费帐户并在以太坊下创建一个新项目:
记下Mainnet的HTTPS端点(格式为https://mainnet.infura.io/v3/
使用架构设置QuestDB
我们将用于流以太坊数据的ETL脚本提供以下链上信息:
- 积木
- 合约书
- 日志
- 代币转移
- 代币
- 痕迹
- 交易次数
简单起见,在此示例中,我们仅流式传输块和令牌传输,但是所有可用链上数据的模式都位于ethereum-etl-postgres / schema下(需要将Postgres数据类型转换为Java数据类型)。该数据将在QuestDB中建立索引,以利用其高性能的时间序列数据。
使用Web控制台和Postgres端点启动QuestDB:
$ docker run -p 9000:9000 -p 8812:8812 questdb/questdb
- 1.
导航至Web控制台,localhost:9000然后为块创建表:
create table blocks
(
timestamp string,
number bigint,
hash string,
parent_hash string,
nonce string,
sha3_uncles string,
logs_bloom string,
transactions_root string,
state_root string,
receipts_root string,
miner symbol,
difficulty long,
total_difficulty long,
size long,
extra_data string,
gas_limit long,
gas_used long,
transaction_count long
);
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
以及用于token_transfers;
create table token_transfers
(
token_address symbol,
from_address symbol,
to_address symbol,
value float,
transaction_hash string,
log_index long,
block_timestamp string,
block_number long,
block_hash string
);
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
刷新表格列表后,您应该看到两个都已填充:
现在我们准备将以太坊数据流式传输到我们的数据库。
流以太坊链上数据
区块链ETL提供了一个Python脚本,可从Infura中提取数据并将其流式传输到Google Pub / Sub或Postgres。现在,我们需要先安装ethereumetl[streaming]:
$ pip3 install "ethereum-etl[streaming]"
- 1.
现在,我们需要指定我们的QuestDB凭据以及Infura API详细信息。
Postgres输出采用以下形式,postgresql+pg8000://
$ ethereumetl stream --start-block 600000 -e block,token_transfer --output postgresql+pg8000://admin:quest@localhost:8812/qdb --provider-uri https://mainnet.infura.io/v3/<my-project-id>
- 1.
当数据开始传输时,您可以在QuestDB中看到它的索引:
该脚本会自动将最后处理的块存储在中last_synced_block.txt。如果要稍后运行脚本,则可以删除--start-block脚本中的标志。
探索数据和改进
QuestDB提供了一些内置的可视化功能。例如,如果您想gas_used由矿工看,则可以进入下面Chart并将其设置为以下内容:
以太坊ETL脚本当前以RFC3339格式存储时间戳数据,而QuestDB期望从Unix Epoch开始有符号偏移。这就是为什么我们的表架构为时间序列字段使用字符串而不是日期或时间戳的原因。
为了获得更高的性能,我们可以先修改ETL脚本,或者先将其流式传输到Cloud Pub / Sub,然后转换数据,然后再流式传输到QuestDB。
另外,我们可以to_timestamp()在提取数据后使用QuestDB上的功能来修改表。例如,要转换blocks表以使用QuestDB理解的正确时间戳,我们可以执行以下操作:
SELECT to_timestamp(timestamp, 'yyyy-MM-dd HH:mm:ss')
AS time, number, miner, difficulty, size, gas_limit, gas_used
FROM (blocks
ORDER BY timestamp);
- 1.
- 2.
- 3.
- 4.
最后,如果您要流式传输合同或令牌数据,则需要先将function_sighashes字段展平,因为QuestDB本身还不支持Array类型。
有了这些数据,现在您就可以计算出流行的信号,例如“网络价值与交易比率”,或者在Coin Metrics或Glassnode上提供的重复分析。