廣泛採用的 Coinjoin 實現品質比較

作者:Peter Todd

來源:https://petertodd.org/2025/coinjoin-comparison

原文出版於 2025 年 7 月。

Kruw 項目請我分析和回應 Yuval “nothingmuch” Kogman 討論中心化的、基於回合的去匿名化攻擊的帖子 1,尤其是 2 對 Wasabi 錢包所用的 WabiSabi 協議的攻擊。Kogman 曾經參與 WabiSabi 的設計,但 “在它發佈之前就以離開以示抗議” 1

Kogman 聲稱,“這套軟件根本就不適合於其設計目標;如果你不願意把你的隱私信息交託給協調員,就不該使用它”。但是,Kongman 並沒有為這項意見提供一個清晰的工程基礎。所以我認為,對 coinjoin 的特性、其防止的攻擊以及當前兩大 coinjoin 實現 —— Joinmarket 和 Wasabi —— 能否防範真實世界的去匿名化攻擊,作一番安全分析,是有價值的。

免責聲明:Kruw 以我平時的開源活動諮詢價格為我的調查時間付了費;他們運行著最受歡迎的 Wasabi 協調員。我個人也使用 Wasabi,並且實際上,我正是從 Kruw 的 Wasabi 錢包收到跟這篇文章有關的支付的。

1 背景

“Coinjoin” 這個概念最早因為 Gregory Maxwell 在 2013 年的文章而變得廣為人知 3。基本原理不復雜:如果有兩個乃至更多人一起創建一筆比特幣交易,“輸入所有權同一性” 啟發式分析便會被擊敗,因為這筆交易的所有輸入事實上並非都屬於同一個人。構造 coinjoin 交易最簡單的方式便是讓已經有支付意願的兩方乃至多方將他們各自的交易中的輸入和輸出直接集中到一筆交易中。哪怕是這種簡單的方式,也能獲得少量的成本節約:各方將共享交易 “頭” 中的字節,從而總體上的交易費用降低。

然而,這種簡單技術會因為兩個重要原因而損失隱私性:

  • 外部觀察者通常可以根據輸入和輸出的金額特殊性而將它們關聯起來。
  • 參與 coinjoin 的參與者將知道哪個輸入和輸出屬於其他 coinjoin 成員。

比如說,考慮這樣一筆交易:

輸入(金額)輸出(金額)
61, 83653,467
98, 90261, 736
45, 235

如果你懷疑這是一筆非常簡單的兩方 coinjoin 交易,那麼可以合理猜測第一個輸入和第二個輸出是同一個人的,而第二個輸入中的資金則進入了第一個和第三個輸出。

上述分析使我們得出了兩種主要的威脅模型:

  1. 被動區塊鏈分析 4:攻擊者使用公開可得的區塊鏈數據,可能再結合其它數據,嘗試通過被動分析以將交易去匿名化。
  2. 主動(女巫)攻擊:攻擊者主動參與 coinjoin 交易來獲得並非公開可得的數據。我們可以假設主動攻擊者也會使用被動區塊鏈分析。

有趣的是,根據我跟 Chainalysis 及其競爭公司的在職和離職員工的私下交流,真實世界裡的區塊鏈分析實際上不屑於運行哪怕是去匿名化最簡單的 coinjoin 交易這種程度的統計學分析。實際上,他們根本不屑於運行任何合理的統計學分析:他們的產品是非常不科學的,並且基於本質上是直覺和原始的啟發式分析來給輸出 “打標籤”,而不是實際上搞清楚給定的一個輸出與某一個活動相關的概率 5。我甚至遇到過一家 Chainalysis 的競爭對手的以為創始人,在晚餐後醉醺醺地跟我說他的產品完全就是一個騙局,完全不作任何真正的分析:他的產品的真正目的是給警察抓人提供藉口,以及讓交易所能夠滿足 “AML/KYC” 的檢查要求。Chainlysis 自己也一直在極力隱藏他們的產品的真實運作方式,比如,在法庭上;很有可能 Chainlysis 的產品事實上也無法可靠地工作。

保守地看,最近的法庭文件披露了 Chainalysis 運行了一個 Tornado Cash 的轉發器,可以假設是嘗試收集 Tornado Cash 用戶的數據。雖然 Tornado Cash 是跟 coinjoin 非常不同的技術,但如果 Chainalysis 正在採取主動方法來去匿名化 Tornado Cash 的用戶,他們可能也在採取主動用法來去匿名化 coinjoin 的實現。

(譯者注:“Tornado Cash” 是一種運行在以太坊區塊鏈上的隱私強化服務;其原理是用戶們存入標準化數額的資金,在一段時間後以不記名的憑證從資金池中取出資金。)

不論如何,不管我們的敵手現在是不是騙子,我們都應該假定他們是真的有能力。

1.1 K-匿名集

隱私工具通常以 “k-匿名集” 的屬於來分析:由 $k$ 個個體組成的集合,這些個體都是匿名的、與集合中的其他人不可分辨。Coinjoin 這樣的貨幣應用額外加入了一個元素:你的資金來源的資金數額。這是特別關鍵的,如果你嘗試 coinjoin 較大額度的資金的話:更大金額的 k-匿名集 會更小,因為更少人有足夠多的資金成為這個匿名集的潛在人選。

