Merkle-Tree

一個關於全節點、輕量級節點和默克爾樹的問題

  • August 22, 2019

全節點儲存默克爾根的目的是什麼?他們為什麼不只保存交易?只有當輕節點請求雜湊時才能計算雜湊,並且默克爾根只能保存在輕節點中。我在這裡錯過了什麼嗎?

我懷疑您混淆了 merkle 根和 merkle 樹。

默克爾樹是雜湊的二叉樹。葉子是單獨的事務,它們被散列,然後散列在一起,直到只剩下一個散列。剩下的雜湊是默克爾根。默克爾分支是默克爾樹從默克爾根到交易的特定路徑。

全節點儲存 merkle 根,因為它是塊頭的一部分。塊頭包含 merkle 根,因此塊雜湊本身也將送出到塊中包含的事務。雖然 merkle 根本身通常不在其他地方使用,但作為塊頭的一部分,它經常需要發送到正在下載塊的其他節點。每次都必須重新計算 merkle 根是很昂貴的,所以我們只保留它以便可以快速發送塊。

此外,通過儲存完整的塊頭,當交易本身在修剪中被丟棄時,塊頭被保留,因此頭鏈仍然被跟踪。如果沒有交易,如果沒有儲存 merkle 根,就不可能再次驗證這個頭鏈。

全節點不儲存整個 merkle 樹或任何 merkle 分支。這些對於正常操作是不必要的。當 SPV 客戶端請求 merkle 分支時,它是即時計算的。

全節點維護區塊鏈不僅是為了服務輕量級節點。首要的原因是為了自身的安全,以確保它通過網路收到的塊沒有被篡改,並且都符合共識的要求。

為了驗證區塊是否連結到創世區塊,全節點必須計算區塊頭。給定塊的塊頭包含前一個塊頭雜湊和默克爾根以及其他欄位。merkle 根就像塊中包含的所有交易的標識符一樣,因為即使更改交易的最輕微組件也可以完全改變 merkle 根。因此,全節點會驗證交易,並根據這些交易雜湊計算 merkle 根。然後,這個 merkle 根被用於其他塊頭欄位(如前一個塊頭雜湊)來計算目前塊頭雜湊。在驗證區塊鏈中的下一個區塊時,節點將確保該區塊中的前一個區塊頭雜湊欄位與它為最後一個區塊計算的雜湊欄位匹配。

此外,全節點首先與另一個標頭同步。簡單來說,當一個節點啟動時(甚至在暫停之後),它會與網路的其餘部分同步,首先同步區塊鏈的標頭。默克爾根是區塊頭的一部分。

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