比特幣中是否存在這個 Merkle 雜湊根問題?
在關於Merkle 樹的 Wikipedia 文章中,我只是在閱讀此內容,無法理解問題出在哪裡:
第二次原像攻擊
Merkle 雜湊根不指示樹的深度,從而啟用第二原像攻擊,在該攻擊中,攻擊者創建的文件與原始文件不同,但具有相同的 Merkle 雜湊根。對於上面的例子,攻擊者可以創建一個包含兩個數據塊的新文件,其中第一個是 hash 0-0 + hash 0-1,第二個是 hash 1-0 + hash 1-1。
Certificate Transparency中定義了一個簡單的修復方法:計算葉節點雜湊時,在雜湊數據前添加 0x00 字節,而在計算內部節點雜湊時添加 0x01。限制雜湊樹大小是一些正式安全證明的先決條件,有助於使一些證明更嚴格。一些實現在散列之前使用散列樹深度前綴來限制樹深度,因此任何提取的散列鏈都被定義為只有目前綴在每個步驟中減少並且在到達葉子時仍然為正時才有效。
**我的第一個問題是:**這真的是比特幣的問題嗎?如果是,它是如何在比特幣核心中解決的?
**我的第二個問題是:**這個問題可以通過將每個區塊的樹深度直接儲存在區塊鏈中來解決嗎?或者說到比特幣,這會以某種方式對區塊驗證過程本身產生負面影響嗎?
是的,這些類型的攻擊確實會影響比特幣,並且是已知和描述的。比特幣對它們沒有任何共識級別的緩解措施,因為這樣做需要很難做到的共識更改。眾所周知,比特幣的默克爾樹設計存在多個漏洞。
維基百科上描述的特定攻擊是內部級別可以呈現為有效文件。在比特幣中,這在理論上是可能的,儘管需要大量工作來生成一個區塊,其中交易產生雜湊值,然後可以將其反序列化為有效交易。如果生成了這樣的塊,則可能由於圍繞記憶體無效塊的行為而導致網路分區。顯然,解決這個問題的方法是確保記憶體的無效塊被仔細處理,以避免拒絕第三方可延展的塊。
事實上,這個特殊問題導致了 Bitcoin Core 0.13 中的一個漏洞,該漏洞已被修復。bitcoin-dev 郵件列表中提供了該漏洞的描述。
另一個相關的攻擊是另一個方向——包括一個塊中的交易,它可以被解釋為默克爾樹中的一個內部節點。這種攻擊可用於針對 SPV 錢包,並誘使這些錢包認為交易包含在一個塊中,而實際上並沒有。Sergio Demian Lerner 在這篇博文中描述了這種攻擊。
第二次攻擊的唯一真正解決方案需要某種共識更改來引入樹深度。但是改變共識很難,還有其他事情可以做。SPV 錢包可以通過檢查沒有內部節點可以序列化為有效交易來保護自己。這樣的內部節點不太可能隨機出現,因此這對使用者不會產生任何實際影響。在比特幣核心中,為了幫助防止這種攻擊,64 字節的交易不會被中繼。由於 64 字節事務比任何標準事務都小,因此這是安全的。