1.2 Tor

Tor 網絡是一個洋蔥路由網絡。Coinjoin 方案使用 Tor 來形成匿名性:只要 Tor 節點遵守了自己的承諾(不保存日誌),那麼在最嚴苛的威脅模型中,Tor 也允許 coinjoin 的客戶端匿名地通信;這對 JoinMarket 的安全模式是重要的,對 Wasabi 的安全模式則是極為關鍵的。

Tor 並不是 去中心化的。雖然大量志願者們在運行個人 Tor 節點,Tor 共識自身 —— Tor 節點的列表 —— 是由一組中心化的 “目錄權威” 來維護的,他們可以獨自決定誰算或不算是一個 Tor 節點。

2. 重要的 Coinjoin 方案

只有三種重要的 coinjoin 方案是真正被實現了且當前正在運作的。它們中的每一種都使用了完全不同的方法,各有優缺點。

2.1 Payjoin

這是一種兩方的 協議,允許一個支付者(發送者)與一個收款者(接收者)創建一筆 coinjoin 交易,包含他們各自已經有意願發送的支付。這樣的交易可以擊敗輸入所有權同一性啟發式分析,因為它將支付方和收款方的錢幣都放在交易中。因為 payjoin 是一種協議,許多錢包都已經支持了它,包括我們接下來要討論的另外兩種 coinjoin 實現:JoinMarket 和 Wasabi 。

Bull Bitcoin 手機錢包是展現 payjoin 何以、何時會帶來好處的好例子。該錢包由 Bull Bitcoin 交易所開發,致力於解決兩個關鍵問題:

  1. 交易所的客戶在購買比特幣時,每次購買都會形成一個 UTXO 。Payjoin 則讓以前買到的 UTXO 可以跟最新買到的 BTC 合併,結果是,日後花費時,只需為交易提供一個輸入(也即歸集後的 UTXO),因此手續費更少,而且不影響隱私性。

  2. 在賣出比特幣時,coinjoin 交易可以通過合併一個乃至更多已有的 UTXO(跟當前賣出的 UTXO 結合)來節約交易所的手續費。此外,在未來,payjoin 將讓支付 cut-through 成為可能,可以進一步節約手續費。而且顯然,雙方都能從擴大的 k-匿名集中獲得潛在的好處。

    (譯者注:“cut-through” 的意思是不論交易過程有多複雜,最終只發布初始狀態和終局狀態。比如 n 個互有部分支付需要的個體共同參與一筆交易的創建,最終交易的輸出是各方結算之後的終局狀態,過程中的談判順序和細節都不會以交易的形式暴露出來。)

因為 payjoin 是一種兩方協議,主動攻擊就無關緊要了:與你 payjoin 的另一方一定知道交易的哪個輸入和輸出屬於你。而且,女巫攻擊也失去意義:不管怎麼說,你是在跟一個你本來就想與之交易的人 payjoin 。

在現實中,payjoin 交易通常是可以識別的,基於 “不必要輸入” 啟發式分析,也就是假設錢包軟件只會提供足以執行一筆支付的最少數量的輸入,從而猜測出支付方和收款方。這種假設 並不必然 是正確的,因為一些錢包真的會為了 UTXO 管理和隱私性而加入不必要的輸入。其次,也不是所有的 payjoin 交易都能用這種分析。 交易模式的區別,比如,比特幣交易所和典型的比特幣囤幣者的去殼,可能足以將雙方的輸入和輸出辨識出來。不過,payjoin 的手續費節約足以成為所有鏈內錢包支持它的理由。

我們不會再討論了 payjoin 了,因為它為所有鏈內錢包提供了顯然的削減手續費的好處 —— 也包括 coinjoin 錢包 —— 而沒有顯著的缺點(除了實現上的複雜性)。如果你希望在鏈內支付的對象提供了 coinjoin 的選項,那麼沒有理由 不使用 payjoin 。

2.2 JoinMarket

該協議致力於成為一個 吃單人-掛單人 協議,其中 吃單人 給一個乃至更多 掛單人 支付來提高自身的交易隱私性,辦法是讓掛單人也貢獻自己的輸入和輸出到交易中(他們可以獲得支付);吃單人也負責支付交易手續費。

如果掛單人貢獻的是隨意(價值)的輸入和輸出,那就無法提供任何隱私性提升,因為掛單人和吃單人的輸入可以很容易通過金額的匹配而識別出來。所以,相反,掛單人要貢獻跟吃單人的支付輸出 價值相等 的輸出。這背後的想法是,通過讓一筆交易擁有多個相同面額的支付輸出,我們就能得到一個包含這些輸出的一個 k-匿名集。

以下是 JoinMarket 交易的一個非常簡單的例子,是我為這筆交易而製作的,只有一個吃單人和一個掛單人,交易 ID 為 “4f11…8b7d”:

輸入(數額)輸出(數額)
148,79846,981
1,448,113100,420
1,347,800
100,420

