如何解析乙太坊區塊鏈並將輸出保存到文件中?geth 控制台不是節點,對吧?
我正在嘗試解析區塊鏈並將交易的一部分提取到 txt 文件中,並將地址提取到特定契約 (theDAO) 以供以後分析。我想將輸出保存到文件 (.txt) 以便以後重用。
2種方法
嗨,我已經成功地用 Web3.js 解析了乙太坊區塊鏈,兩者都只使用了 geth 控制台
$ cd /path/to/file $ geth --exec 'loadScript("myEthereumBlockchainParses.js")' attach
以及使用 rpc 將其連接到 Node.js 實例
$ geth --rpc $ node myEthereumBlockchainParses.js
問題
我有兩個不同的問題:
- 如果我使用 geth 控制台方法,我不能使用節點文件系統“fs”模組寫入文本文件
錯誤:找不到模組“fs”
- 如果我使用 Node.js 方法,我可以保存到本地文件,但腳本非常慢,並且它在大約 1000 個塊後凍結我的電腦(即使我縮小程式碼並簡化它 - 請記住它是一樣的解析在 geth 控制台中執行良好的程式碼
第一種方法,在geth 控制台中,速度更快。
問題
- 有沒有更快/更好的方法來做我想做的事情(解析並提取到區塊鏈的文件系統部分)?
- 有沒有辦法在 geth 控制台中使用節點模組和語法(比 –rpc 快)?
- 有沒有辦法讓 –rpc 更快?
- 最初我想保存到一個 simple.txt 文件,但也許將這麼多資訊儲存在像 MongoDB 這樣的數據庫中更好?
解決方案
在@BoppyKooBah 的出色回答之後,這裡是一些程式碼https://github.com/lyricalpolymath/Ethereum_DaoExtraBalanceOwners/blob/master/extraBalanceRunScript
迄今為止,發生了多少次 The DAO 遞歸呼叫漏洞攻擊?,這是我獲取簡單腳本來提取和保存數據的方法:
將以下腳本複製到
getTheDAOTransferEvents
:#!/bin/sh # First search from 1428757 (The DAO creation) to 1736131 # First Transfer event in block 1599207 FIRSTBLOCK=${1:-1599207} LASTBLOCK=${2:-"'latest'"} echo "Searching for The DAO Transfer events to address 0x0000000000000000000000000000000000000000 between blocks $FIRSTBLOCK and $LASTBLOCK" geth attach << EOF | egrep -e ",0x" var theDAOABI = [{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"Transfer","type":"event"}]; var theDAOAddress = "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413"; var theDAO = web3.eth.contract(theDAOABI).at(theDAOAddress); var theDAOTransferEvent = theDAO.Transfer({}, {fromBlock: $FIRSTBLOCK, toBlock: $LASTBLOCK}); console.log("No,From,Block,DAOs"); var i = 0; theDAOTransferEvent.watch(function(error, result){ var args = result.args; if (args._to == "0x0000000000000000000000000000000000000000") { i++; var daos = args._amount / 1e16; console.log(i + "," + args._from + "," + result.blockNumber + "," + daos); } }); theDAOTransferEvent.stopWatching(); EOF
使用 . 設置文件的可執行位
chmod 700 getTheDAOTransferEvents
。然後在單獨的終端視窗中執行腳本以提取所有感興趣的傳輸事件,使用
./getTheDAOTransferEvents > output.txt
問:有沒有更快/更好的方法來做我想做的事情(解析並提取到區塊鏈的文件系統部分)?
極有可能。您只需要為您的案例測試不同的方法。
問:有沒有辦法在 geth 控制台中使用節點模組和語法(比 –rpc 快)?
我沒有評價這個。
問:有沒有辦法讓 –rpc 更快?
您可以同時執行多個 shell 腳本副本,例如:
./getTheDAOTransferEvents 0 999999 > output0.txt & ./getTheDAOTransferEvents 1000000 1999999 > output1.txt & ./getTheDAOTransferEvents 2000000 2999999 > output2.txt & ./getTheDAOTransferEvents 3000000 3999999 > output3.txt & ...
問:最初我想保存到一個 simple.txt 文件,但將這麼多資訊儲存在像 MongoDB 這樣的數據庫中會更好嗎?
如果您想使用索引進行訪問,這很有用。Redis 也不錯。
我喜歡Unix 哲學“強調建構簡單、簡短、清晰、模組化和可擴展的程式碼,這些程式碼可以很容易地被開發者(而不是它的創建者)維護和重新利用。”
我開始只是創建逗號(或製表符)分隔的值文件,然後使用其他程序將數據移動到 SQL/NoSQL 數據庫中。
然後,如果我需要更多的速度/邏輯/耦合,我希望改進這個過程。
編輯 23/07/2016 - 對以下評論的回應
讓我說“geth attach << EOF | egrep -e “,0x” == MAGIC!:) 那是一些鐵桿曼波舞 :) 但是我需要更改正則表達式以滿足我的需要。我會玩這個並發布一個完整的解決方案。唯一的是,這只保存到一個文件中。有沒有辦法將控制台輸出的不同部分保存到不同的文件中? - 而且。這並沒有給出執行的視覺回饋命令。有沒有辦法顯示進度?謝謝!
問:有沒有辦法將控制台輸出的不同部分保存到不同的文件中?
我
grep
有時用來分隔數據。這是一個使用https://github.com/bokkypoobah/TheDAOVoter列出 DAO 拆分theDAOVoter
的範例。# Generate list of DAO splits user@Kumquat:~$ theDAOVoter --sumsplits > sumSplits # Extract data for account 0x1368 user@Kumquat:~$ egrep "0x1368|Status" sumSplits Prop Status Yea Nay Recipient Description 1 Expired 967598.22 4276278.60 0x13680fa2a60fd551894199f009cca20fb63a3e31 18 Expired 2200.20 3913649.01 0x13680fa2a60fd551894199f009cca20fb63a3e31 # Extract data for account 0x3d55 user@Kumquat:~$ egrep "0x3d55|Status" sumSplits Prop Status Yea Nay Recipient Description 4 Expired 5279.34 4322941.58 0x3d5507b53d1613d8491a606ecf5c9268301095dd split # Extract data for accounts other than 0x1368 and 0x3d55 user@Kumquat:/tmp$ egrep -v -e "0x1368|0x3d55" sumSplits Prop Status Yea Nay Recipient Description 6 Expired 1.99 175453.91 0xbeb0b93c01297146782a5581370489a36b24deca Original intent, non-interventionist cur 7 Expired 118006.68 3967413.62 0xe82d5b10ad98d34df448b07a5a62c1affbef758f Leave me alone 8 Expired 199999.99 3931880.95 0xa72ded5c1122312d9f4ed66bf4a396139eadaf56 ...
問:這並沒有給出命令執行的視覺回饋。有沒有辦法顯示進度?
我使用 Unix
watch
命令來顯示更改。-d
突出差異。-n5
例如每 5 秒更新一次顯示。# Watch the file size growing as the data gets written watch -d -n5 'ls -al' # Watch the number of lines in the file as the data gets written watch -d -n5 'wc -l sumSplits' # Watch the last 3 lines in the file changes as the data gets written watch -d -n5 'tail -n3 sumSplits'
或用於
tail -f sumSplits
在寫入數據時顯示文件內容。