如何將以太坊資料流傳輸到QuestDB | 區塊鏈研究實驗室

買賣虛擬貨幣

本文中,將和大家介紹如何從以太坊中提取鏈上資料並將其資料流傳輸到QuestDB以便於進行進一步的分析和視覺化。

先決條件

  • Python 3.6+
  • 碼頭工人
  • Infura帳戶

訪問以太坊鏈上資料

Infura是由Consensys提供支援的開發平臺,具有免費層(每天10萬個請求),我們可以從以太坊主網和Testnets提取資料。
註冊一個免費帳戶並在以太坊下建立一個新專案:
記下Mainnet的HTTPS端點(格式為https://mainnet.infura.io/v3/<your-project-id>)。

使用架構設定QuestDB

我們將用於流以太坊資料的ETL指令碼提供以下鏈上資訊:
  • 積木
  • 合約書
  • 日誌
  • 代幣轉移
  • 代幣
  • 痕跡
  • 交易次數


簡單起見,在此示例中,我們僅流式傳輸塊和令牌傳輸,但是所有可用鏈上資料的模式都位於ethereum-etl-postgres / schema下(需要將Postgres資料型別轉換為Java資料型別)。
該資料將在QuestDB中建立索引,以利用其高效能的時間序列資料。


使用Web控制檯和Postgres端點啟動QuestDB:
$ docker run -p 9000:9000 -p 8812:8812 questdb/questdb


導航至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);
以及用於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);
重新整理表格列表後,您應該看到兩個都已填充:
現在我們準備將以太坊資料流式傳輸到我們的資料庫。

流以太坊鏈上資料
區塊鏈ETL提供了一個Python指令碼,可從Infura中提取資料並將其流式傳輸到Google Pub / Sub或Postgres。現在,我們需要先安裝ethereumetl[streaming]:
$ pip3 install "ethereum-etl[streaming]"


現在,我們需要指定我們的QuestDB憑據以及Infura API詳細資訊。


Postgres輸出採用以下形式,postgresql+pg8000://<user>:<password>@<host>:<port>/<database>並且API URL透過進行指定--provider-uri。我們還可以指定start-block數字(或者從一開始就省略下載所有以太坊資料),以及我們感興趣的模式:
$ ethereumetl stream --start-block 600000 -e block,token_transfer --output postgresql+pg8000://admin:[email protected]:8812/qdb --provider-uri https://mainnet.infura.io/v3/<my-project-id>


當資料開始傳輸時,您可以在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);、


最後,如果您要流式傳輸合同或令牌資料,則需要先將function_sighashes欄位展平,因為QuestDB本身還不支援Array型別。
有了這些資料,現在您就可以計算出流行的訊號,例如“網路價值與交易比率”,或者在Coin Metrics或Glassnode上提供的重複分析。

作者:鏈三豐,來源:區塊鏈研究實驗室

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读