乍看起來,這個價值 100, 420 聰的輸出擁有一個 $k = 2$ 的匿名集:這筆輸出有兩個這樣的輸出。但假設你是第一個 100, 420 聰的輸出的 收款方 。那麼考考 ,這的這筆錢是從哪裡來的?根據 JoinMarket 的工作原理,可以合理假設我是給你支付的吃單人,而交易的另一個參與者是掛單人。因為我必然是吃單人,所以我必須為這筆交易支付手續費,還要給掛單人支付費用。

有了這個假設,你可以輕鬆將我的輸入去匿名化 —— 通過合理猜測哪個輸入跟哪個找零輸出相匹配;只需一些簡單的算術:
$$
\begin{align}
148798 - 100420 - 46981 &= 1397 \
1448113 - 100420 - 1347800 &= -107
\end{align}
$$
顯然,第一個輸入來自吃單人,因為它為交易貢獻了 1397 聰的淨價值,而第二個輸入則收到了 107 聰的掛單人手續費。由於製作交易的人是我自己,所以我可以確認這是正確的。

即使我支付了 107 聰的掛單人手續費,並支付了 698 聰的區塊確認手續費,我還是沒有獲得更多的隱私性!

這個問題並不是我們這筆簡單的測試交易獨有的。在絕大部分情況下,即使使用了多個掛單人,吃單人還是可以用這種分析識別出來。問題的根源在於,JoinMarekt 是一種市場(market):吃單人和掛單人擁有完全不同的角色,因此,他們的輸入和輸出就可以根據 “吃單人要給掛單人付錢” 這個事實辨別出來。

從一定意義上說,JoinMarket 的經濟機制完全是倒退:在一種典型的情形下 —— 吃單人給多個掛單人付費 —— 掛單人也許能夠因為誘餌輸出擁有所有掛單人組成的 k-匿名集而獲得隱私性改進 6。而吃單人 —— 為這項服務支付不少費用的人 —— 通常不能獲得隱私性好處。

在我開始撰寫這篇文章的時候,我還沒有注意到這個問題。但事後發現,早在幾乎十年前,這個問題就已經在 bitcointalk 論壇上得到了具體的討論,那時候還是 JoinMarket 初次發行後不久。然而,它的重要性似乎沒有得到充分的重視。

雖然 JoinMarket 的其它方面可能還有有趣之處 —— 比如它使用了忠誠保險(fidelity bonds)以應對女巫攻擊 —— 它的主要功能並不能滿足預期。所以我們在後文中也不會再關注它;我並不推薦使用 JoinMarket,除非它重新設計。

2.3 WabiSabi 協議和 Wasabi 錢包

WabiSabi 協議是一種多步驟的 coinjoin 協議,由 Wasabi 錢包實現 7。還有一種使用 WabiSabi 協議的 BTCPay Server 插件,但它已不再維護了。除了 Wasabi 錢包,我不知道還有別的 WabiSabi 實現,所以,在這篇文章中,我將用 “Wasabi” 來指稱這條協議和 Wasabi 錢包實現。最後,雖然 Wasabi 錢包以前有一個 1.x 版本,但現在已經被棄用了,所以我們僅僅指的是它當前的 2.x 版本。

Wasabi 依賴於數額分解以在多個用戶之間實現一個 k-匿名集。存入 Wasabi 的資金的隱私性,受到一個或多個 coinjoin 回合 的保護,而一個(用戶指定的)中心化的協調員會協調多個用戶來 coinjoin 他們的資金。

為撰寫這篇文章,我創建了一個新的 Wasabi 錢包,並存入了 516, 237 聰。然後,我允許使用 Wasabi 使用 https://coinjoin.kruw.io/ 協調員來 coinjoin 這些資金,使用 “最快速度” coinjoin 策略。這裡是我參與第一個 coinjoin 回合的輸入和輸出,交易 ID 為 “7a27…47ad”:

My Inputs and Outputs for txid 7a27c793440396fd0090792e40bf0f9c981900697367391bb566725c179647ad

為了實現一個 k-匿名集,我的 Wasabi 錢包將存入的金額 解耦 為多個標準化面額的輸出 8,並讓它分散在參與同一 coinjoin 回合的其他參與者之間。比如說,我的面值為 59, 049 聰的輸出,就是該交易的 5 個不同的價值 59, 049 聰的輸出之一,這就形成了大約是 5 的 k-匿名集;而我的價值 100, 000 聰的輸出,是 14 個這樣的輸出之一,也就是位於大概是 14 的 k-匿名集中。

你可能也注意到了,表示輸出的條目左邊有個盾牌,盾牌旁邊有個數字。Wasabi 會跟蹤每一個 UTXO 的 “匿名分數”。它度量的是 Wasabi 認為每一 coinjoin 回合可以提供的 k-匿名集的大概大小 —— 並不絕對準確。你可以在 Wasabi 中為你的錢幣配置匿名分數目標,然後 Wasabi 會持續運行 coinjoin 回合,直到你所有的(可以經濟地花費的)錢幣都達到你的目標。在這個測試錢包中,Wasabi 總共運行了三輪 coinjoin,使所有的輸出都達到了目標。

wasabi-coinjoins

