Doublespend

SPV 如何防止 UTXO 的雙花?

  • November 25, 2017

我是比特幣新手。我讀過關於比特幣如何防止雙重支出的文章。

假設節點 A 從各種交易中收到“B”個 BTC:B1、B2、B3 等。此外,A 在各種交易 S1、S2、S3 等中花費了“S”個 BTC。現在,每當有新交易從 A 到 B 發起(例如:A 想要將 X 個比特幣轉移給 B),交易必須驗證如下。

全節點具有未使用的交易輸出(UTXO)數據庫。在這個數據庫中掃描 A 的地址並檢查 A 是否有任何未使用的比特幣。如果 A 的地址至少有 X 個未使用的比特幣,那麼交易是合法的。

Q 1) 在上述驗證過程中,SPV 和默克爾樹在哪裡出現?我在網際網路上的其他地方讀到 SPV 節點將查詢以前的交易 B1、B2、B3、.. 和 S1、S2、S3 並檢查 A 的聲明是否有效。

Q 2) SPV 通常會調查多少以前的交易?我的理解是,SPV 必須查看與 A 的地址相關的所有交易。如果 A 沒有輸入所有之前的交易怎麼辦?(例如:A 隱藏了它的一些支出交易,比如 S1)

在比特幣交易中,不會掃描 A 的地址以查找可花費的未花費交易輸出 (UTXO)。全節點只是檢查交易的輸入是否真的沒有使用。不涉及地址掃描。

UTXO 儲存為交易 id (txid) 和創建它們的交易的輸出索引。您不能通過地址引用要花費的輸出,地址僅指定哪個私鑰必須簽署輸入腳本才能聲明 UTXO。

假設您addr1為捐款做廣告,並且您在該地址收到 3 筆捐款 D1、D2 和 D3。你有 3 個 UTXO 而不是 1 個。唯一的問題是它們可以用相同的私鑰聲明。因此,無需四處尋找以前的交易。錢包必須指定它正在使用哪些 UTXO。

SPV 允許輕量級客戶端驗證交易是否包含在比特幣區塊鏈中,而無需下載整個區塊鏈。為了驗證交易是否在塊中,SPV 客戶端以 Merkle 樹分支的形式請求包含證明。它不會自行檢查雙花。相反,它依賴於它連接的完整節點伺服器來執行此操作。為了防止被單個伺服器欺騙,他們連接到多個伺服器以獲取塊頭。來自比特幣維基:

獲得遠端節點沒有為您提供虛構交易的信心所需的難度級別取決於您的威脅模型。如果您要連接到已知可靠的節點,則難度無關緊要。如果你想選擇一個隨機節點,攻擊者探勘包含虛假交易的區塊序列的成本應該高於通過欺騙你獲得的價值。通過改變區塊的深度,你可以權衡確認時間和攻擊成本。

您可能還想查看欺詐證明,它允許全節點證明在網路上傳播的資訊是無效的,例如,允許全節點向瘦客戶端指出雙花。

另一個參考:瘦客戶端安全

引用自:https://bitcoin.stackexchange.com/questions/53217