Blockchain
比特幣客戶端如何檢查雙花?
當比特幣客戶端查看一筆交易的輸入時,它知道上一筆交易的雜湊值,資金來自哪裡,但是,它怎麼知道這筆輸出還沒有被花掉呢?它是否需要掃描整個阻止列表以尋找另一筆花費相同輸出的交易?這不是非常低效嗎?
Bitcoin-Qt 將輸出在數據庫中標記為已用完。要檢查輸入的 prev-out 是否已花費,比特幣只需查找交易並檢查輸出是否標記為已花費。
其他方法是擁有一組所有未使用的輸出並檢查 prev-out 是否在該集合中(比特幣的未來版本會這樣做),或者通過它們的 prev-out 索引輸入。
它類似於這裡的問題
假設節點 A 從各種交易中收到“B”個 BTC:B1、B2、B3 等。此外,A 在各種交易 S1、S2、S3 等中花費了“S”個 BTC。現在,每當有新交易從 A 到 C 發起(例如:A 想將 X 個比特幣轉移給 C),交易必須驗證如下。
- 完整節點具有 UTXO(未使用的交易)詳細資訊。全節點通過這個 UTXO 數據庫並驗證 S1、S2、S3 是否未使用。UTXO 的大小約為 512 MB。所以,通過所有的 UTXO 並不難。
- 驗證也可以通過輕量級客戶端 SPV 節點完成。這些 SPV 節點沒有 UTXO 詳細資訊。但是,它們擁有整個區塊鏈的頭部資訊。因此,發起了一個新事務,SPV 客戶端請求全節點提供 S1、S2、S3 事務的資訊。完整節點以默克爾樹的形式提供此資訊。SPV 節點使用區塊鏈頭資訊驗證這些默克爾樹的有效性。對於所有“足夠老”的交易,區塊鏈標頭不會改變。作為一個保守的規則,人們通常在傳遞他們的商品或服務之前等待至少 6 個以上的區塊建立在這個目前區塊的頂部。
請參閱此連結以及如何處理個人交易的好文章。