白皮書中描述的 Merkle 樹修剪是否可行/有用?如果沒有,還有其他選擇嗎?
當我閱讀David A. Harding 撰寫的bitcoin-paper-errata-and-details.md時,我意識到可能存在對 Merkle 樹修剪的常見誤解或過度簡化。Nick ODell 所說的可能是一個活生生的例子:
- 當所有輸出都用完時,可以修剪葉子(事務)。
這曾經對我來說似乎是真的,直到我讀到大衛寫的東西:
比特幣目前沒有辦法證明一筆交易沒有被花費
我不確定我是否掌握了它,所以首先我做了一個圖表來說明(部分)我對這個問題的理解:
不過,我不認為僅僅這個問題就可以扼殺默克爾樹修剪的整個想法,我認為它只是意味著“可回收的磁碟容量遠低於預期”。換句話說,如果我沒記錯的話,Nick ODell 的說法可以像這樣“糾正”:
- 當一個葉子(事務)的所有輸出都已用完並且其所有先前的事務都已被修剪時,可以修剪它。
但是,我認為,即使考慮到“更正”的主張,默克爾樹修剪的想法似乎仍然不可行/有用:
- 即使避免了上述問題,惡意節點仍然可以通過隱藏/挑選一些 merkle 分支來欺騙新的完整節點。**惡意節點可以在不破壞 Merkle 樹結構的情況下謊報代幣的實際所有權(已使用/未使用狀態)。**換句話說,一個新的全節點加入網路仍然需要下載並驗證所有內容,否則它可能會被惡意節點欺騙。
- 如果全節點需要啟用剪枝來減少自身的磁碟空間需求,那麼直接讀取/修改區塊鏈文件似乎比目前 UTXO 集與區塊鏈儲存完全分離的實現效率要低得多,因此全節點(無論是否剪枝)只需要在下載驗證過程中查詢更新UTXO集合數據庫即可。出於驗證目的,區塊鏈本身根本不需要再次被觸及,這就是為什麼在啟用“修剪”(不是 Merkle 樹修剪)時可以簡單地刪除舊塊的原因。
但是,我仍然不確定這個結論。這是否與欺詐證明的想法有關,因為只要還有至少一個誠實的完整節點,新節點就能夠發現哪條數據是正確的?如果 UTXO 集也致力於區塊鏈呢?如果之前交易的區塊高度等更多承諾也被添加到區塊鏈中怎麼辦?
此外,我聽說 Mimblewimble 協議可以實現安全的區塊鏈修剪。我也很好奇 Mimblewimble 是如何實現這一目標的,以及比特幣最終是否可以實現類似的目標?
據我了解,一個完整的節點將下載所有內容,首先驗證所有內容。然後才開始修剪。因此,不會出現不一致修剪的問題。到目前為止,關於 UTXO 集還沒有達成共識。例如,直到區塊 500,000,UTXO 集為“XXXX”。只需下載“XXXX”,應該沒問題。我相信我們將來會有這個功能。現在關閉,fullnode 必須下載所有內容,驗證然後只修剪。
你是對的,完全丟棄輸出已用完的交易是行不通的。新的完整節點仍然需要所有數據才能處理區塊鏈並建構目前的 UTXO 集。因此,Merkle 樹修剪的想法似乎並沒有什麼好處,單獨維護 UTXO 集並結合修剪舊塊更有效。
欺詐證明是另一件從未實施過的事情。它們的目的是讓全節點在區塊鏈提示無效時告訴 SPV 客戶端。到目前為止,它們是相關的,以至於它們遇到了同樣的問題:目前還沒有很好的方法來證明 UTXO 的不存在。如果某人只是雙花了一個 UTXO,那麼很容易指出該 UTXO 已經在哪里花費了,但是如果一個塊包含一個花費了一個從未創建過的 UTXO 的交易,那麼證明這一點並非易事——一個完整的節點可以判斷,因為他們自己計算了完整的 UTXO 集,這反過來也很難證明。如果我們確實在某個地方送出了 UTXO 集,它會變得容易得多,但即便如此,最小的證明可能包括最後一個 UTXO 集承諾中不存在的證明(對於規範有序的 UTXO 集,它可能就像 UTXO 應該出現的兩個相鄰 UTXO 一樣簡單),以及自該承諾以來的所有塊。如果我們承諾每個區塊中的 UTXO 集,欺詐證明可能是可能的。
此外,我聽說 Mimblewimble 協議可以實現安全的區塊鏈修剪。我也很好奇 Mimblewimble 是如何實現這一目標的,以及比特幣最終是否可以實現類似的目標?
Mimblewimble 事務可以非互動式聚合。後續輸入所花費的任何輸出在該點上都會抵消(這稱為事務切入)。唯一不能修剪的數據是核心,它們是簽名和證明沒有創建新資金的組合。實際上,整個 Mimblewimble 區塊鍊是一個單一的大型投幣交易,除非您在聚合之前觀察/記錄了原始交易。如果不對交易格式和共識規則進行大量重新設計,這種方法就無法移植到比特幣上。在這種情況下,看看萊特幣的 Mimblewimble 擴展區塊協議更新可能會很有趣。