原文標(biāo)題:《Bitcoin's Duplicate Transactions》
原文來源:BitMEX Research
編譯:BlockBeats
在比特幣區(qū)塊鏈中存在兩組完全相同的交易,一組交易「夾住」了另一組交易,它們都發(fā)生在 2010 年 11 月中旬。重復(fù)交易可能會導(dǎo)致混亂,比特幣開發(fā)者多年來一直通過各種方式與之作斗爭。這個問題仍未 100% 解決,下一個潛在的重復(fù)交易可能會在 2046 年出現(xiàn)。盡管與重復(fù)交易相關(guān)的風(fēng)險現(xiàn)在已經(jīng)很小,但這是一個值得思考的有趣怪異 bug。
一個正常的比特幣交易通過引用前一筆交易的交易 ID(TXID) 來使用至少一個前一筆交易的輸出。這些未花費的輸出只能被花費一次,如果它們可以被花費兩次,你就可以對比特幣進(jìn)行雙重支付,使比特幣變得毫無價值。然而,在比特幣中實際上恰好存在兩組完全相同的交易。這種情況之所以可能發(fā)生,是因為 coinbase 交易沒有任何交易輸入,而是有新生成的幣。因此,兩個不同的 coinbase 交易有可能發(fā)送相同數(shù)量到相同地址,并以完全相同的方式構(gòu)建,使它們完全相同。由于這些交易是相同的,TXID 也相匹配,因為 TXID 是交易數(shù)據(jù)的哈希摘要。TXID 被復(fù)制的唯一其他方式,是哈希碰撞,對于加密安全的哈希函數(shù)來說,這被認(rèn)為是不太可能且不可實現(xiàn)的。像 SHA256 這樣的哈希碰撞在比特幣或其他任何地方都從未發(fā)生過。
這兩組重復(fù)交易都發(fā)生在相近的時間內(nèi),在 2010 年 11 月 14 日 08:37 UTC 至 2010 年 11 月 15 日 00:38 UTC 之間,跨度約 16 小時。第一組重復(fù)交易被夾在第二組之間。我們將 d5d2….8599 歸類為第一個重復(fù)交易,因為它首先成為復(fù)制品,盡管奇怪的是,它在區(qū)塊鏈上首次出現(xiàn)是在另一個重復(fù)交易 e3bf….b468 之后。
在下面的圖片中,可以看到來自 mempool.space 區(qū)塊瀏覽器的兩個截圖,顯示了第一個重復(fù)交易在兩個不同區(qū)塊中重復(fù)出現(xiàn)的情況。
有趣的是,當(dāng)在網(wǎng)絡(luò)瀏覽器中輸入相關(guān)網(wǎng)址時,mempool.space 區(qū)塊瀏覽器在 d5d2….8599 的情況下默認(rèn)顯示較早的區(qū)塊,而在 e3bf….b468 的情況下默認(rèn)顯示較晚的區(qū)塊。Blockstream.info 和 Btcscan.org 與 mempool.space 有相同的行為。另一方面,根據(jù)我們的基本測試,Blockchain.com 和 Blockchair.com 的行為方式不同,當(dāng)在瀏覽器中輸入 URL 時,總是顯示重復(fù)交易的最新版本。
在相關(guān)的四個區(qū)塊中,只有一個區(qū)塊(區(qū)塊 91,812)包含了其他交易。這筆交易將 1 BTC 和 19 BTC 的輸出合并成了一個 20 BTC 的輸出。
由于存在兩組相同的 TXID,這為后續(xù)交易創(chuàng)造了引用問題。每個重復(fù)交易的價值為 50 BTC。因此,這些重復(fù)交易總共涉及 4 x 50 BTC = 200 BTC,或者根據(jù)不同的理解方式,可能涉及 2 x 50 BTC = a100 BTC。在某種程度上,有 100 BTC 實際上并不存在。
截至今天,所有 200 BTC 都未被花費。據(jù)我們所知(我們可能在這里是錯誤的),如果有人擁有與這些輸出相關(guān)聯(lián)的私鑰,他們可以花費這些比特幣。然而,一旦被花費,UTXO 將從數(shù)據(jù)庫中刪除,重復(fù)的 50 BTC 因此將無法花費并丟失,因此只有 100 BTC 可能被找回。至于如果這些幣被花費,它們將來自哪個區(qū)塊,是較早的還是最近的,這可能是未定義的或無法確定的。
這個人本可以在創(chuàng)建重復(fù)交易之前花費所有比特幣,然后創(chuàng)建重復(fù)輸出,在未花費輸出的數(shù)據(jù)庫中創(chuàng)建新條目。這將意味著不僅有重復(fù)交易,還有可能有重復(fù)的已花費輸出的重復(fù)交易。如果發(fā)生這種情況,當(dāng)這些輸出被花費時,將可能創(chuàng)建更多的重復(fù)交易,形成一種重復(fù)鏈。人們必須小心事件的順序,總是在創(chuàng)建重復(fù)之前花費,否則比特幣可能永遠(yuǎn)丟失。這些新的重復(fù)交易將不是 coinbase 交易,而是「正?!菇灰?。幸運的是,這種情況從未發(fā)生過。
重復(fù)交易顯然是不好的。它們會給錢包和區(qū)塊探索者帶來混亂,也會讓人不清楚比特幣的來源。它還會帶來許多攻擊和漏洞。例如,你可以用兩筆重復(fù)的交易支付某人兩次。然后,當(dāng)交易方?jīng)Q定嘗試使用這筆資金時,他們可能會發(fā)現(xiàn)只有一半的資金可以收回。例如,這可以是對交易平臺的攻擊,試圖使其破產(chǎn),而攻擊者卻沒有任何損失,因為他們可以在存款后立即提取資金。
為了緩解重復(fù)交易問題,2012 年 2 月,比特幣開發(fā)者 Pieter Wuille 提出了 BIP30 軟叉方案,禁止使用重復(fù) TXID 進(jìn)行交易,除非前一個 TXID 已被花費。該軟叉適用于 2012 年 3 月 15 日之后的所有區(qū)塊。
2012 年 9 月,比特幣開發(fā)者 Greg Maxwell 修改了這一規(guī)則,使 BIP30 檢查適用于所有區(qū)塊,而不僅僅是 2012 年 3 月 15 日之后的區(qū)塊。本文前面提到的兩個重復(fù)交易除外。這修復(fù)了一些 DOS 漏洞。從技術(shù)上講,這又是一次軟叉,盡管規(guī)則變更只適用于過去 6 個月以上的區(qū)塊,因此它不存在與正常協(xié)議規(guī)則變更相關(guān)的任何風(fēng)險。
這種 BIP30 檢查的計算成本很高。節(jié)點需要檢查新區(qū)塊中的所有交易輸出,并檢查這些輸出端點是否已存在于 UTXO 中。這可能就是 Wuille 只對未使用的輸出進(jìn)行檢查的原因,如果對所有輸出都進(jìn)行檢查,計算成本會更高,而且無法進(jìn)行剪枝。
2012 年 7 月,比特幣開發(fā)者加文-安德森(Gavin Andresen)提出了 BIP34 軟分叉方案,并于 2013 年 3 月激活。這一協(xié)議變更要求 coinbase 交易包含區(qū)塊高度,這也使得區(qū)塊版本管理成為可能。區(qū)塊高度被添加為幣基交易腳本 Sig 的第一項。coinbase scriptSig 中的第一個字節(jié)是區(qū)塊高度數(shù)字所使用的字節(jié)數(shù),接下來的字節(jié)就是區(qū)塊高度數(shù)字本身。對于第一個 c160 年(223 /(每天 144 個區(qū)塊 * 每年 365 天)),第一個字節(jié)應(yīng)為 0x03。這就是為什么如今的 coinbase ScriptSig(HEX)總是以 03 開頭。這次軟分叉似乎徹底解決了重復(fù)交易問題,現(xiàn)在所有交易都應(yīng)該是唯一的。
由于已經(jīng)采用了 BIP34,2015 年 11 月,比特幣開發(fā)者亞歷克斯-莫科斯(Alex Morcos)向比特幣核心軟件倉庫添加了一個拉取請求,這一更改意味著節(jié)點將停止進(jìn)行 BIP30 檢查。畢竟,既然 BIP34 修正了這個問題,那么這種昂貴的檢查就不再有必要了。雖然當(dāng)時還不知道,但從技術(shù)上講,這是為未來一些非常罕見的區(qū)塊進(jìn)行的硬分叉?,F(xiàn)在看來,潛在的硬分叉并不重要,因為幾乎沒有人在運行 2015 年 11 月之前的節(jié)點軟件。在 forkmonitor.info,我們運行的是 2015 年 10 月發(fā)布的 Bitcoin Core 0.10.3。因此,這是一個硬分叉前的規(guī)則,客戶端仍在進(jìn)行昂貴的 BIP30 檢查。
事實證明,在 BIP34 激活之前的區(qū)塊中有一些 coinbase 交易,當(dāng)時使用的 scriptSigs 的第一個字節(jié)恰好與未來有效的區(qū)塊高度相匹配。因此,雖然 BIP34 確實在幾乎所有情況下都修復(fù)了這個問題,但它并不是一個完全的 100% 修復(fù)。2018 年,比特幣開發(fā)者約翰-紐貝里(John Newbery)打印出了這些潛在重復(fù)的完整列表,如下表所示。
*注:這些區(qū)塊已在 2012 年和 2017 年產(chǎn)生 Coinbase 交易并非重復(fù)。209 921 個區(qū)塊(距離第一次減半僅差 79 個區(qū)塊)不可能是重復(fù)的,因為 BIP30 在此期間得到了執(zhí)行。
來源:https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd
按年份分列的潛在重復(fù) Coinbase 交易數(shù)量
來源:https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd
因此,下一個可能出現(xiàn)重復(fù)交易的區(qū)塊是 1,983,702,將于 2046 年 1 月左右產(chǎn)生。2012 年 1 月產(chǎn)生的 164,384 區(qū)塊中的 Coinbase 交易向七個不同的輸出地址發(fā)送了 170 BTC。因此,如果 2046 年的礦工想要進(jìn)行這次攻擊,他們不僅需要足夠幸運地找到這個區(qū)塊,還需要燒掉不到 170 BTC 的費用,總成本略高于 170 BTC,其中包括 0.09765625 BTC 區(qū)塊補貼的機會成本。
按照目前 88500 美元的比特幣價格計算,這將花費超過 1500 萬美元。至于 2012 年幣庫交易的七個地址歸誰所有,目前還不得而知,密鑰很有可能已經(jīng)丟失。目前,該 Coinbase 交易的所有七個輸出地址都已被使用,其中三個在同一筆交易中使用。我們認(rèn)為這些資金可能與 Pirate40 龐氏騙局有關(guān),但這只是我們的推測。因此,這次攻擊看起來不僅代價高昂,而且對攻擊者來說幾乎毫無用處。要在硬分叉中將 31 年前的 2015 年 11 月節(jié)點從網(wǎng)絡(luò)中刪除,這將是一筆不小的開支。
下一個可能被復(fù)制的脆弱區(qū)塊是 2012 年 3 月的 169985。這個 Coinbase 只花費了剛剛超過 50 BTC,遠(yuǎn)遠(yuǎn)低于 170 BTC。當(dāng)然,50 BTC 是當(dāng)時的補貼,而當(dāng)這一 Coinbase 交易在 2078 年變得容易被重復(fù)時,補貼就會低得多。因此,要利用這一點,礦工將需要燒掉大約 50 BTC 的費用,而這些費用他們是拿不回來的,因為這些費用必須發(fā)送到 2012 年的舊產(chǎn)出中。誰也不知道 2078 年比特幣的價格會是多少,但這種攻擊的成本也可能高得嚇人。因此,這個問題可能不是比特幣的主要風(fēng)險,但仍然令人擔(dān)憂。
自 2017 年 SegWit 升級以來,Coinbase 交易也可以包含對一個區(qū)塊中所有交易的承諾。這些 BIP34 之前的區(qū)塊并不包含見證承諾。因此,要產(chǎn)生一個重復(fù)的 Coinbase 交易,礦工需要從區(qū)塊中排除任何 SegWit 輸出贖回交易,這進(jìn)一步增加了攻擊的機會成本,因為區(qū)塊可能無法包含許多其他支付費用的交易。
考慮到復(fù)制交易的難度和成本,以及利用它的機會非常罕見,這個復(fù)制交易漏洞并不像是比特幣的一個主要安全問題。不過,考慮到所涉及的時間尺度和重復(fù)交易的新穎性,想想還是挺有意思的。盡管如此,多年來開發(fā)人員還是在這個問題上花費了大量時間,2046 年這個日期在一些開發(fā)人員心中可能是修復(fù)這個問題的最后期限。修復(fù)這個錯誤的方法有很多,可能需要軟叉。一種可能的修復(fù)方法是強制執(zhí)行 SegWit 承諾。
登載此文出于傳遞更多信息之目的,并不意味著贊同其觀點或證實其描述。文章內(nèi)容僅供參考,不構(gòu)成投資建議。投資者據(jù)此操作,風(fēng)險自擔(dān)。