目前將比特幣區塊鏈儲存在本地數據庫中的最有效和最可靠的方法是什麼?
我之前看過幾篇關於此的文章,並嘗試了所有建議的解決方案,但我無法讓它們中的任何一個起作用。
我有興趣使用項目的 OP_RETURN 操作碼分析交易,並且需要將整個比特幣轉儲到數據庫中才能開始處理。直到今天,我已經安裝了 Bitcoin Core 並下載了所有數據。
有一個可用的工具列表,我對所有這些工具都有問題:
- **WebBTC:**文件似乎不可用
- **BitcoinDataBaseGenerator:這似乎是最有前途的解決方案,因為它很容易在 Windows 上設置,而且 MS SQL Server 數據庫也很容易使用。但是,在文件 blk005.dat 之後它崩潰了,說有未知版本的塊。我也無法再次嘗試執行它,因為從該文件中刪除數據的查詢將無法完成執行並在約 2 小時後超時。查看 GitHub 上的問題,人們似乎也遇到了問題,因為 repo 不再維護。
- **Blockparser + SQL:**這只將數據保存在記憶體中。
- **BitcoinABE:**我還沒試過這個。我讀了很多問題,雖然它很慢,但通常有很多未解決的問題。不過可能有用,我稍後再試試。
- **NBitcoin.Indexer:**為 Azure 製作,不過我想要一個本地數據庫。
- **Blockchain2Graph:*這似乎也很有希望,並且正在積極開發中。它使用neo4j,這很好。目前我對 SQL 或圖形數據庫都沒有偏好。我設置了一個 Debian 虛擬機並按照所有步驟操作,這確實有效。但是,最後我無法讓應用程序實際顯示在瀏覽器中。據我了解,它使用 RPC 呼叫,而不是直接使用 blk.dat 文件。
然後我在Google上又找到了一個:
- **Bitcoin-to-neo4j:**這直接獲取塊文件並將它們放入neo4j數據庫中。問題在於數據庫顯然是實際比特幣數據大小的六倍。我沒有 1.7 TB 的可用儲存空間。它還提到需要幾週的時間來處理這一切。我根本沒有時間等待。
所以,我的問題是,目前是否有任何其他工具可以輕鬆地將比特幣 blk*.dat 文件寫入本地數據庫。也許我做錯了,上面提到的解決方案,但它們似乎都不是一個理想的解決方案。編寫一個只提取我感興趣的數據的自定義應用程序有多容易,是否有用於此的程式碼模板?
您已經註意到大致有兩種方法:
- 處理正在執行的塊
.dat
文件bitcoind
- rpc 到節點,拉取塊或標頭,並並行批處理它們
為了速度,可能做#1 是最好的,也是
BitcoinDataBaseGenerator
如此。不幸的是,正如您所指出的,它在 2017 年初停止維護,因此不支持 Segwit。我認為在實踐中,很多人會這樣做 2,因為您可以依賴其他人維護的外部節點。我有一個使用 #2 的工作原型,但不會在這裡連結它,因為它缺少一些東西。我只是說我沒有發現這樣做非常困難(我所做的工作分散在一段時間內,我也忙於其他事情)。我認為真正的挑戰可能是嘗試為您需要的任何內容建構正確的表格。將區塊鏈數據保存到 Postgres 數據庫中的實際工作相當簡單。我確實花了一周左右的時間來保存數據,但這是使用一個小型 EC2 實例。
令人驚訝的是,解決方案並沒有得到更廣泛的應用,但最終還是可以理解的。我確實認為每個人都需要以某種方式調整他們的數據庫,並且以您理解的方式自己處理數據會更容易。
話雖如此,Cross-Chain Group 有一個連接到 Electrum 伺服器並將其持久化到 sqlite的工作實現。查看程式碼,我認為將持久性程式碼更改為持久化到另一個數據庫並不困難。他們已經完成了處理區塊頭和交易的艱苦工作。
感謝@Anonymous指出了bitcoin-iterate,我想我找到了一個適合我的解決方案。
這個工具可以很容易地以自定義格式提取您需要的所有數據。我在原始問題中列出的所有工具都有一些預定義的結構。
我決定使用 JSON 定義的初步資料結構。稍後當我意識到我不需要它們時,我可能會刪除一些值。
{ "blocks": [ { "bLength": 0, "bVersion": 0, "bTimestamp": 0, "bTxCount": 0, "bHash": "", "bHeight": 0, "transactions": [ { "tNumInBlock": 0, "tHash": "", "tVersion": 0, "tInputCount": 0, "tOutputCount": 0, "inputs": [ { "iHash": "", "iIndex": 0, "iScriptLength": 0, "iScript": "", "iSeqValue": "", "iNumInTx": 0, "iUTXOBlockNum": 0, "iUTXOTxNum": 0 } ], "outputs": [ { "oAmount": 0, "oScriptLength": 0, "oScript": "", "oNumInTx": 0, "oUnspendable": 0 } ] } ] } ] }
當我在該文件中擁有全部數據時,我可能會嘗試將其寫入數據庫,而像 neo4j 這樣的圖形數據庫似乎是一個不錯的選擇。但是,我願意就此提出建議。
要獲取該格式的數據,我使用以下 bash 命令執行
bitcoin-iterate
:./bitcoin-iterate --blockdir='path/to/blocks' \ --cache='path/to/cache' --quiet --progress='100' \ --block='{"bLength":%bl,"bVersion":%bv,"bTimestamp":%bs,"bTxCount":%bc,"bHash":"%bh","bHeight":%bN,"transactions":[]}' \ --transaction='{"tNumInBlock":%tN,"tHash":"%th","tVersion":%tv,"tInputCount":%ti,"tOutputCount":%to,"inputs":[],"outputs":[]}' \ --input='{"iHash":"%ih","iIndex":%ii,"iScriptLength":%il,"iScript":"%is","iSeqValue":"%iq","iNumInTx":%iN,"iUTXOBlockNum":%iB,"iUTXOTxNum":%iT}' \ --output='{"oAmount":%oa,"oScriptLength":%ol,"oScript":"%os","oNumInTx":%oN,"oUnspendable":oU}' \ | sudo tee path/to/output.txt >/dev/null
這樣做的問題是,每個塊、交易、輸入和輸出都會按照它們到達的順序輸出它們的格式化字元串。這意味著我不能嵌套 JSON,因為每個塊會有多個事務,每個事務有多個 I/O。為了解決這個問題,我將編寫一個小幫助腳本,該腳本將 JSON 文件的每一行都包含一個 JSON 對象,並將對象移動到預定義的數組中。我還沒有找到更好的解決方案,我也願意就此提出建議。