Bitcoind

了解 SPV、修剪及其缺點

  • April 15, 2020

首先,很抱歉沒有提出客觀的問題,這是因為我無法恢復這個問題,而且我什至在“掌握比特幣”一書中也沒有找到資訊。這個問題中的大文本也是為了幫助人們了解我所問的內容。

假設我在修剪模式下執行比特幣客戶端。據我了解,它將下載整個區塊鏈,驗證交易格式是否正確,不要花費不存在的輸出,簽名匹配,並且塊的雜湊匹配。之後,它將擦除所有內容並僅儲存每個塊的 Merkle 樹。我了解 Merkle Tree 的工作原理,它是由交易 ID 的雜湊組成的結構。給定一筆交易及其 merkle 路徑,我可以驗證該交易是否在區塊中。

如果我只是接受來自網路的塊但之前沒有驗證區塊鏈,我可能會被愚弄來驗證交易是否在開采的塊中,但如果交易未花費,我將無法驗證交易是否格式正確輸出等。這就是為什麼整個區塊鏈必須先下載和驗證。(儘管,不太可能有人會浪費算力來探勘具有無效輸入的塊,但當然,如果我們依靠不太可能,它會為這種可能性打開一個埠)。

因此,據我了解,SPV 客戶端只需接收最新塊的最新 merkle 根,並驗證其中是否有交易。然後它看到在該塊上浪費了非常多的算力,然後假設它應該是一個有效的塊。我對嗎?

然而,在修剪模式下,整個區塊鏈被下載、驗證,然後被修剪。現在,客戶端只需下載新塊、驗證它們並修剪它們。然而,正如我所讀到的,在修剪模式下,客戶端出於某種原因維護最新的 x 塊。為什麼?

另外,如果我讓整個區塊鏈處於修剪模式,即僅由 merkle 樹組成的區塊鏈,給定一個新交易及其 merkle 路徑,我可以驗證它是否在某個塊中,並且我知道這個塊是有效的,因為我在修剪之前對其進行驗證。**但是,我怎麼知道這個交易花費了一個未花費的輸入呢?**我是否需要詢問引用交易的 merkle 路徑並繼續這樣做?

在我腦海中的目前模型中,我看不出修剪節點是如何被愚弄的。**修剪節點的唯一缺點是它們對網路的幫助不大嗎?**因為他們無法為那些詢問的人提供默克爾路徑等。但是如果我收到一筆交易並且我是一個剪枝客戶端,我是否可以像一個完整節點一樣有信心,我沒有被愚弄?

還有其他我不知道的修剪缺點嗎?我問是因為我對這個模型非常感興趣,我想執行一個修剪客戶端。

因此,據我了解,SPV 客戶端只需接收最新塊的最新 merkle 根,並驗證其中是否有交易。然後它看到在該塊上浪費了非常多的算力,然後假設它應該是一個有效的塊。我對嗎?

不可以。SPV 客戶端向提供 SPV 服務的完整節點送出布隆過濾器。每次將塊頭髮送給您時,一個完整的節點都會對照所述布隆過濾器檢查您可能感興趣或可能不感興趣的交易是否在該塊中。

如果是,則將包括所述交易,包括計算 Merkle Root 所需的所有其他交易。否則,你只會收到一個沒有任何交易的區塊頭。對於收到的每個塊頭,您的 SPV 客戶端將檢查它是否包含滿足難度要求的工作證明解決方案,以及它是否連結到前一個塊(像往常一樣)。

然而,在修剪模式下,整個區塊鏈被下載、驗證,然後被修剪。現在,客戶端只需下載新塊、驗證它們並修剪它們。然而,正如我所讀到的,在修剪模式下,客戶端出於某種原因維護最新的 x 塊。為什麼?

我假設您是在談論完整節點,因為 SPV 節點根本不下載區塊鏈,也沒有什麼可修剪的。

保留最後 N 個區塊的原因是,當發生重組時,可以系統地撤銷導致目前 UTXO 集基於孤立鏈的交易。然後您撤消到新的後續鏈開始的位置並應用記錄在新鏈中的事務。如果沒有最後 N 個區塊,在鏈重組發生時就無法解除,然後獨立地重新派生 UTXO 需要完整下載區塊鏈。

另外,如果我讓整個區塊鏈處於修剪模式,即僅由 merkle 樹組成的區塊鏈,給定一個新交易及其 merkle 路徑,我可以驗證它是否在某個塊中,並且我知道這個塊是有效的,因為我在修剪之前對其進行驗證。但是,我怎麼知道這個交易花費了一個未花費的輸入呢?我是否需要詢問引用交易的 merkle 路徑並繼續這樣做?

我想你在這裡很困惑。在修剪模式下執行完整節點時,您的節點將下載每個塊並執行完整驗證。每個被處理的交易都會更新記憶體在你節點上的 UTXO 集。因此,您將知道交易是否花費了有效的 UTXO。

引用自:https://bitcoin.stackexchange.com/questions/57434