SPV 錢包如何使用它下載的標頭?
我的理解是 SPV 錢包只下載“標頭”。這些標頭不足以獲取 UTXO 集,因此在移動比特幣時必須依賴另一個數據源。如果是這樣,那麼為什麼它甚至需要標題?
**SPV 使用
Merkle Root
標頭中的 來驗證完整節點提供的交易資訊。**由於標頭通過雜湊引用前一個塊,因此 SPV 錢包可以在一定程度上確定它具有真實的區塊鏈資訊。為了了解與其相關的交易,SPV 請求從完整節點獲取涉及一組提供的公鑰(其中一些實際上屬於 SPV,但不是全部)的任何交易的資訊。全節點進行查找,然後告訴 SPV 哪些塊具有與其相關的交易。現在,SPV 並沒有所有的交易資訊,如果它只有交易**
C
**,它就無法知道這些資訊是準確的。然而,這是 Merkle 根發揮作用的地方,作為一種提供最少資訊來驗證交易存在的方式。一個例子:
假設這**
block X
有三個事務A
,B
和C
; 該交易C
**與 SPV 相關。請參閱下圖,了解如何
Merkle Root
從這三個交易中派生出的概述。現在,如果全節點只提供**
C
,SPV 將不知道交易是否實際在 中block X
,但是通過提供H(A|B)
,SPV 可以重新推導Merkle root
,從而允許它驗證C
**是否在塊中。要詳細了解 SPV 錢包的一些缺點,請參閱比特幣的回答。
SPV 客戶端使用標頭和其他一些數據來確保它被告知它已收到的比特幣實際上存在於網路的其餘部分。如果沒有這種保證,有人簡單地告訴非驗證錢包他們收到了錢,而實際上他們沒有收到錢,這將是微不足道的。
為了在不下載整個鏈的情況下證明資金存在,SPV 錢包提供了塊默克爾樹作為支付證明。他們可以驗證 merkle 樹是否包含支付給他們的交易輸出,它來自具有有效工作證明的塊,並且塊頭來自一個難以產生的鏈,該鏈返回到創世塊。由於 merkle 樹的結構,它可以被修剪為僅包含與客戶端相關的事務,而無需更改包含在塊頭中的雜湊,這比僅發送整個事物節省了顯著的空間和時間。
然而,SPV 模型相當薄弱。
- 實際上找出哪些輸出是你的,這會將這項工作委託給可能不關心你的隱私的第三方,目前在大多數客戶端中,這使用布隆過濾器,它以一種非常辨識的方式在網路上廣播你對錢包資訊的興趣。
- 無法對區塊進行完整驗證意味著您可能會接受網路不接受的區塊中的付款,因為它在您無法驗證的地方無效(例如,花費不存在的輸出)。這種安全模型信任礦工,並依靠他們對交易進行驗證,以使系統具有足夠的安全性。這通常通過等待多個交易確認來支持,假設惡意礦工願意在無效鏈上丟棄多少以欺騙 SPV 客戶。
- 2015 年 7 月 5 日的分叉事件表明,在某些情況下,很大一部分礦工根本沒有對區塊內容進行驗證。在此特定事件中,SPV 客戶可能會看到 6 次確認交易(普遍接受的“安全”金額)實際上已失效。在這種情況下,如果所有 SPV 錢包和大多數區塊瀏覽器(以及使用其 API 的錢包服務)在交易中接受資金,而這些交易後來被發現是主鏈中的雙花,他們就會面臨損失風險。