重要的是,匿名集分數會考慮其他參與者的總價值投入和輸出構成。比如,在交易 ef4a…62d3 中,我故意使用了一個不那麼熱門的協調員 —— 參與的用戶更少。因為缺乏其他參與者,Wasabi 將我的輸出的匿名分數計算為 1 。

wasabi-ins-outs-txid-ef4a49

因為 Wasabi 使用了中心化的協調員,只要你使用的是熱門的協調員,實現非常大的 coinjoin 交易(帶有幾百個輸入和輸出)就是比較直接地,絕大部分面額都會有十多個看起來一模一樣地輸出。在這種情況下,只要相對較少地手續費,就能實現相對較大的匿名集,所以 Wasabi 的成本效率是相當高的。與 JoinMarket 不同,因為所有參與者(除了協調員自身)都是平等參與的,沒有(已知的)方法能實現被動區塊鏈分析攻擊 ——以超過 k-匿名集內生的概率,匹配輸入和輸出。

2.3.1 回合的結構與密碼學

使用一箇中心化協調員,實現上述一切功能的一種方法是直接讓每一個參與者都告訴協調員自己希望在 coinjoin 中使用什麼輸入和輸出,然後,協調員可以構造出一筆交易,包含所有請求的輸入和輸出,讓參與者們簽名。如果 Wasabi 是這樣工作的,那麼最終的 coinjoin 交易將能抵抗被動的區塊鏈分析。其次 —— 假設每一回合都有大量的參與者 —— 那麼一個參與者通過排除法來知道哪個輸入和輸出屬於 其他哪個 參與者就很難了。

但是,你必須信任協調員會保守秘密(輸入與輸出的關聯)。這就是問題。兩方面都有明顯的理由:不僅我們更希望協調員不知道這個秘密,誠實的協調員也更希望自己壓根不知道這個秘密。

Wasabi 通過一個多階段的協議來緩解這個問題:參與者們通過一個匿名的通信機制(比如 Tor)來使用多個身份。想獲得完整的描述,你可以閱讀這個說明書。但我會總結為如下四個階段:

  1. 輸入登記:參與者們告訴協調員自己想要使用哪個 輸入,然後收到本質上是專屬於一個回合的 chaumian e-cash token(每個輸入一個)。參與者們在這個階段使用的身份是 “Alice” 這樣的假名;一般來說,就是用 Tor 來獲得匿名性。
  2. 輸出登記:使用一個新的身份,例如,通過一個新的 Tor 連接,參與者們發送自己的輸入 token 來登記自己希望在這一 coinjoin 回合中出現的 輸出
  3. 簽名:現在,協調員構造好完整的交易,每個參與者都簽名交易;這個階段要複用在 “輸入登記” 階段使用的身份。
  4. 歸責階段:如果不是所有參與者都簽名了,coinjoin 會在成功簽名的參與者之間重試。來自不簽名的參與者的錢幣會被暫時加入黑名單,以讓 DoS 攻擊成本更高。

在這裡,隱私性的保證是在輸入登記和輸出登記階段使用兩個不同的身份(集合),以及使用各回合專屬的類似於 ecash 的 token 。對抗協調員主動分析的隱私性保證重度依賴於 Tor:如果 Tor 連接可以被協調員去匿名化,協調員就能將輸入和輸出關聯起來。

3 對多方 coinjoin 方案的攻擊

出於本文的目的,我們會假設 Wasabi 所用的類似於 e-cash 的 token 的底層密碼學得到了正確實現並且被正確使用;我還不知道有人說過這個假設不能成立。相應地,我們會更加深入協調員盲化的多方 coinjoin 方案的安全模式的細節,以及 Kogman 對 Wasabi 的批評。

3.1 女巫攻擊

如果協調員無法關聯輸入和輸出,上述 coinjoin 方案能去匿名化嗎?當然!可以使用一種 “女巫攻擊”:如果一個主動攻擊者可以成功用大量的參與者身份 “沖垮” 一個 coinjoin 回合、使得這個 coinjoin 回合只有攻擊目標是真實用戶(其餘 每一個 參與者都是攻擊者控制的),攻擊者就能通過一個簡單的排除法來去匿名化這次 coinjoin 回合。

這種攻擊對於任何類型的多方開放式 —— 任何人都能成為參與者,並且可以匿名參與的 —— coinjoin 系統來說都是根本性的 9。實際上,這種攻擊甚至能 —— 在理論上 —— 應用在門羅(Monero)和 Zcash 這樣的系統中。唯一的問題在於,這樣的攻擊有多昂貴?

一筆典型的 Wasabi 回合交易 10,使用 Kruw 協調員,其體積大概是 25000vB,要支付大概 50000 聰的手續費。以當前的匯率計算,大概是 50 美元。此外,Wasabi 每天都會運行數十個 coinjoin 回合。

敵手如果想嘗試一種直接的女巫攻擊,用許多輸入和輸出來沖垮每一個 coinjoin 回合、孤立受害者,那麼可能每天都要在手續費上花費幾千甚至幾萬美元。此外,因為通常來說,每一回合都有價值數百萬美元的 BTC 被 coinjoin,所以令人信服的攻擊還需要先獲得價值數百萬美元的 BTC 來模擬。

