Go-Ethereum

如何解析乙太坊區塊鏈並將輸出保存到文件中?geth 控制台不是節點,對吧?

  • November 20, 2017

我正在嘗試解析區塊鏈並將交易的一部分提取到 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

問題

我有兩個不同的問題:

  1. 如果我使用 geth 控制台方法,我不能使用節點文件系統“fs”模組寫入文本文件

錯誤:找不到模組“fs”

  1. 如果我使用 Node.js 方法,我可以保存到本地文件,但腳本非常慢,並且它在大約 1000 個塊後凍結我的電腦(即使我縮小程式碼並簡化它 - 請記住它是一樣的解析在 geth 控制台中執行良好的程式碼

第一種方法,在geth 控制台中,速度更快


問題

  1. 有沒有更快/更好的方法來做我想做的事情(解析並提取到區塊鏈的文件系統部分)?
  2. 有沒有辦法在 geth 控制台中使用節點模組和語法(比 –rpc 快)?
  3. 有沒有辦法讓 –rpc 更快?
  4. 最初我想保存到一個 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 &gt; 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                        

  ...

:這並沒有給出命令執行的視覺回饋。有沒有辦法顯示進度?

我使用 Unixwatch命令來顯示更改。-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在寫入數據時顯示文件內容。

引用自:https://ethereum.stackexchange.com/questions/7339