如何將以太坊數(shù)據(jù)流傳輸?shù)絈uestDB
本文轉(zhuǎn)載自微信公眾號(hào)「區(qū)塊鏈研究實(shí)驗(yàn)室」,作者鏈三豐。轉(zhuǎn)載本文請(qǐng)聯(lián)系區(qū)塊鏈研究實(shí)驗(yàn)室公眾號(hào)。
本文中,將和大家介紹如何從以太坊中提取鏈上數(shù)據(jù)并將其數(shù)據(jù)流傳輸?shù)絈uestDB以便于進(jìn)行進(jìn)一步的分析和可視化。
先決條件
- Python 3.6+
- 碼頭工人
- Infura帳戶
訪問(wèn)以太坊鏈上數(shù)據(jù)
Infura是由Consensys提供支持的開發(fā)平臺(tái),具有免費(fèi)層(每天10萬(wàn)個(gè)請(qǐng)求),我們可以從以太坊主網(wǎng)和Testnets提取數(shù)據(jù)。
注冊(cè)一個(gè)免費(fèi)帳戶并在以太坊下創(chuàng)建一個(gè)新項(xiàng)目:
記下Mainnet的HTTPS端點(diǎn)(格式為https://mainnet.infura.io/v3/
使用架構(gòu)設(shè)置QuestDB
我們將用于流以太坊數(shù)據(jù)的ETL腳本提供以下鏈上信息:
- 積木
- 合約書
- 日志
- 代幣轉(zhuǎn)移
- 代幣
- 痕跡
- 交易次數(shù)
簡(jiǎn)單起見,在此示例中,我們僅流式傳輸塊和令牌傳輸,但是所有可用鏈上數(shù)據(jù)的模式都位于ethereum-etl-postgres / schema下(需要將Postgres數(shù)據(jù)類型轉(zhuǎn)換為Java數(shù)據(jù)類型)。該數(shù)據(jù)將在QuestDB中建立索引,以利用其高性能的時(shí)間序列數(shù)據(jù)。
使用Web控制臺(tái)和Postgres端點(diǎn)啟動(dòng)QuestDB:
- $ docker run -p 9000:9000 -p 8812:8812 questdb/questdb
導(dǎo)航至Web控制臺(tái),localhost:9000然后為塊創(chuàng)建表:
- 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
- );
以及用于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
- );
刷新表格列表后,您應(yīng)該看到兩個(gè)都已填充:
現(xiàn)在我們準(zhǔn)備將以太坊數(shù)據(jù)流式傳輸?shù)轿覀兊臄?shù)據(jù)庫(kù)。
流以太坊鏈上數(shù)據(jù)
區(qū)塊鏈ETL提供了一個(gè)Python腳本,可從Infura中提取數(shù)據(jù)并將其流式傳輸?shù)紾oogle Pub / Sub或Postgres?,F(xiàn)在,我們需要先安裝ethereumetl[streaming]:
- $ pip3 install "ethereum-etl[streaming]"
現(xiàn)在,我們需要指定我們的QuestDB憑據(jù)以及Infura API詳細(xì)信息。
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>
當(dāng)數(shù)據(jù)開始傳輸時(shí),您可以在QuestDB中看到它的索引:
該腳本會(huì)自動(dòng)將最后處理的塊存儲(chǔ)在中l(wèi)ast_synced_block.txt。如果要稍后運(yùn)行腳本,則可以刪除--start-block腳本中的標(biāo)志。
探索數(shù)據(jù)和改進(jìn)
QuestDB提供了一些內(nèi)置的可視化功能。例如,如果您想gas_used由礦工看,則可以進(jìn)入下面Chart并將其設(shè)置為以下內(nèi)容:
以太坊ETL腳本當(dāng)前以RFC3339格式存儲(chǔ)時(shí)間戳數(shù)據(jù),而QuestDB期望從Unix Epoch開始有符號(hào)偏移。這就是為什么我們的表架構(gòu)為時(shí)間序列字段使用字符串而不是日期或時(shí)間戳的原因。
為了獲得更高的性能,我們可以先修改ETL腳本,或者先將其流式傳輸?shù)紺loud Pub / Sub,然后轉(zhuǎn)換數(shù)據(jù),然后再流式傳輸?shù)絈uestDB。
另外,我們可以to_timestamp()在提取數(shù)據(jù)后使用QuestDB上的功能來(lái)修改表。例如,要轉(zhuǎn)換blocks表以使用QuestDB理解的正確時(shí)間戳,我們可以執(zhí)行以下操作:
- 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);
最后,如果您要流式傳輸合同或令牌數(shù)據(jù),則需要先將function_sighashes字段展平,因?yàn)镼uestDB本身還不支持Array類型。
有了這些數(shù)據(jù),現(xiàn)在您就可以計(jì)算出流行的信號(hào),例如“網(wǎng)絡(luò)價(jià)值與交易比率”,或者在Coin Metrics或Glassnode上提供的重復(fù)分析。