沒有證據表明這樣的攻擊正在發生。當然,沒有政府或其他實體公開聲稱正在運行這樣的攻擊;並且,在我跟參與區塊鏈分析行業的人的私下交流中,我也完全沒有聽到有關於這樣的攻擊的說法。

諷刺的是,如果真的有這樣的攻擊,可以說它會 提升 並非攻擊目標的 coinjoin 參與者的隱私性(至少暫時會)。這意味著一些實體花費了大量資源來運行 coinjoin,只是為了把數據留給自己(至少暫時是這樣)。

3.2 針對性的女巫攻擊

那麼女巫攻擊可以便宜一些嗎?如果有協調員的參與,也許可以。在這一節,我們假設回合一致性(consistency)保持不變;下一節我們再討論回合一致性無法成立的情形。

(譯者注:此處的 “一致性” 應該使用的是分佈式系統領域的含義:在整個過程結束後,所有參與者能得到相同的結果。)

任何多方 coinjoin 方案都將使用一些類型的輸入登記機制,以及某種類型的 “回合”。如果一個攻擊者 —— 包括協調員自身 —— 可以引導不同的用戶參與不同的回合,那麼攻擊者發動女巫攻擊就會便宜得多。比如說,假設一個攻擊者一直在嘗試跟蹤一組錢幣(其中包含一個或多個錢幣),直到這組錢幣進入了 coinjoin:與其女巫攻擊所有的 coinjoin 回合,不如僅僅攻擊花費這些錢幣的 coinjoin 回合。

在 Wasabi 中,沒有 協調員的串通的話,攻擊者只能反覆嘗試加入一個又一個 coinjoin 回合,然後在發現該回合不包含目標輸入之後斷開連接。由於 Wasabi 使用了黑名單機制,這種攻擊要準備大量的錢幣,因為每加入一個無法實施攻擊的回合,都會導致一些錢幣被加入黑名、無法用於後續的回合。

因為一筆 Wasabi 交易是非常昂貴的,這種攻擊即使能成功也要付出高昂的代價:在上述我的交易中,一個女巫攻擊者若要孤立我,依然必須付出價值 140 美元的手續費,才能去匿名化我;並且,TA 還必須先能夠支配許多組價值 100 萬美元的 BTC(以參與 coinjoin 回合)。

此外,這種攻擊還有一種內在的取捨,在獲得的信息和 干擾性/偵測簡易性 之間:如果攻擊一直成功地運行女巫攻擊,以至於各個回合都只剩一位其他用戶(真實用戶),那麼攻擊者將摧毀這個協調員處的所有 coinjoin 活動。這就非常可疑!反過來,如果花費非目標錢幣的回合也能成功,那又意味著花費 目標 錢幣的回合也將包含 非目標 錢包,這就減少了從這種攻擊中獲得的信息。

有了 協調員的配合,這種攻擊所需的資本量就少得多,而且可以更成功。首先,先假設該攻擊者知道該目標想要 coinjoin 的 所有 錢幣 11

攻擊者參與每一個回合,將自己的女巫錢幣登記為輸入。如果其他參與者登記了 非目標 的錢幣,攻擊者就退出,導致沒有女巫錢幣的歸責回合。因為攻擊者跟協調員有 “合作”,這些女巫錢幣 不會 被打入黑名單,所以可以重複使用。

如果其他參與者登記了 目標 錢幣,協調員就阻止(女巫錢幣之外的) 非目標 錢幣參與同一回合。從非攻擊目標參與者的角度處,這看起來只是協調員出了臨時故障。要麼是目標錢幣在第一時間註冊了,從而產生了一個 “成功” 的回合;要麼,(如果先有非目標錢幣加入)在一個歸責回合之後,coinjoin 成功。不論是哪一種情況,最終的交易都只有女巫攻擊者和目標,從而可以輕鬆去匿名化。

這種攻擊,如果要形成一次令人信服的 coinjoin 回合,依然是昂貴的:攻擊者依然要為自己的輸入和輸出支付交易手續費。但可以用少得多的可支配資金來完成,因為黑名單不再是障礙;如果黑名單可以向其他參與者公開,檢測這種與惡意協調員串通的攻擊會更容易。

3.3 Coinjoin 失敗之後的地址複用

理想情況下,絕對不該重複使用地址。與幾乎所有錢包軟件一樣,Wasabi 使用了一種確定性錢包模式:地址是從一個種子確定性地生成出來的。然而,問題在於 “空地址限制”:在從一個種子復原一個錢包時,錢包軟件在停止掃描餘額之前允許出現的連續空地址隊列長度。

當前,如果一個 coinjoin 回合完全失敗了 —— 連歸責階段也無法產生一筆有效的交易 —— Wasabi 會在後續的 coinjoin 嘗試中使用相同的輸出地址。

那麼攻擊者可以從中知道什麼呢?假設我們有一個回合失敗了,其中有兩個乃至更多(真正的)參與者。那麼協調員和所有參與者,都在回合過程中知道了所有參與者集體想要的輸入和輸出。至於單個參與者想要的輸入和輸出(關聯),則因為有多個參與者而受到 k-匿名集的保護。

