Bitcoin-Core
當全節點錯誤地否認區塊中存在 txn 時,默克爾樹如何確保區塊鏈的可信度?
如果事實 B 包含 t,Merkle 樹如何確保完整節點不會欺騙在塊 B 中不存在 txn t 的瘦節點?如果全節點否認在塊 B 中存在 txn t 並且不發送任何雜湊值(供瘦節點驗證)並聲稱它不能,瘦節點如何判斷全節點是否在撒謊生成不存在的雜湊。
PS:不要介意我提問的非正式風格。一開始我只是想對默克爾樹有一個直覺的了解。
你的直覺是正確的:一個完整的節點可以對輕客戶端撒謊,並拒絕他們證明交易包含在一個塊中。這是 SPV 錢包的一個有據可查的漏洞,唯一的緩解措施是連接更多的對等點(你只需要一個“誠實”的對等點)。
BIP157 aka “Neutrino"也解決了這個問題。在該協議中,輕客戶端掃描整個塊以查找自己的交易。它根據全節點提供的過濾器知道要檢查哪些塊。當然,這讓我們回到了第一個問題:如果一個全節點提供了一個無效的過濾器怎麼辦?最終我們可能會看到一個軟分叉,它需要在區塊的某些部分插入有效的過濾器,並由工作量證明保護。
目前,BIP157 提供以下功能:
除非安全地連接到為過濾器頭提供服務的受信任對等點,否則客戶端應該連接到支持每種過濾器類型的多個出站對等點,以降低下載不正確頭的風險。如果客戶端收到來自不同對等方的任何塊和過濾器類型的衝突過濾器頭,它應該詢問它們以確定哪個是錯誤的。客戶端應該使用 getcfheaders 和/或 getcfcheckpt 來首先辨識對等點不同意的第一個過濾器頭。然後客戶端應該從任何對等點下載完整的塊並派生正確的過濾器和過濾器頭。客戶端應該禁止任何發送與計算的過濾頭不匹配的對等點。