当前位置: 首页 > 科技观察

如何将以太坊数据流式传输到QuestDB

时间:2023-03-15 09:35:22 科技观察

本文转载自微信公众号《区块链研究实验室》,作者连三丰。转载本文请联系区块链研究实验室公众号。在本文中,我将介绍如何从以太坊中提取链上数据并将其流式传输到QuestDB以供进一步分析和可视化。先决条件用于访问以太坊链上数据的Python3.6+DockerInfura帐户Infura是一个由Consensys提供支持的开发平台,具有免费套餐(每天10万个请求),我们可以从以太坊主网和测试网中提取数据。注册一个免费帐户并在以太坊下创建一个新项目:记下主网的HTTPS端点(格式为https://mainnet.infura.io/v3/)。使用模式设置QuestDB我们将用于流式传输以太坊数据的ETL脚本提供以下链上信息:区块合约簿日志令牌传输传输,但所有可用链上数据的模式位于ethereum-etl-postgres/模式(需要将Postgres数据类型转换为Java数据类型)。此数据将在QuestDB中编制索引,以利用其高性能时间序列数据。使用Web控制台和Postgres端点启动QuestDB:$dockerrun-p9000:9000-p8812:8812questdb/questdb导航到Web控制台,localhost:9000并为块创建一个表:createtableblocks(timestampstring,numberbigint,hashstring,parent_hashstring,noncestring,sha3_unclesstring,logs_bloomstring,transactions_rootstring,state_rootstring,receipts_rootstring,minersymbol,difficultylong,total_difficultylong,sizelong,extra_datastring,gas_limitlong,gas_usedlong,transaction_countlong);以及用于token_transfers;createtabletoken_transfers(token_addresssymbol,from_addresssymbol,to_addresssymbol,valuefloat,transaction_hashstring,log_indexlong,block_timestampstring,block_numberlong,block_hashstring);刷新表列表后,您应该会看到两个都已填充:现在我们已准备好将Ethereum数据流式传输到我们的数据库。流式传输以太坊链上数据BlockchainETL提供了一个Python脚本来从Infura中提取数据并将其流式传输到GooglePub/Sub或Postgres。现在,我们需要先安装ethereumetl[streaming]:$pip3install"ethereum-etl[streaming]"现在,我们需要指定我们的QuestDB凭据以及InfuraAPI详细信息。Postgres输出采用postgresql+pg8000://:@:/的形式,APIURL通过--provider-uri指定。我们还可以指定起始块编号(或省略从头开始下载所有以太坊数据),以及我们感兴趣的模式:$ethereumetlstream--start-block600000-eblock,token_transfer--outputpostgresql+pg8000://admin:quest@localhost:8812/qdb--provider-urihttps://mainnet.infura.io/v3/当数据开始传输时,您可以在QuestDB中看到它的索引:脚本将自动将最后处理的块存储在last_synced_block.txt中。如果你想稍后运行脚本,你可以删除脚本中的--start-block标志。探索数据和改进QuestDB提供了一些内置的可视化功能。例如,如果您希望gas_used被矿工看到,您可以进入下面的图表并将其设置为以下内容:以太坊ETL脚本当前以RFC3339格式存储时间戳数据,而QuestDB期望从Unix纪元开始有符号偏移量。这就是为什么我们的表模式使用字符串而不是时间序列字段的日期或时间戳。为了获得更高的性能,我们可以先修改ETL脚本,或者先将其流式传输到CloudPub/Sub,然后在流式传输到QuestDB之前转换数据。此外,我们可以在QuestDB上使用to_timestamp()函数在获取数据后修改表。例如,要将块表转换为使用QuestDB理解的正确时间戳,我们可以执行以下操作:SELECTto_timestamp(timestamp,'yyyy-MM-ddHH:mm:ss')AStime,number,miner,difficulty,size,gas_limit,gas_usedFROM(blocksORDERBYtimestamp);最后,如果要流式传输合约或代币数据,需要先将function_sighashes字段扁平化,因为QuestDB还不支持Array类型。有了这些数据,您现在可以计算流行的信号,例如“网络价值与交易比率”,或者重复CoinMetrics或Glassnode上可用的分析。