再假設,該回合失敗之後,一個或更多參與者加入了後續的一個 coinjoin 回合。除非是與上一回合完全相同的一組參與者嘗試加入後續的這個回合,不然,地址複用就會打破 k-匿名集:本回合與上一失敗回合的輸入和輸出出現了交集,就說明出現了同一位參與者,這就可以去匿名化這位參與者。

這一缺陷的修復措施就是在失敗的回合後不復用地址。截至本文撰寫之時,有一個公開的 PR,將標記用在失敗回合事件中的地址。但尚不清楚,這種做法跟空地址限制會有怎樣的相互作用。

也許可以使用一種基於 “靜默支付” 的技術來解決這個問題。這樣,用於一個 coinjoin 回合的新輸出地址,就會由交易的輸入(可能還需要 nLockTime 字段)來確定性地生成,從而,復原錢包一定是能夠做到的,不論經過過多少失敗的回合。這種做法的一個短板在於,Wasabi 確定性層級錢包的種子將跟其它所有錢包不兼容:你將 只能 在 Wasabi 錢包中找回資金。

最後,Wasabi 客戶端支持通過一個 RRC 調用在 coinjoin 回合中直接發送支付。這樣做能節約手續費(不必發送另一筆交易)。但這種特性天然容易出現我們這裡說的問題:在經歷過失敗的 coinjoin 回合之後,這樣的直接支付不換用新的地址、直接再次嘗試。話又說回來,除了這是一個高級的、只能通過 RPC 來使用、不暴露給圖形界面(GUI)的特性之外,GUI 也沒有對 coinjoin 內直接支付的匿名性作任何說明。

3.3.1 洩露所有權同一的輸入集合

避免了地址複用,並不能解決第二個(稍微小一些的)信息洩露,就是攻擊者可以知道同一所有權人的錢幣集合。出於效率,Wasabi 常常會在一個 coinjoin 回合中花費多個輸入。因此,攻擊者可以瞭解到不同錢幣屬於同一個所有權人的統計學證據。尚不清楚,在希望能夠一次性花費多個錢幣的 coinjoin 方案中,該如何完全緩解這個問題。

3.3.2 通過無效回合實現信息抽取

一種風險更大、但有可能獲得更多信息的攻擊,是這樣的:協調員可以通過使用完全無效的輸入,來假裝有很多 Alice(實際上並沒有這麼多)。這是有風險的,因為在 Wasabi 協議中,參與者們在輸出登記階段以前就能知道該回合的所有輸入 —— 為了實現最優的錢幣面額挑選,這是必要的。能夠訪問最新 UTXO 集合的參與者就能偵測出這種欺詐。不過,當前的 Wasabi 客戶端並不假設能訪問 UTXO 集,因此,還不能自動檢測出這種欺詐。

與通過失敗回合來攻擊相比,無效回合攻擊的好處是一個行為不軌的協調員可以用更低的成本,獲得關於意向輸入和意向輸出關係的更好統計信息。不過,一旦地址複用問題被修復,這種攻擊也就沒什麼威力了,因為了解到的匹配關係基本上是無用的。

3.4 攻擊回合一致性

如前所述,雖然女巫攻擊 coinjoin 回合總是有可能的,但是可以推斷這樣做會有高昂的成本,因為攻擊者必須為成功的回合(所產生的被挖出的交易)支付手續費。

但要是你不必支付這一成本呢?

如果協調員可以誘使來自不同回合的不同的參與者簽名同一筆有效交易,協調員就能重複使用其他參與者的流動性來女巫攻擊每一個參與者。Wasabi 使用一個 256 比特的 “回合 ID” 來識別回合,它是通過哈希參與該回合的所有價值來生成的。重要的是,輸入登記階段的起始時間,以及協調員的身份。這兩個信息就足以唯一地識別一個回合。此外,因為回合的所有設定(setting)都會哈希到這個回合 ID 中,如果保持了回合 ID 的一致性,協調員是無法通過行為上的差別來去匿名化不同的參與者的,因為不同回合有不同的設定。

在 coinjoin 期間,Wasabi 客戶端會定期請求所有回合的狀態。然後,在客戶端決定參與某一個回合之後,它會在與協調員互動的消息中使用該回合的 ID 。在特定情況下,比如一個回合滿員了,多個回合會並行發生;協調員可能會向不同的客戶端廣告不同的回合 ID 。

在輸入登記階段,所有的 Alice 都會發送自己的輸入的 BIP-322 所有權證據給協調員。這些所有權證據承諾了回合 ID,防止了所有權證據被重複用在其它回合中。最後,在簽名前,協調員會給每一個客戶端所有輸入的所有權證據。在客戶端收到這些所有權證據之後,它們會得到驗證

Kogman 指出的問題是,只驗證所有權證據自身是不夠的:我們還需要驗證這些所有權證據實際上與該證據意圖證明的交易輸入的腳本公鑰(scriptPubKey)一一對應。Wasabi 客戶端並不假設自己能訪問有效的 UTXO 集合,因此不會直接驗證所有權。

如果到此為止,那麼所有權證據機制是可以被 “假冒” 的所有權證據愚弄的:真正(生成證據)的公鑰並不對應於所有權證據意圖證明的交易輸入的腳本公鑰。

