作者:Vojtěch Strnad
譯者注:本文介紹的是一筆特意製作的奇怪交易,展現了比特幣協議自身的複雜性和靈活性。
如果你經常逛 Twitter 或 Stacker News,那麼你可能會留意到,人們討論了主網上出現的一筆奇怪的比特幣交易:
https://mempool.space/tx/b10c0000004da5a9d1d9b4ae32e09f0b3e62d21a5cce5428d4ad714fb444eb5d
它吸引了很多人的關注,人們迫切想知道:是誰製作了這筆奇怪的交易?它隱藏著什麼秘密?
讓我來揭曉這兩個問題的答案。
消息:
Transaction b10c0000004da5a9d1d9b4ae32e09f0b3e62d21a5cce5428d4ad714fb444eb5d was created by Vojtěch Strnad.
地址:
1J7SZJry7CX4zWdH3P8E8UJjZrhcLEjJ39
簽名:
H6WHgwnYtggJH5yqVpeL9NRxWJ+8hqUW31Mc1J9e9Q3cZGEdDjixYT6jnPpIHM2FVHDbeEstP8KzDsj5U01BNSo=
如果你想自己驗證一下這個簽名(我非常建議這麼做哦),請不用在酒店 Wi-Fi 下使用 Bitcoin Core 或 Electrum 哦。
搞定這個事情之後,我們就要揭曉這筆交易中的每一個彩蛋了。其中最後兩個,就我所知,到我寫這篇文章的時候也還沒有任何人注意到:
- 該交易被區塊 850000 首次確認。
- 該交易的 locktime 是比特幣創世區塊的時間戳。(譯者注:locktime 是交易層面的絕對時間鎖的實現方法;在此處,其含義是該筆交易僅在創世區塊出現後才能被確認。)
- 這筆交易有一個浮誇的 TXID 和 WTXID。TXID 的開頭是
b10c0000004da5...
,是比特幣開發者 0xB10C 的個人主頁,他曾經制作過一筆有類似 TXID 的交易(見:https://b10c.me/7 )。而 WTXID 的開頭是0000000001d54...
,也就是一系列的零,就像區塊哈希值一樣。 - 這筆交易使用了每一種可能的標準輸入和輸出類型:P2PK、P2PKH、P2MS(裸的多簽名)、P2SH、P2WPKH、P2WSH、P2TR、OP_RETURN 以及一個 2 字節的 SegWit v1 輸出(使用的是從 “臨時錨點” 協議借用來的腳本)。一部分類型在輸入中多次使用:P2SH 就分成了傳統的 P2SH、封裝的 P2WPKH 以及封裝的 P2WSH,而 P2TR 則分成了密鑰路徑花費和腳本路徑花費兩種情形。(譯者注:在比特幣網絡中,節點會默認傳播具有某一些特徵的交易;而 “標準輸入/輸出” 就是這樣的特徵之一。輸入/輸出 的類型指的是用來鎖定該筆資金的腳本的 “模板”;由於不同資金本身是相互獨立的,我們就可以為使用不同模板的腳本適用略微不同的驗證規則,這就是比特幣軟分叉升級可能性的由來。這裡所謂的 “封裝的 P2WPKH/P2WSH”,則是在隔離見證時,為了方便尚不支持隔離見證特性的舊錢包向隔離見證腳本發送資金,而特地設計的、讓隔離見證腳本表現為 P2SH 腳本的類型。)
- 輸入中有多個多簽名腳本和閃電通道相關腳本:裸多簽名輸入用的是 2-of-3 多簽名裝置,傳統的 P2SH 是 3-of-5 多簽名,封裝的 P2WSH 是一個撤銷的閃電通道 HTLC,P2WSH 是一筆撤銷的閃電通道強制關閉(通常叫做 “懲罰交易”),且具備一個不常用的短 CSV 延遲(42 個區塊),而 P2TR 腳本路徑使用的是一個 5-of-7 多簽名(既是為了延續質數模式,也是為了引用 “5/7” 梗)。(譯者注:CSV 即是腳本層面的相對時間鎖)。
- 輸入的數額都有特殊的含義:6102 指的是美國 6102 號行政令(譯者注:禁止私人儲蓄黃金)、1913 是美聯儲(Fed)成立的時間,1971 是美國廢止金本位的時間,2010 是比特幣預計最後一次減半的時間(屆時區塊補貼將下降到 0),5139 指的是 CVE-2010-5139(比特幣數值溢出漏洞),3220 指的是 CVE-2013-3220(2013 年的意外分叉),17144 指的是 CVE-2018-17144(未被利用的通脹漏洞),8149 指的是 Bitcoin 實現隔離見證的 PR 號,9001 指的是 “超過 9000 了!” 表情包,19953 指的是 Bitcoin Core 實現 Taproot 的 PR 號。
- 輸出的數額展示了每一種輸出類型的粉塵門檻:使用壓縮公鑰的 P2PK 輸出是 576 聰,P2PKH 是 546 聰,使用壓縮公鑰的 1-of-1 裸多簽名輸出是 582 聰,P2SH 是 540 聰,20 字節的隔離見證輸出(P2WPKH)是 294 聰、32 字節的隔離見證輸出(P2WSH 和 P2TR)是 330 聰,2 字節的隔離見證輸出是 240 聰,OP_RETURN 是 0 聰。
- 輸入的 sequence 數字有特殊的含義:20090103 指的是創世區塊產生的日期,20081031 指的是白皮書的出版時間,19750504 指的是中本聰自曝的出生日期,16 指的是 BIP-16(P2SH 升級),141 指的是 BIP-141(隔離見證升級),0xdeadbeef 是一個眾所周知的魔法數字(在這裡用作對封裝的 P2WSH 的 80 比特安全性的評論),21000000 是我們所有人都知道並且喜愛的數字,0xf9beb4d9 是用在比特幣 P2P 協議中的魔法數字,341 指的是 BIP-341(Taproot 升級),而 342 指的是 BIP-342(Tapscript)。
- 這筆交易使用了不同長度的 DER 編碼的 ECDSA 簽名:71 字節、70、69、68、67、66、65、59、58 和 57。簽名一般長 71 或 72 字節,但可以通過重複嘗試來獲得較短的簽名;這叫做 “簽名研磨”。後面三個尤其短,因為它們使用了 secp256k1 曲線上一個已知的短 r 值。
- 這筆交易使用了所有種類的 sighash 標籤:SIGHASH_DEFAULT、SIGHASH_ALL、SIGHASH_NONE、SIGHASH_SINGLE、SIGHASH_ALL | SIGHASH_ANYONECANPAY、SIGHASH_NONE | SIGHASH_ANYONECANPAY 和 SIGHASH_SINGLE | SIGHASH_ANYONECANPAY。(譯者注:sighash 標籤可以讓一個簽名跟交易的特定部分綁定;改動被綁定的部分會使簽名失效,而改動沒有被綁定的部分則不會影響簽名的有效性。例如,SIGHASH_ALL 表示該簽名與一筆交易的所有部分綁定,改動任何 輸入/輸出 都會使該簽名失效。反過來說,sighash 讓我們可以辨別一筆交易是不是簽名者願意簽署的那筆交易。)
- OP_RETURN 輸出在初始文本推入之後,包含了數字 0 到 16 的推入(puch)操作碼。多次推入不會打破任何標準型規則,只要輸出的體積在不超出限制。
- 在多個輸入中使用了未壓縮的公鑰,並且在多簽名腳本中混合使用壓縮的和未壓縮的公鑰。(譯者注:公鑰是橢圓曲線上的一個點,因此有兩種表示形式,一種是 x 座標及 y 座標,另一種是隻給出 x 座標,加上 y 值的奇偶性(或對 y 值的奇偶性作另外的強制安排);前者稱為未壓縮形式,後者稱為壓縮形式。早期的比特幣曾使用未壓縮形式,後來則逐漸強制要求壓縮形式(可節約鏈上空間)。)
- 在 P2MS 以及傳統的 P2SH 輸入中,未使用的多簽名公鑰是創世區塊的 coinbase 公鑰、區塊 9 的 coinbase key 以及 Hal Finney 用在有史以來第一筆比特幣交易中的公鑰。P2TR 腳本花費多簽名裝置中的兩個未使用的公鑰是來自有史以來第一筆 P2TR 腳本花費交易中的兩個公鑰。P2TR 腳本花費中的內部公鑰是白皮書的 SHA-256 哈希值。最後,HTLC 腳本中的 20 字節的哈希值對應於地址 17TASsYPbdLrJo3UDxFfCMu5GXmxFwVZSW,該地址被用在 2010 年的數值溢出漏洞中,其用在攻擊中的 0.5 BTC 一直到現在也沒有再移動過。
- P2TR 腳本花費輸入有一棵深度為 21 的的默克爾樹,比之前曾經出現過的都要深(此前的最高記錄是 7 層)。控制塊中揭曉的默克爾分支數值並不是隨機的哈希值,而是對比特幣歷史有重大影響的 21 筆交易的 TXID:
- 2009-01-03 創世區塊的 coinbase 交易:
4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b - 2009-01-12 第一筆非 coinbase 交易(由中本聰發送給 Hal):
f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16 - 2009-01-16 第一筆發送到 P2PKH 腳本的交易:
6f7cf9580f1c2dfb3c4d5d043cdbb128c640e3f20161245aa7372e9666168516 - 2010-05-22 Laszlo Hanyecz 的披薩交易(價值 10000 BTC):
a1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d - 2010-11-14 第一筆具有重合 TXID 的交易(BIP-30 的第一個例外):
d5d27987d2a3dfc724e359870c6644b40e497bdc0589a033220fe15429d88599 - 2010-11-15 第一筆具有重合 TXID 的交易(BIP-30 的第二個例外):
e3bf3d07d4b0375638d5f1db5255fe07ba2c4cb067cd81b84ee974b6585fb468 - 2011-11-16 迄今面額最大的比特幣交易(550,000 BTC):
29a3efd3ef04f9153d47a990bd7b048a4b2d213daaa5fb8ed670fb85f13bdbcf - 2013-04-06 包含了完整比特幣白皮書的交易:
54e48e5f5c656b26c3bca14a8c95aa583d07ebe84dde3b7dd4a78f4e4186e713 - 2013-11-05 Rickroll 交易:
d29c9c0e8e4d2a9790922af73f0b8d51f0bd4bb19940d9cf910ead8fbe85bc9b - 2015-07-07 F2Pool 的 “巨型交易(Megatransaction)” 需要花 25 秒來驗證(詳見 Rusty Russell 撰寫的博客):
bb41a757f405890fb0f5856228e23b715702d714d59bf2b1feb70d8b2b4e3e08 - 2015-07-11 F2Pool 與 Greg Maxwell 合作製造的另一筆相似交易,使用了 SIGHASH_SINGLE bug 因此易於驗證,還使用短 r 值技巧獲得更小的簽名:
9fdbcf0ef9d8d00f66e47917f67cc5d78aec1ac786e2abb8d2facb4e4790aad6 - 2016-04-26 迄今支付最高手續費的單體交易(291 BTC):
cc455ae816e6cdafdb58d54e35d4f46d860047458eacf1c7405dc634631c570d - 2017-02-23 領取 SHA-1 碰撞獎金的交易:
8d31992805518fd62daa3bdd2a5c4fd2cd3054c9b3dca1d78055e9528cff6adc - 2017-08-24 第一筆隔離見證花費交易:
8f907925d2ebe48765103e6845c06f1f2bb77c6adc1cc002865865eb5cfd5c1c - 2021-07-23 0xB10C 的任何人都可花費的 P2TR 交易(詳見:https://b10c.me/7 ):
b10c007c60e14f9d087e0291d4d0c7869697c6681d979c6639dbd960792b4d41 - 2021-11-14 第一筆 Taproot 花費交易:
33e794d097969002ee05d336686fc03c9e15a597c1b9827669460fac98799036 - 2021-11-14 第一筆 Taproot 腳本花費交易:
37777defed8717c581b4c0509329550e344bdc14ac38f71fc050096887e535c8 - 2021-12-07 王純給 Luke Dashjr 捐贈的 1 BTC(找零為 8999 BTC):
fd456524104a6674693c29946543f8a0befccce5a352bda55ec8559fc630f5f3 - 2022-10-09 Burak 的 998-of-999 多簽名花費,打破了 LND:
7393096d97bfee8660f4100ffd61874d62f9a65de9fb6acf740c4c386990ef73 - 2022-11-01 Burak 再次打破 LND 的交易:
73be398c4bdc43709db7398106609eea2a7841aaf3a4fa2000dc18184faa2a7e - 2023-11-23 以法幣計手續費最高的交易(86 BTC 或 313 萬美元):
b5a2af5845a8d3796308ff9840e567b14cf6bb158ff26c999e6f9a1f5448f9aa
- 2009-01-03 創世區塊的 coinbase 交易:
整個項目花費了超過 1 年的時間才完成。最初我只是想製作一筆包含每一種可能輸入和輸出類型的交易,作為比較各區塊瀏覽器特性的參考交易,但隨著我產生越來越多的想法,複雜性也逐漸爆炸,最終變成了你們看到的樣子。我學到了很多,不僅關於比特幣協議,也關於比特幣的歷史。我用 TypeScript 語言和 BitcoinJS 編寫了生成這筆交易的代碼;少量性能敏感的部分是後來用 Rust 寫的,我為了這個目的而專門學習了這種語言。
感謝 mononaut 最先注意到我的交易,就在我創建它的幾個小時之後,並且也是第一個注意到其 TXID 的重要性的人。然後,Super Testnet 寫了一篇 Stacker News 帖子,列出了當時知道的每一個彩蛋(也是許多彩蛋的第一發現人)。最後,感謝另一些也發現了彩蛋的人:Sebastian Falbesoner、Rob Hamilton、Tom Honzik、iWarp、Jiří Jakeš、Portland.HODL、pycan、Gregory Sanders、Tomer Strolight 和 Peter Todd 。
非常感謝比特幣的開發者社區、比特幣的技術作者,以及在 Bitcoin Stack Exchange 上回答問題的人。沒有大家,這個項目是不可能完成的。我也非常感謝對這筆交易表示讚賞的人,這對我來說意義非凡。
如果你還有問題,我非常樂意回答。如果問題是其他人也能夠回答的,請考慮發到 Bitcoin Stack Exchange,這樣更有可能幫到其他讀者。
(完)