Doublespend

礦工如何檢測雙花?

  • October 11, 2016

假設我花了 1BTC,然後等了幾個月,然後又花了。這是如何檢測到的?礦工是否通過整個區塊鏈來確保代幣從未被使用過?

其他兩個答案解釋了發現雙花必須做什麼。我將嘗試解釋它是如何工作的。

沒有“餘額”,只有“硬幣”

一個常見的誤解是,有一個地址餘額寄存器,當你花費比特幣時,你的一些餘額會從你的地址中扣除。實際上,這並不能很好地描述正在發生的事情。在引擎蓋下,它更像是在您獲得報酬時收到一個“硬幣”,並在消費時利用您可用的“硬幣”。

花費“硬幣”

當有人向您發送交易時,他們會創建“未花費的交易輸出 (UTXO)”。這個 UTXO 是唯一可辨識的,例如帶有 id 的交易的第一個輸出X。UTXO 就像硬幣一樣:它們具有特定的價值,只能完全花掉。要花費其中的一部分,您必須放棄完整的硬幣,取回零錢。

範例:

您有兩個未使用的交易輸出(“硬幣”),價值 0.03 BTC 和 0.09 BTC。它們分別被創建為“交易的第一輸出X”和“交易的第三輸出Y”。你想向 Bob 發送 0.10 BTC。

您引用這兩個特定的 UTXO 作為交易的輸入Z。即您命令“我想花費交易 X 的第一個輸出和交易 Y 的第三個輸出。我將它們轉換為交易 Z 的第一個和第二個輸出。 – 這是和的簽名X.firstY.third”。

X.first   0.03 BTC                       Z.first    0.10 BTC (spendable with Bob's signature)
                      ---- tx Z  ---> 
Y.third   0.09 BTC                       Z.second   0.02 BTC (spendable with your own signature)

在這個例子中,你用光了你的兩個“硬幣”,給 Bob 一個“硬幣”以支付 0.10 BTC,然後將零錢作為另一個新的“硬幣”取回給你自己。您的交易Z花費X.firstY.third,並將它們轉換為兩個新的“硬幣”Z.firstZ.second

現在,如GregJestin所描述的,每個完整節點都通過整個區塊鏈。每次單個事務都引用了一個或多個“硬幣”,這些“硬幣”,並根據範例中創建新的“硬幣”。

雖然節點通過區塊鏈作用,但它會跟踪存在的“硬幣”,並使用發生的每次交易更新此數據庫。數據庫稱為比特幣網路的“未註冊事務輸出集”。因此,當您最新時,該節點具有每個可用於支出的“硬幣”列表。

回到問題

所以,一個月前你把1個BTC發給了Bob。現在,您正在嘗試使用相同的“硬幣”,X.first一個月Y.third後匯款到Carol。節點查看他們的“硬幣”數據庫,並看到它們不在其中。他們可以立即說“那些硬幣已經花了”。

是的,礦工檢查區塊鏈以確保所有新事務都有效,然後將它們包含到塊中。但是,它也取決於您對“礦工”的定義。如果您的意思是將ASIC礦工作為探勘池的一部分執行ASIC礦工,那麼他們通常不會檢查交易或塊的有效性。它們只需雜湊塊標題來計算anncle。如果您的意思是探勘池運營商,那麼是的,他們需要檢查事務和塊的有效性,否則其池會產生其餘的網路的塊。

此外,礦工不是驗證事務的比特幣網路上唯一的節點。通過網路中繼事務的全節點也執行檢查,以確保事務在將其轉發到其他節點之前有效。甚至會讓您的無效事務持續到探勘節點,讓您在塊中包含無效。

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