但是,Kogman 沒有考慮到 Taproot 簽名的工作原理:Taproot 輸入的簽名會承諾交易中所有輸入的腳本公鑰,意思是,任何假冒的所有權證據,最終都會產生一個無效的簽名(無效的交易)。這種情形只是無效輸入攻擊的另一種形式(我們在上文 3.3.2 章節已經討論過它了)。

此時,Wasabi 依然支持非 Taproot 的輸入,因為歷史上,許多服務都很晚才採用 Bech32m(Taproot)地址。幸運的是,只要一個 Wasabi 回合中有 任何一個 非攻擊者使用了 Taproot 輸入,那麼 所有 輸入都必須具有有效的所有權證據。換句話說,為了通過攻擊回合一致性來實現女巫攻擊,惡意協調員必須擁有跟回合中的所有 Taproot 輸入一樣多的真實流動性(並花費同樣比例的手續費),並且他們也只能攻擊沒有貢獻 Taproot 輸入的客戶端。

為什麼呢?因為誠實節點只會簽名一個回合 ID 。假設一個回合中有三個 Alice 參與者:Adams、Brown 和 Turner 。我們假設 Turner 擁有一個以上的 Taproot 輸入,而其他兩人只有非 Taproot 輸入。

如果這個回合要產生一筆有效的交易,協調員需要給 Adams 和 Brown 提供來自 Turner 的正確有效的所有權證據。然而,一旦協調員這樣做了,TA 就只能給所有 Alice 參與者相同的回合 ID,從而擊敗任何女巫攻擊的嘗試,因為所有 Alice 參與者都將註冊帶有相同回合 ID 的輸出;所有 Alice 的流動性都貢獻給了整體上的匿名集。

請注意,這樣的 Taproot 輸入也可以是 你的 輸入:給定你貢獻了至少一個 Taproot 輸入給 coinjoin 回合,你就可以確定,該回閤中所有誠實的流動性都會貢獻給同一個回合 ID 。現在,給 Bech32m(Taproot)地址的支付已經廣受支持了,所以 Wasabi 默認生成 Taproot 存款地址會是一個好主意;截至 v2.6.0 版本,它還沒有這樣做。話說回來,輸出地址有 50% 的概率是 Taproot 地址,這就保護了絕大部分 coinjoin,因為許多流動性都嘗試登記至少一個 Taproot 地址。

3.5 通信特徵的 k-匿名集

此前,Kogman 在一個 Github issue 中提出過登記時延的問題。雖然 Kogman 並沒有為這種批評提供一個清晰的工程基礎,但我們可以:通信特徵的 k-匿名集,在任何嘗試以不同階段身份分離來實現匿名的多方 coinjoin 方案中都是重要的。

回憶以下,Tor 提供了一種 TCP 流功能的匿名化等價物,通過固定長度的轉發信元(relay cells)來路由。現在,想象你的互聯網連接在同一個 coinjoin 回合的所有參與者中是 最慢的,慢得相等明顯。換句話說,你得互聯網連接速度並沒有 k-匿名集。這是有可能的:協調員可以通過數據交互的具體時機來檢測這種特徵,然後通過觀察輸入註冊和輸出註冊階段的這種特徵來去匿名化你的輸入和輸出。

如果 Wasabi 可以最終遷移到一種純粹基於包裹的數據匿名性方案 —— 所有通信都是通過交換原子化的包裹來實現的,其時機特徵可以完全隨機化 —— 那就好了。不幸的是,在這樣的方案中,得到了廣泛利用且信任特性類似於 Tor 的,還不存在。也許,Wasabi 可以通過增加使用隨機時延,在一定程度上優化現狀。但沒有完全基於包裹的通信方案,那麼可能最好還是在一個相對常見的互聯網連接類型中使用 Wasabi,這樣可以最大化你的 k-匿名集。異曲同工,這一問題在參與者數量更多的回合中也能得到改善,因為 k-匿名集更大。

Kogman 也指出了這個問題的一個相關版本 1:在序列化和反序列化之間有細微差別。Wasabi 利用了 JSON 序列化,它是出了名的不明確,在不同實現中都有細微的差別。再說一次,你的 k-匿名集就是有多少參與者使用 完全 相同的序列化方案。細微的差別也可能導致協調員可以將你的輸入和輸出關聯起來。

幸運的是,Wasabi 只有一種常用的實現,所以在現實中,這可能不會成為一個問題。但無論如何,Wasabi 最終應該轉型承一個完全清楚的、嚴格的二進制序列化協議。

4 結語

雖然 Wasabi 有許多方面可以提升,顯然,它是目前參與 coinjoin 的最佳選擇。支持 PayJoin 的錢包值得表揚,因為它能提供明顯的好處 如果 支付者和收款方(的錢包軟件)都支持它。不幸的是,儘管我希望能夠推薦 JoinMarket ,醜陋的事實是,在區塊鏈上留下關於錢幣來自哪裡的線索,是一個非常糟糕的錯誤,比任何理論上協調員可以付出高昂的代價、承擔風險來背叛你的信任的問題都要更加嚴重。

