如何在執行修剪節點時獲取舊塊?
您好,我正在嘗試建構一個 NodeJS 應用程序來獲取比特幣區塊,可能是舊區塊,但我遇到了問題。我已經下載了比特幣核心,但我沒有足夠的空間來執行一個完整的節點,所以我選擇執行一個修剪過的節點。但是,當我去查詢一個舊塊時,它告訴我該塊在修剪模式下不可用。所以我的問題是,如果比特幣核心在磁碟上找不到它,為什麼它不從另一個節點即時查詢該塊?它顯然有能力做到這一點,否則它將如何首先同步塊?如果比特幣核心無法做到這一點,我是否可以建構自己的 JS 應用程序來模仿 IBD 中使用的網路呼叫來按需獲取塊,而不是將它們保存到磁碟?另外,我不能使用 3rd 方塊資源管理器 API,因為他們沒有
這是一個很好的問題,也是我自己想知道的。既然你提到了 JS,我在 bcoin 的一個分支上實現了這個:https ://github.com/pinheadmz/bcoin/commit/ec1f5c95bb76f86aa034ec5a288fc09dd15d9597
$ bcoin --prune --daemon $ bcoin-cli rpc getblockchaininfo { ... "pruneheight": 10823 } $ bcoin-cli block 1000 { "hash": "00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09", "height": 1000, "depth": 10112, ...
這是未經測試的程式碼,不應在生產中使用,但它確實展示了一種機制,通過該機制,修剪節點(甚至可能是 SPV 節點或任何應用程序)可以使用任意
getdata
呼叫從比特幣網路上的完整節點檢索完整塊。
getdata
請參閱wiki 協議部分的詳細資訊: https ://en.bitcoin.it/wiki/Protocol_documentation#getdata你真正需要的只是一個塊的散列和一個到完整節點的 p2p 連接。
在我對 bcoin 的實現中,需要下載標頭,以防止使用者請求不存在或無效的塊。這種實現是危險的,因為它破壞了修剪節點的模型,並且在特殊請求時不會嘗試驗證塊。它不記錄
CoinView
下載塊的實際情況,並使數據庫處於不良狀態,如果發生足夠大的重組導致塊斷開連接,可能會導致問題。撇開免責聲明不談,您所要求的絕對是可能的。您只需要小心處理從網路檢索到的數據。
另外值得注意的是,從對等點請求任意塊是 Neutrino 輕客戶端的重要組成部分:
<https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki>