Transactions

為什麼最長鏈規則最能阻止雙重支出?

  • April 6, 2022

如果發生雙重支出,我不明白為什麼最長鏈規則會降低僅確認一筆交易的可能性。

有人可以逐步解釋為什麼這在邏輯上是有意義的嗎?我瀏覽了 youtube 影片,但他們沒有解釋這背後的邏輯。影片僅描述了使用最長鏈規則。

我還有一個額外的問題。是否所有的礦工也在驗證被解決的區塊一旦被解決是正確的?

雙花

假設 Alice 有一個比特幣,一個價值 1.001 BTC 的未使用交易輸出 (UTXO)。

Alice 使用芝加哥的一台電腦創建了一個使用該 UTXO 向 Bob 支付 1 BTC 的交易。

通過遠端訪問東京的一台電腦,Alice 創建了一個使用相同 UTXO 向 Carol 支付 1 BTC 的交易。

Alice 是個壞人,他試圖欺騙 Bob 或 Carol。

芝加哥的礦工看到芝加哥交易並探勘一個包含支付 Bob 的交易的新區塊。

東京的一名礦工看到了東京的交易並探勘了一個包含支付給 Carol 的交易的新區塊。

芝加哥的人們看到付錢給鮑勃的芝加哥街區

東京人看到付錢給卡羅爾的東京街區

芝加哥的人們將東京區塊視為雙重支出並拒絕它,因為 UTXO 已經被用來支付鮑勃而不是卡羅爾

東京人看到芝加哥街區並拒絕將其視為雙重支出,因為 UTXO 已被用於支付 Carol 而不是 Bob

現在一半的世界認為 Bob 得到了報酬,而一半的世界認為 Carol 得到了報酬。除非我們有辦法將這些區塊以及其中的交易置於世界各地的相同順序,否則比特幣網路將陷入混亂。

我們需要一些方法來將東京和芝加哥街區排序成一個不取決於您離東京或芝加哥多近的順序。這樣每個人都可以同意 Bob 擁有 1 BTC 還是 Carol 擁有。然後,愛麗絲不會兩次使用她的錢。


驗證

在創建一個雜湊值小於目標的新塊後,礦工不需要驗證或驗證他們生成的塊,因為他們在開始探勘之前已經驗證了所有內容。

所有節點,無論是錢包、礦工還是其他類型的節點,都會在收到數據後立即驗證盡可能多的數據。沒有節點關心其他節點是否驗證任何內容,因為沒有全節點信任任何其他節點。

驗證不同於確認。確認只是計算自從包含交易的區塊以來已經開采了多少區塊。包含事務的塊包含在計數中。

雙花問題到底是什麼?比特幣如何處理它?

總之一句話:已經花掉的錢不應該神奇地回來再花。

  1. 你可能已經知道比特幣的賬本,稱為區塊鏈,是公開的,它跟踪所有比特幣的交易歷史,一直到最初生成的地方。(換句話說,“開採”,在一種特殊類型的交易中,又名“coinbase 交易”)顯然我們(實際上,每個人 - 再次,區塊鏈分類賬是公開的)可以驗證礦工是否遵循規則,例如,規則這不允許憑空生成任意數量的新比特幣。
  2. 在數字簽名的幫助下,我們(實際上每個人都一樣)可以驗證本質上轉移硬幣(UTXO)所有權的交易是否有效。
  3. 在區塊鏈分類賬中,很容易發現花費了不存在的硬幣的無效交易,無論它已經花費還是根本不存在。實際上,全節點軟體通常維護一個名為“UTXO 集”的數據庫,該數據庫本質上儲存了每個現有比特幣的所有權。確定 UTXO 集中是否存在 UTXO 幾乎是即時的。(曾經有像 CVE-2018-17144 這樣的軟體錯誤,它錯誤地允許再次花費已經花費的硬幣,但是一旦發現並報告給開發人員,它就迅速得到了修復)

是的,區塊鏈數據是巨大的——但是全節點軟體實際上根本不需要處理舊塊,因為,你只需要照顧好 UTXO 集(這只是“目前餘額”),而不是整個巨大的歷史。一個全新的全節點仍然需要下載和驗證所有塊,但這只需要發生一次,之後將建立 UTXO 集並保持最新。

  1. 在這裡,我們遇到了真正的“雙花”問題。如果惡意方創建了區塊鏈分類賬的替代(和不誠實)版本,其中包括惡意/不誠實**(但根據共識規則有效!)**交易,上面寫著“Alice 向自己支付了 3 BTC”(或其他人 - 這相當於愛麗絲支付自己的情況,因為愛麗絲仍然基本上“讓她已經花的錢回來再次消費”),但不是原始/誠實(也是有效)的交易,即“愛麗絲向鮑勃支付了 3 BTC”?**如何判斷哪個版本的區塊鏈賬本是“正確”的?**那是比特幣面臨的真正問題——而不是上面提到的微不足道的情況。

