SPV 節點如何驗證未確認的交易?
Alice 通過簡單的地址支付類型交易向 Bob 支付 1 BTC。在 Alice 廣播她的交易三秒鐘後,Bob 的簡化支付驗證 (SPV) 錢包會顯示一條消息,說明交易已收到。
這究竟是如何工作的?Bob 的錢包在顯示消息之前會進行哪些檢查(如果有)?
我見過的許多 SPV 文件都對“高度”與“深度”驗證做出了模糊的陳述。這些討論沒有幫助,因為它們沒有描述實際過程。
我發現的最清晰的陳述出現在 BitcoinJ 文件中(在“待處理的交易”下):
…但是,在 SPV 模式下,您必須相信交易有效的唯一原因是您連接的節點中繼了交易。如果攻擊者可以確保您連接到他的節點,這意味著他們可以向您提供完全無效的交易(花費不存在的錢),並且它仍然會被接受,就好像它是有效的一樣。
<https://bitcoinj.github.io/security-model>
換句話說,完全信任被放置在網路中,僅中繼有效交易。該網路不應該中繼雙花或使用假幣的交易。因此,中繼,並且只有中繼,保證未確認交易的有效性。如果攻擊者可以控制您的 Internet 連接(例如通過 WiFi 熱點或 VPN),那麼他可以向您發送未經證實的虛假交易並敲詐您。
這就是 SPV 節點處理未確認交易的方式嗎?
看起來 SPV 節點可以做得更好。例如,Bob 的錢包不能驗證所花費的硬幣是否曾經存在過?為未確認交易的輸入列表中引用的所有外點請求 Merkle 路徑和交易。如果無法找到父交易,則 Alice 的交易正在嘗試花費假幣。
是否可以使用類似的機制來進一步驗證 Alice 的未確認交易不會雙花幣?
如果今天這些檢查都不可能,那麼需要發生什麼才能使它們成為可能?
首先,任何人都不應僅依賴未經確認的交易。這同樣適用於全節點運營商和 SPV 錢包使用者。
Bob 的錢包驗證所花費的硬幣是否曾經存在?為未確認交易的輸入列表中引用的所有外點請求 Merkle 路徑和交易。
是的,現在可以做到。我懷疑現在任何錢包都會這樣做,因為目前的 P2P 網路設計會很慢而且不確定。
這會很慢,因為網路協議不允許請求任意事務。為了獲得特定的交易,你必須設置一個布隆過濾器,然後繼續請求merkle 塊,直到找到包含該交易的塊。在否定搜尋的情況下,這將需要為塊鏈上的每個塊請求一個 merkle 塊,或者下載大約 32 MB 的數據並強制您的全節點對等方掃描其整個大約 30 GB 的塊鏈。
這不是確定的,因為任何人都可以從 SPV 節點中保留數據。例如,通知 SPV 節點有關未確認交易的完整節點可以在每個輸入中包含 merkle 塊,證明它們存在於塊鏈上。但是全節點不能包含任何證據證明這些輸入之前沒有在區塊鏈上花費過。
當某種形式的UTXO 承諾被實施時,全節點將有可能向 SPV 節點證明輸入未花費到 SPV 節點的頭鏈的頂端。但是,它仍然不能保證交易不會被雙花。(簡而言之,它降低了整個節點的撒謊能力,而不會使未經確認的交易更加安全。)
是否可以使用類似的機制來進一步驗證 Alice 的未確認交易不會雙花幣?
不,這從根本上是不可能的,因為未經確認的交易只是數據。Alice 可以創建並廣播交易 T 支付給 Bob,然後創建交易 T’(雙花),她在硬碟上保密。因為這是一個秘密,你不知道 T’,但它仍然是有效的雙花。
有各種建議允許全節點傳遞有關廣播雙花的資訊,例如 Gavin Andresen 的中繼首次雙花或 Peter Todd 的費用替代,但這些都不能提供一種方法來驗證是否存在雙花特定的輸入。
還可以更改比特幣驗證簽名的方式,以要求數學ECDSA one-show 簽名或共識 one-show 簽名。這不會阻止雙重支出,但這意味著任何擁有兩個簽名的相同輸入的人都可以創建第三次支出,將所有的錢都花在自己身上。(例如,如果執行完整節點的礦工收到 T 和 T’,它可以創建並探勘 T3,並將全部輸入值支付給自己。)
這顯然會抑制創建公共雙花,但不會阻止它們。更糟糕的是,有一些簡單的方法可以抑制系統性欺詐者,但是像你和我這樣的日常使用者偶爾需要出於正當理由(例如,因為交易未確認)進行雙花,不能再安全地進行雙花了。