比特幣如何防止雙花?
我正在嘗試理解區塊鏈,並且我已經閱讀了很多這些解釋,但它們都沒有解決我仍然想知道的一些問題。所以首先我將解釋我所知道的,然後列出一些問題。
有一個賬本,上面有每個人的交易。賬本在網路中的每個節點上都複製。有些節點是
miners
. 節點只是儲存它們並讓其他內容讀取和更新它。礦工創建塊並發送到所有節點。假設愛麗絲只有 10 美元,給喬 10 美元,給鮑勃 10 美元。
兩個條目被發送到網路,即
Alice->$10->Joe
和Alice->$10->Bob
。現在每個節點都會有
Alice->$10->Joe
或的待處理事務Alice->$10->Bob
。碰巧達成共識來決定應該首先添加兩者中的哪一個。(是要弄清楚哪個先發生和第二個發生,還是要接受哪個以及拒絕哪個,就像根本不添加到鏈中一樣?)
礦工將繼續散列
Alice->$10->Joe
或Alice->$10->Bob
取決於礦工擁有哪一個。他們一直這樣做,直到礦工擁有被認為有效的雜湊值。對於礦工的第一個有效雜湊,該礦工將該交易作為有效塊發送到每個節點,如果它看起來有效,所有節點只需將其添加到他們的鏈中(他們也會檢查)。可以說
Alice->$10->Bob
首先被探勘,並添加到所有節點。現在區塊鏈知道愛麗絲沒有錢了。
然後
Alice->$10->Joe
被開採並發送給每個人,但他們都拒絕了,因為 Alice 沒有錢了(這部分我不確定)。或者是兩個交易都被開采了,但是大多數礦工在 10 分鐘後進行某項交易,該交易被添加而另一個被拒絕?
我仍然對共識部分的工作方式感到困惑。大多數部分是如何工作的,以及事情是如何被探勘的。如果網路中只有 1 筆獨特的交易像
Alice->$10->Joe
而不像那樣進入,它是如何工作的Alice->$10->Bob
?
網路上沒有人擁有“餘額”,他們只是擁有尚未花費的先前交易輸出的密鑰。一開始,Alice 持有一些未使用交易輸出 (UTXO) 的密鑰,總計價值 10 美元的比特幣。這就是你說她有 10 美元的意思。
當她與 Bob 或 Joe 進行交易時,她使用這些 UTXO 作為新交易的輸入。但是因為她只有價值 10 美元的 UTXO,如果她在兩次交易中使用相同的 UTXO,那麼只有其中一個是有效的,因為你不能兩次使用相同的 UTXO。所以只有兩個交易中的一個可以添加到鏈中,正確的。添加的那個將只是該區塊的礦工通常首先看到的那個。一些礦工可能首先看到喬的交易,並嘗試將其探勘到一個塊中,而其他礦工可能會看到鮑勃的交易並嘗試將其探勘到一個塊中。
共識就是礦工首先找到一個有效區塊,然後礦工包含的交易(比如說 Bob 的)將成為最長有效區塊鏈的一部分,並且所有其他節點都會接受它。節點信任最長的有效區塊鏈(注意它必須是有效的,沒有誠實的節點會接受無效區塊或在無效鏈上探勘以擴展它),因此如果最長的鏈包含與 Bob 的交易,Alice 之前的未使用的輸出現在將被視為已使用,而 Bob 將擁有交易新輸出的密鑰(因為 Alice 使用了他的公鑰/比特幣地址)。然後節點會將交易交給 Joe,因為它現在無效,並且 Bob 有他的 10 美元。
為了讓攻擊者在將哪個交易探勘到區塊鏈後更改它被接受,他必須探勘包含另一個交易的替代鏈,並與網路的其餘部分競爭以使他的鏈最長。如果它更短,他將是唯一一個擴展鏈的礦工,其他礦工將專注於最長的鏈,因此他必須擁有至少 51% 的網路算力才能比誠實的礦工更快地擴展他的鏈擴展接受鏈。
這與僅向網路發送一個唯一交易的行為相同,在這種情況下,所有礦工都將嘗試包含該交易,而不是嘗試包含其他交易,因此不會有任何結果不確定性。