為什麼瘦節點需要知道交易是否存在於特定區塊的默克爾樹中?
我了解什麼是 merkle 根以及 merkle 證明是如何工作的。
這完全是關於瘦節點檢查特定事務 ID 是否在特定塊中。所以,瘦節點說:我有一個交易 ID - 12345,我想知道這個交易是否存在於第 259,291 個區塊中。
為什麼瘦節點想知道這樣的資訊?
為什麼瘦節點想知道這樣的資訊?
他們很可能並不關心交易包含在哪個區塊中,但他們最關心的是知道交易是否包含在區塊鏈中。碰巧沒有簡單的方法來證明後者而不證明它包含在哪個塊中。
為了說明更具體的互動(在 BIP37 中使用,但其他協議,如 Electrum 的客戶端-伺服器協議是類似的)。F = 全節點(伺服器),L = 輕客戶端。這顯然不是一個實際的協議轉儲,但從概念上講它很接近。
L:嗨,F,我是一個輕量級客戶,對涉及地址 A、B 和 C 的交易感興趣。[filteradd]
F:好的。[無]
L:我已經同步了塊到塊雜湊 H。[getheaders]
F:天哪,你在後面,還有塊I和J。這是他們的頭球![標題]
L:那些標題看起來很棒,而且它們的工作證明是有效的。所以呃……我是否包含我關心的任何交易?[使用 MSG_FILTERED_BLOCK 獲取數據]
F:沒有。[空默克爾塊]
L: 好的……那麼塊 J [getdata with MSG_FILTERED_BLOCK]
F:哦,是的,這是涉及您的一個地址的交易 T![默克爾塊]
L:這看起來像是一筆確實給我錢的交易……但你能證明它確實被包含在鏈中嗎?你知道,我真的不信任你,你可能會給我一個無效的交易,或者花費已經在鏈中移動的錢。[無]
F:好的,這是一個 Merkle 路徑,它證明 T 實際上包含在塊 J 中。[實際上是早期 merkleblock 消息的一部分]。
所以關鍵是,如果沒有證據,F 可以聲稱 L 得到了付款,而交易是無效的。假設網路中的其他節點實際上強制執行鏈中交易的有效性,將其包含在鏈中會非常昂貴。
當然有一個警告。F 無法向 L 證明我沒有包含任何有趣的交易。解決方案要麼信任伺服器,要麼嘗試多個 - 都不是很令人滿意。