所謂的“最長鏈規則”來了

  1. 針對上面提到的問題,比特幣只是採取了簡單有效的方法:選擇累積工作量證明最多的鏈(是的,實際上它不是“最長的”,這也是中本聰自己曾經犯過的錯誤)然後更正)作為“正確”的。
  2. 如果每個誠實的節點都遵循協議,總是找到並遵循他們認為累積工作最多的鏈,他們最終將收斂到一個普遍接受的鏈上,這就是使比特幣真正存在的“共識”。

為什麼工作量證明

顧名思義,在現實世界中探勘一個區塊的成本相當高(這讓礦工三思而後行),這也能抵抗造假驗證是微不足道的,就像計算雜湊一樣簡單(僅一次- 而探勘一個新塊需要數十億次計算)併計算有多少前導零。

為什麼礦工願意做枯燥的交易驗證工作?為什麼礦工自己不作弊(無視/違反規則)?

作為一名礦工,你必須投入大量資源來開採一個區塊。礦工應該是“貪婪的”——用盡可能少的成本賺到盡可能多的錢。那麼,作為個體礦工,你面臨的就是一個囚徒困境:雖然交易驗證工作不難,但顯然不做這個工作更省力,不是嗎?然而,作為一個理性的礦工**(他們也應該只包含比特幣算力的微不足道的一部分),你幾乎可以肯定地意識到你不能壓倒比特幣算力的其餘部分(這也不應該與你合作) .**如果你作為一個微不足道的人決定跳過驗證工作(甚至故意包含無效交易),其他做這項工作的礦工很快就會發現你的區塊無效(如果你的區塊有任何無效),那麼你現在投入的所有資源價值為零,因為其他礦工不斷在有效區塊鏈上擴展,而不是你的無效區塊鏈。畢竟,正如上面提到的,驗證區塊鏈賬本並不難。不僅礦工,使用者也可以這樣做——只需執行一個完整的節點。

礦工們是否也在驗證解決的區塊是否正確?

  1. 一個誠實的礦工只擴展他認為最有效的 PoW 鏈。換句話說,他總是盡最大努力尋找這樣最有效的 PoW 鏈,一直都是。
  2. 由於採礦的“無記憶”性質,“放棄先前基礎上的工作”不需要任何成本 - 實際上沒有“先前的工作”可以放棄。
  3. 為了讓他贏得新生成的比特幣的獎勵(加上在一個區塊內收取的交易費用),他顯然不需要一遍又一遍地驗證他的新區塊將包含的交易。使用 UTXO 集,他可以立即知道交易是否有效(符合規則),然後有資格被包含。在實踐中,全節點軟體通常會維護一個包含此類合格(當然也是有效)交易的池,稱為“mempool”
  4. 實際上,挖礦“鑽機”根本不需要處理完整的區塊數據——所有的驗證工作都應該由礦池完成(這也是比特幣網路的一個完整節點——而且,原則上,技術上任何人可以執行一個池,但實際上執行一個公共池也與工程和經濟學有關)。所有包含的交易最終都會在塊頭中產生一個 Merkle 根,然後塊頭(包含 nonce 欄位)理論上是礦機唯一需要處理的事情。(實際上比特幣區塊頭的隨機數很快耗盡,因此coinbase交易也被饋送到“鑽機”機器)然而,另一方面,這也是比特幣在現實中長期被指責的(重新)中心化問題——畢竟,**礦機本身不會驗證(整個)區塊,並且不依賴自己的完整節點的礦工也(盲目地)信任公共礦池運營商。**為了解決(或至少緩解)這個問題,已經提出了新的挖礦協議,使礦工(他們實際上信任/依賴公共礦池運營商)也可以驗證像 StratumV2 這樣的區塊。

如果惡意礦工選擇探勘“有效(符合規則)但不誠實”(雙花)替代鏈,而不是總是顯而易見且易於發現的“無效(違反規則)鏈”怎麼辦?

最後,我們遇到了真正的雙花問題和所謂的 51% 攻擊

由於不誠實的鏈也符合規則,對於任何沒有目睹整個真實歷史的旁觀者(由於網路延遲等原因,這也是不切實際/不可能的),很難/不可能判斷哪個鏈應該是“正確”之一。

然而,使用最多累積工作量證明規則,至少收款人可以選擇等待更多的確認(多少後來的塊被附加到包含付款的塊中)以降低他的風險,**只要因為假定的攻擊者無法控制超過 50% 的比特幣雜湊算力。**正如中本聰在比特幣白皮書中的計算一樣,只要攻擊者只控制 < 50% 的算力,雙花攻擊者成功的機會/機率將隨著確認數的增加而急劇下降。

如果雙花攻擊最終成功了怎麼辦?

從技術上講,收款人顯然失去了他原本應該獲得的付款——當然,不會憑空創造新的硬幣。

然而,一旦雙重支出攻擊成功,就會產生更微妙的影響,這很難說。

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