你想想吧:你會更希望承擔一個實體可能不值得信任、並且 TA 可以找出一種方法來繞過 Wasabi 的密碼學保護的風險嗎?還是說,你情願故意在區塊鏈內將元數據廣播給整個世界,使得現在和未來的 任何人 都能用它來去匿名化你呢?

雖然 受信任的 協調員是不受歡迎的;但 能夠 信任你的協調員,也是一種雙重保障。如果 Kruw 即使想要也不能去匿名化我的 coinjoin 交易,那當然是好事。但是,在此之上,如果有一個人類層面的好理由,認為他不會這樣做,也是好事。

JoinMarket 在第一個指標上就不滿足:在通常的用法下,你的許多交易也可以因為手續費支付缺陷而被去匿名化。但它在第二種指標上也失敗了:它完全基於經濟和幾率來挑選對手方,從而任何有閒錢的壞人都可以輕鬆成為你的對手方,然後將你去匿名化。這有點類似於如果 Tor 去中心化的話,也會變得 不那麼 安全,因為沒有任何使用人性元素來把壞人擋在外面的能力;沒有任何辦法證明你不會被記錄日誌。

Kogman 的誇張行為是告訴我們不要做什麼的好例子。……(譯者注:此段只涉及人物臧否,不譯。)

任何時候,技術都不是完美的。我自己也不是隻使用 Wasabi 。我喜歡使用 coinjoin 之後的錢幣來開啟閃電通道,並使用閃電網絡來花費我的錢。這利用了兩種非常不同的隱私性技術,從而,只有兩者都失敗了,我的隱私性才會受到影響。

5 腳註

1. [bitcoindev] 重申對中心化 coinjoin 方案(Wasabi 和 Samourai)的去匿名化攻擊, 2024-12-21 14:16, Yuval Kogman;亦見本地存檔(OTS)

2. Kogman 也批評了現已死去的 Samourai 錢包軟件所用的 Whirlpool 協議。我們不會在這篇文章中討論這個協議,因為 Samourai 錢包一直在有意變得非常不安全:它會默認洩露用戶的 xpub(拓展公鑰)。

3. Gregory Maxwell 的《CoinJoin:適合真實世界的比特幣隱私性》一文,再加上他更早的一篇《I taint rich!》帖子,讓這個概念流行起來。不過,甚至更早就有人提到了 coinjoin 的概念,例如,在 2011 年;Maxwell 也沒有把自己當成發明人。至於 “coinjoin” 這個名字,是 Maxwell 私下請我給這個觀念安一個好名字 —— 對於這個結果我非常高興!

4. Chainalysis 是一個美國的區塊鏈分析公司;“chainalysis” 在這裡就用作對這種活動的廣義稱呼。

5. 比如說,我被私下告知,Sarah Meiklejohn 在 2013 年出版的《A Fistful of Bitcoins: Characterizing Payments Among Men with No Name》聚類技術常常被區塊鏈分析公司採用。然而,該文的方法純粹是啟發式分析,而不是合理的統計學概率分析,並且一開始也不是為這些目的而設計的。

6. 這在顯示中可能是真的,如果掛單人的收費策略差異很大,因為後續交易可能會因為收取不同的手續費而將他們去匿名化。但 JoinMarket 會在一定程度上將手續費隨機化,通常能夠緩解這個問題。

7. GingerWallet 也復刻了 Wasabi 錢包的源代碼,當時 Wasabi 的中心協調員被關停了。因為 GingerWallet 似乎並沒有得到很多開發,使用量也不大,所以我們不會再討論。

8. 5000, 6561, 8192, 10000, 13122, 16384, 19683, 20000, 32768, 39366, 50000, 59049, 65536, 100000, 118098, 131072, 177147, 200000, 262144, 354294, 500000, 524288, 531441, 1000000, 1048576, 1062882, 1594323, 2000000, 2097152, 3188646, 4194304, 4782969, 5000000, 8388608, 9565938, 10000000, 14348907, 16777216, 20000000, 28697814, 33554432, 43046721, 50000000, 67108864, 86093442, 100000000, 129140163, 134217728, 200000000, 258280326, 268435456, 387420489, 500000000, 536870912, 774840978, 1000000000, 1073741824, 1162261467, 2000000000, 2147483648, 2324522934, 3486784401, 4294967296, 5000000000, 6973568802, 8589934592, 10000000000, 10460353203, 17179869184, 20000000000, 20920706406, 31381059609, 34359738368, 50000000000, 62762119218, 68719476736, 94143178827, 100000000000 以及 137438953472 聰,這些數值是被精心選擇的,以儘可能減少分解常見的數額所需要的平均 UTXO 數量。

9. 一種 封閉 的 coinjoin 方案可以通過限制 coinjoin 參與者到一個已知實體的範圍來防止女巫攻擊。

10. 關於 Wasabi 回合的統計數據已由 WabisatorLiquiSabi 以及其它項目收集和發佈。

11. 這是最糟糕的情況。如果攻擊者 並不知道 攻擊目標希望參與 coinjoin 的所有錢幣,攻擊將是可見的,因為一些錢幣將在輸入登記階段神秘地登記失敗。

來源
免責聲明:以上內容僅為作者觀點,不代表Followin的任何立場,不構成與Followin相關的任何投資建議。
喜歡
收藏
評論