Blockchain

比特幣如何在不懲罰礦工的情況下防止雙重支出?

  • July 12, 2022

在如下圖的網路節點中: 節點

假設A試圖通過向****B、C ( A -> B ) 和**(A->C)發送比特幣來雙花,假設 A 試圖將(A->B)交易中繼到誠實的節點 - 8 並且在這個點讓我們假設目前時間是6 點鐘(可能是任何時區)。所以在6 :00,** A將其交易 ( A -> B )轉發給誠實的 No​​de-8。假設在6:02(恰好在 2 分鐘後)A嘗試雙花該比特幣並將該比特幣(A->C)發送到誠實的節點 - 5 和6:04假設誠實的 No​​de-5 驗證所有交易都是有效的,因為A 的輸入 UTXO 直到現在才廣播到網路。

同時讓 Node-8 也驗證其塊中的所有交易是否有效,因為A 的輸入 UTXO 仍然存在。假設在6:05 Node-5 和 Node-8 正在嘗試解決雜湊難題以探勘他們的塊,並且在6:08假設 Node-5 解決了難題並將其塊廣播到網路。當 Node-8 試圖用它擁有的交易解決這個難題時**(A->B)。假設在6:14,Node-8 解決了這個難題並嘗試廣播其包含 (A->B 這是雙花) 的塊。**然後對等節點將拒絕 Node-8 廣播的塊,因為它有一個無效的交易(雙花交易)。

- 這裡的錯誤不是 Node-8,Node-8 誠實地按照協議工作。即使在這種情況下對等節點拒絕了誠實的 No​​de-8 的塊,並且 Node-8 已經失去了很多計算能力,這很不公平嗎?

- 比特幣協議如何解決/幫助 Node-8 的這個問題?

如果我錯了,請糾正我..​​.

如果兩個塊有相同的祖先,我們說我們有一個分叉。如果一個節點看到一個分叉,它假定它看到的第一個塊是最好的,但保留另一個。隨著時間的推移,最終會有人解決下一個區塊的 PoW,而這個區塊很可能會擴展兩條鏈中的一條(即,這個區塊將在分叉的一條之後)。工作量多的鏈條總是會獲勝,因此無論哪個鏈條得到擴展,都會成為活躍的鏈條。

如果 Node-8 的區塊得到擴展,那麼網路會將其作為目前最佳鏈,即使他們首先看到 Node-5 的區塊。由於 Node-8 的區塊通過,A 將被發送到 B,而另一筆交易將失效。

這就是為什麼有些人等待一些確認直到最終付款,因為沒有重組的風險(重組意味著改變目前的小費,替換一些我們認為是最佳鏈的一部分的塊,並被其他塊替換)。

我將提供一個框架挑戰。您的情況對我來說毫無意義,因為您似乎對區塊鏈的工作方式和在網路上的傳播方式有錯誤的認識。

第一個問題:在 6:02 Node-5 已經聽說了事務 A->B。交易只會盡最大努力傳播,但作為下一個區塊候選的交易應該在 30 秒內到達大多數節點。沒什麼大不了的:我們可以通過讓攻擊者在 6:00 並行發送 A->B 到 Node-8 和 A->C 到 Node-5 來解決這個問題。所以 Node-5 和 Node-8 現在對未經確認的交易確實有不同的看法,並且每個人都認為他們的付款是有效的。如果他們看到另一筆交易,他們將拒絕它,因為它與他們已經擁有的交易相衝突。

現在在 6:08,Node-8 找到了一個包含 A->C 的新塊。塊傳播具有最高優先級,並且塊的傳播得到保證。一些節點可能不會聽到未確認的交易,但每個節點都會在幾秒鐘內聽到新的區塊。如果該塊有效並且新的最佳鏈提示,每個人都使用該新塊擴展他們的區塊鏈。此時 Node-8 意識到 A->C 已經花費了資金,交易 A->B 現在無效。Node-8 從他們的記憶體池中刪除 A->B。每個礦工,包括 Node-8,都轉而嘗試尋找一個新區塊,該新區塊位於 Node-5 發布的區塊之後。雙重支付已經解決,因為只有一筆交易倖存下來。

節點在將交易添加到記憶體池之前驗證交易。那時他們只能評估一筆交易是否有資格被包含在一個區塊中,並且他們只保留他們看到的第一個(或最好的)衝突交易。一旦發布了一個塊,該塊的內容總是取代其記憶體池的內容。區塊是網路共享的基本事實,區塊鏈在每個高度只有一個區塊。當鏈尖進展時,每個人都開始在新的高度上工作。

如果 Node-5 和 Node-8 同時找到了它們的塊(彼此相距幾秒鐘),它們將各自將它們的塊廣播給它們的對等點。每個節點都會堅持他們首先看到的任何塊,直到找到另一個塊。然後每個人都會聚集在新的最佳鏈尖上,而另一個區塊將成為一個滅絕的鏈尖,而不是最佳鏈的一部分。

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