作者:Brandon Lucas,來源:BTC Study
Payjoin 是一種協議,運用一種簡單、聰明的技巧來構造比特幣交易,一石多鳥地解決了許多問題。它是設計初衷是解決比特幣最大的隱私性問題,但也可以幫助解決擴容問題,也因此可以幫助人們節約手續費。它尤其可以跟閃電網絡節點兼容,因爲它當前的設計對交易的接收方有活性要求(liveness requirement),意思是接收方在接收支付的時候必須在线(就像一個閃電節點一樣)。在未來,甚至這種要求也會消除,從而可以在離线時使用。它很容易可以集成到錢包軟件中,而且可以在支付的同時一次性开啓許多閃電通道,而且它可以被動使用,所以你完全不知情也可以享受到它的好處。Payjoin 的隱私性好處是層累的,所以即使只有一小部分人使用它,也可以讓每個人都得到隱私性上的好處。而且,也許最棒的一點是,payjoin 並不要求硬分叉或者軟分叉。它可以,而且已經用在比特幣上了,而且事實上是從比特幣軟件的第一個版本开始就可用了。
Payjoin 是 Coinjoin 的一種衍生。Coinjoin 更加古老,也需要更多的在线交互,意味着用戶必須重度參與才能使用它,這必然會降低可用性並阻止採用。不過,盡管如此,迄今爲之 coinjoin 的採用還是比 payjoin 高很多,盡管 payjoin 的好處和易用性更加明顯。對开發者來說,復雜、不明確的方向,阻止了它被錢包軟件採用。
Payjoin 已經存在了很多年了,而且,考慮到:
它具有上面提到的 許多 好處
提供被動的、不打擾的用戶界面的能力
錢包供應商集成它的容易程度
爲什么 payjoin 遲遲不見大規模採用?
尤其是,爲什么相比之下需要更多交互、更難使用、也更昂貴的 coinjoin 協議,反而得到了更多採用?
在本文中,我們會了解當前對比特幣隱私性的攻擊,從隱私性的視角看到的 payjoin 的歷史,payjoin 的工作原理以及何以它能提供這么多的好處而不需要改變比特幣,最後是當前的採用情況。如果 payjoin 可以極大地提高隱私性、可擴展性並幫助節約手續費,那么錢包爲集成它而付出小小努力就會是值得的。
爲什么隱私性對比特幣很重要
在討論 payjoin 的重要性之前,我們必須理解隱私性的重要性。如果你已經不需要我說服你,那么你可以直接跳到下一節,了解 pyajoin 的歷史和工作原理。
在西方民主國家,隱私性的極端重要性是難以言說的,因爲它的好處對人們來說似乎依然是隱形的。很難讓人信服地解釋爲什么隱私性很重要(尤其在面臨更高的成本或者更大的不便利的時候),如果他們從未感受過壞人掌握太多關於他們的信息常常會造成的糟糕後果;也可能是因爲這需要人們思考這些入侵會造成的長期後果。
當然,隱私性似乎是越來越多人在乎的東西(從理論上來說),但他們一般都很少主動去接近它,觸發障礙非常低,而且不影響便利性。因此,希望保護人們的隱私性的技術必須被設計成盡可能不需要用戶交互,而且盡可能地便利。
同質性
隱私性並不是 payjoin 可以幫助解決的唯一一個問題,但創造它的初衷就是解決這個問題。人們一直爲比特幣先天缺乏隱私性感到遺憾,比特幣社區也一直非常嚴肅地看待這個問題。比特幣的設計初衷是協助直接的一對一交易,並且是抗審查的。但是,因爲它允許追蹤未來發生的支付,所以一旦某筆資金跟某個身份關聯起來,就有可能導致歧視。這會摧毀同質性 —— 同種貨幣的某一些錢幣跟相同數量的另一些錢幣的無差別程度 —— 而同質性是良好貨幣的首要屬性。
如果买家可以被跟蹤,不僅現在由非法人員持有的錢幣會被拒絕,曾經 被用於非法用途的錢包也可以被標記出來然後被商家拒絕,不論現在的持有者是否通過完全合法的手段獲得了它們。設想一下,你手上的錢不能用來买牛奶,因爲它曾被某人用來买藥物,他們說 “你的錢不幹淨” 對你來說公平嗎?你是否應該因爲別人犯了罪而受懲罰?你又會怎么對待這些錢幣呢?你會覺得這些錢是沒有價值的,因爲持有它只會讓你的購买力受損。而且一部分錢幣(“幹淨的錢”)會比另一部分錢幣更有價值,這完全沒有道理。一塊錢就應該等於另一塊錢,不論它到底是哪一塊錢,否則這種錢幣的轉移價值的能力就會受損。
犯罪者迷思
常常有詆毀比特幣和隱私性的人說,只有犯罪者才需要隱私性。這就類似於 “如果你幹的不是壞事,拿你就沒有什么可以隱藏的”。這是很容易反駁的:
很少人愿意在網絡上直播自己洗澡和如廁的畫面。這難道是因爲這在犯罪嗎?這僅僅表明,每個人 都希望隱藏一些東西,而這種隱藏並不天然就是錯事。
更廣義地說,政府有責任爲何爲犯罪提供法律上的定義,但這種定義總是可能改變的。如果人們不能自由地擁有隱私,那他們也將不能自由地擁有任何東西,因爲(不論擁有什么都會被他人知道)他們的行爲將受到周邊的社會環境的嚴厲限制(甚至政府會直接參與限制)。即使做的是完全合法的事情,人們會被指指點點,不斷受到攻擊。隱私性是選擇性公开自我的權力。
除了這種簡單的、不證自明的離譜言論,實際上,犯罪者跟絕大多數守法的公民不一樣,他們愿意接受高昂的代價來獲取隱私性,因此,損害基本隱私性的措施對普通人的傷害遠比犯罪者大得多。即使政府利用限制隱私的措施來抓捕罪犯時做得不糟,而是 “挑挑揀揀”、有選擇性地監視公民,結局也是一樣的。如果一個公民說了當權者不喜歡的話(而且當權者不喜歡的東西可能一天一個樣),那么 TA 就會被選擇性地逮捕和傷害。
最後,對隱私性的渴望不單單是對政府越權的恐懼。它還有出於實際的,對安全性和榮譽的顧慮。如果有人能找出你有多少錢、你住在哪裏,那偷你的東西有多難呢?你想想自己要在互聯網上多少地方輸入你的地址、支付細節、照片,等等。你相信運行這些網站的每個人都會保證你的個人信息安全嗎?你不應該信任他們,因爲即使是最好的系統也有可能崩潰,犯罪者會愿意支付大筆金錢給黑客,讓他們爆破系統、盜出這些有價值的信息。
隱私性與民主制
在任何極權國家,控制公民的先決條件都是 了解 公民的言論、信息渠道以及金融活動。沒有這些了解,就無法知道要攻擊什么、叫停什么,因爲無法操縱敘事以及進一步加強控制。如果政府不能可靠地獲得這些信息,就無法隨心所欲地針對某個公民。在過去的極權社會(比如蘇聯和納粹德國)中,他們通過給人洗腦、讓人們報告自己的家庭成員在私人談話中表露出來的反對意見,腐蝕了人們的隱私性,也破話了家庭內部的信任關系。當相同的腐蝕隱私性的措施發生在貨幣上的時候,它的威力比發生在言論上還要可怕。砍斷資金來源是一種非常有效的打擊政治異見的手段。
比特幣的隱私性易受攻擊
“擁有不要浪費一場恰到好處的危機。”
—— 馬基雅維利
正是以打擊犯罪(哈馬斯(Hamas)恐怖主義襲擊)的名義,人們投機提議新的監管措施,要將比特幣中的保護隱私的方法定性爲非法措施。
在 2023 年 10 月 10 日,華爾街日報出版了一篇文章,報告稱哈馬斯通過密碼貨幣獲得了 1 億 3 千萬美金的資金。一周之後,參議院伊麗莎白·沃倫(Elizabeth Warren)給總統拜登(Biden)寫了一份公开信,敦促他在 10 月 31 日前解決他的行政分支如何回應 “恐怖主義使用密碼貨幣” 的問題,這封信就引用了華爾街日報的報道,作爲迫切需要此類監管的證據。這封信獲得了 100 位參議院議員中的 29 位以及 76 位衆議院議員的籤名。蹊蹺的是,10 月 19 日,也就是這封信發出的兩天之後,金融犯罪執法局(Financial Crimes Enforcement Network)公开了一份提議,要求爲洗錢風險而監管密碼貨幣混淆操作。該提議列出了用來混淆交易流向的方法:
“使用編程或者說算法代碼來協調、管理或者操控一筆交易的結構:這種方法涉及使用軟件來協調兩人乃至多人的交易,讓這些交易合並,從一個協調過的輸入中產生多個可能的輸出,從而混淆每一筆交易的獨特性、降低辨識出每一筆交易的相關人的概率。”
這個定義包含了 coinjoin 和 payjoin,雖然 “使用算法代碼” 這個描述範圍非常廣,足以包含任意任意交易,也因此允許任意的審查。
但華爾街日報那篇文章,爲那篇公开信提供觀點並嘗試爲這樣的監管辯護,非常糟糕地錯誤解釋了數據 —— 真正跟哈馬斯有關的實際數額只有 45 萬美元。密碼貨幣從來都不是哈馬斯的主要資金來源。哈馬斯自身也明確聲稱,他們不想通過比特幣來獲得資金,因爲比特幣是可以跟蹤的。
諷刺的是,現在被提議的監管措施,據說是爲了對付恐怖組織而提出的,但對恐怖組織的影響是最小的,而且其他想要使用比特幣和其它密碼貨幣的普通人來說影響是最大的。
毫無疑問,比特幣的隱私權之战在美國已經打響,而且可以預見,它會以對抗外國的國家安全理由爲幌子。更重要的是,從現在开始,理解比特幣上的隱私保護技術並开始使用,以打擊削弱這些技術的企圖。
“不論我們想要什么東西,都必須捍衛我們的隱私權。”
1. 比特幣交易的形式
爲了理解 payjoin 的作用以及它的工作原理,我們有必要理解比特幣交易的形式。每一筆比特幣都聯系着一些 輸入 和 輸出。輸出定義了這些比特幣發送給了哪個公鑰或者說 “地址”。而輸入定義了這筆交易的資金 “來源”,也即用來創建這筆交易(及其新輸出的)前序 輸出。一個很好的類比是我們使用不同面額的現金來付款。假設你想要給餐館支付 25 元的晚餐錢,還要給侍應生 5 元的消費,總計是 30 元(這就是你的交易要產生的輸出,兩 “份” 不同的錢,給到兩個不同的人 —— 餐館和侍應生)。
那么你要怎么支付呢?假設你手上有這么多張紙幣(也就是你的輸入):
1 張 20 元的
2 張 10 元的
5 張 5 元的
那么,在建構這筆交易的時候,你可以使用 1 張 20 元的紙幣和 2 張 5 元的紙幣,其中 1 張 5 元的單獨給侍應生:
注意一個重要的方面,也是我們拿現金來類比的不恰當之處:這裏的 20 元和 5 元會 合並 成 “一張”。這就更像是你把兩塊金子熔鑄成更大的一塊,從而可以支付所需的數量,而不是給出多個金塊。比特幣允許你分割以及合並輸入,從而產生我們想要的輸出。
你可能也會使用 2 張 10 元的和 2 張 5 元的紙幣,就像這樣:
或甚至使用 6 張 5 元的:
在我們把手上的錢花掉之前,這些單個單個的比特幣 “紙幣” 叫做 “未花費的交易輸出(UTXO)”。這個名字聽起來很奇怪,但只要你花時間想一想,你會意識到它非常准確 —— 它們是一些交易的 “結果”(輸出),而且尚未被 另一筆 交易花費。一個 尚未被花費 的交易輸出,就是你 可以花費 的輸出。因此,實際上,UTXO 就像你錢包裏的紙幣。在它們被花費之後,它們就變成了交易的輸入,然後變成了另一筆交易的輸出(別人錢包裏的現金),而且你不可能再花費它了,但是,你花過這張紙幣的 記錄 會永遠留在區塊鏈上。
跟現金不同的是,比特幣交易若要生效,就需要發送者的許可。這是通過發送者的 數字籤名 來實現的,這個數字籤名也作爲他們意圖花掉這筆資金的證據。一個有效的籤名(也即,跟 UTXO 的地址相匹配的籤名)需要展現在使用該 UTXO 的交易輸入中。籤名的存在 “解鎖” 了這個 UTXO,並表示該 UTXO 的所有者有意在這樣一筆交易中花費它。
下圖就是撰文之時得到 1 次區塊鏈確認的一筆真實交易:
可以看出,上面這筆交易花費了 1 個輸入,創建了 2 個輸出,一個表示真實的支付,而另一個則幾乎確定是作爲找零,發回給了花費者。而輸入和輸出之間的差額則是手續費,交給了挖出首次確認這筆交易的區塊的礦工。
這種 “UTXO 模式” 是非常強大的。因爲每一筆交易都有輸入和輸出,而且因爲一筆交易的輸出會變成後續的另一筆交易的輸入,最終我們會得到一個交易的鏈條,而且可以跟蹤比特幣所有權的轉移。因爲比特幣的供應量是有限的,而且 從這個事實上得出了它關鍵的 “不通脹” 特性,能夠隨時審計有多少比特幣在流通當中(或者說 “未花費”),是非常重要的,而 UTXO 模式就可以在oc。
這同時也是比特幣的隱私性問題的根源。每一筆交易都有自己的歷史。交給你的所有比特幣,以及你將它發到了什么地方,都是 容易 跟蹤的。整個系統被明確設計爲支持這種特點,雖然它沒有追蹤個體的意圖。在這個系統中,你唯一真正的籌碼是永遠不讓你的真實身份跟你的公鑰產生關聯,而這在大規模監視的時代,是非常難以做到的。
Payjoin 的歷史起源
中本聰的小錯誤
當中本聰在 2008 年出版比特幣白皮書的時候,他意識到隱私問題來源於將每一筆交易都公之於衆的要求,這與保證私密的要求相衝突。
他提出了兩個建議,以避免真實身份跟交易產生關聯:
保持公鑰匿名
不要重復使用公鑰
這都是好建議,但是,對 1)來說,很難保證我們的真實身份跟我們的支付完全隔離,除非在網上支付時具備極端的謹慎;對 2)來說,即使不重復使用公鑰,只要產生自多個密鑰的輸出在後續支付中又一起被花費,對跟蹤者來說就不難辨認哪些公鑰屬於哪個人。這些建議,即使集合在一起,也是很難做到,而且不完美的解決方案。
在這些建議之後,中本聰又犯了一個很小的錯誤,誇大了他這個系統的弱點:
“作爲一道額外的防火牆,每一筆交易都應該使用一對新的密鑰,以保證它們不會指向一個共同的所有者。一些關聯依舊是無法避免的,多輸入的交易必然會表明這些輸入都來自於同一個所有者。風險在於,如果某個公鑰的所有者曝光,這樣的關聯可能會曝光屬於同一個所有者的其它交易。”
中本聰的假設,以及我們迄今爲之展示的所有例子,都默認一筆交易的所有輸入都屬於同一個所有者。換句話說,一筆交易花費的所有 “紙幣” 都來自於你的錢包;這是一個合理的假設,但並不 必然爲真。這個假設叫做 “輸入所有權同一性线索”。對於任何交易都幾乎爲真,這也是鏈上活動監視的基礎。
Coinjoin
在 2013 年开頭,Gregory Maxwell 在 bitcointalk.org 論壇上玩了一個有趣的遊戲,他提供了一個自己的 UTXO(價值 1 BTC),還有一個他的地址,並詢問是否有人能創建一筆新的交易,使用這個 UTXO 作爲輸入。如果這樣的交易創建者給他發送的數量少於 1 BTC,等於是從他這裏拿走了一些錢;而如果發送給他超過 1 BTC,就等於是多給了他一些錢;但是,如果發給他的數量不多不少,正好是 1 BTC,那么,就等於是使用他的資金(和地址)來增加隱私性,因爲這個輸入 看起來 就仿佛是交易創建者自己的 UTXO,而實際上並不是。當 Maxwell 的一個輸出被花費、又發回給他的地址時,他提供了另一個 UTXO,這樣其他人可以繼續這個遊戲。從一家區塊鏈活動分析公司得角度看,這會讓他們以爲 Maxwell 看起來很富有!因爲他的地址是公开得,而且許多 UTXO 都被用來構造包含了這些地址的交易,所以任何分析這些交易並假設交易所有輸入都來自同一個人的分析者都會以爲 Maxwell 有很多很多比特幣(超過他實際擁有的數量),因此他的帖子的標題是:“我真的很有錢!”
當然,這個遊戲並不隱私,因爲 Maxwell 在一個公开的論壇上發布了自己的地址,但它提供了一個非常重要而且應運而生的概念。如 Maxwell 所說:
“許多人錯誤地假設如果一筆交易花費了多個地址,就表明這些地址都來自於同一個人。這在一般情形中是對的,但並不必然爲真:人們可以相互合作,一起構造一筆交易,而且有安全和免信任的方法。”
在同一年的一篇後續的帖子中,Mavwell 正式將這個想法提煉成一個概念,他稱爲 “Coinjoin”:
“在思考比特幣所有權的歷史時,你可能會將一筆花費了多個不同腳本公鑰的交易視爲匯聚這些資金的所有權,並因此假設:除非是同一個人控制着這幾個地址,不然它們怎么能一起花費呢?
[……]
這個假設是不正確的。用在同一筆交易中,並不能證明這些資金的所有權同一(雖然現狀是基本都成立),而且這就是 Coinjoin 可以實現的理由:
籤名是每個輸入一個的,即使在同一筆交易中,也是完全相互獨立的。這意味着,比特幣用戶可以一起同意花費一組輸入並產生一組輸出,然後各自分別籤名交易,然後合並他們的籤名。除非每個人都提供了自己的籤名,否則交易就無法生效,也不會被網絡接受,而且沒有人會籤名自己不滿意的交易。”
這就意味着,實際上,任意數量的人都可以合作創建交易,每人都提供和籤名自己的輸入,而 完全不必 擔心被其他人盜竊資金。
然後,他之處了 coinjoin 交易的另一個好處,就是這樣可以 批量處理 交易,從而節約手續費:你可以在你希望支付時找到其他也想發起支付的人,一起創建交易:
“同樣的想法也可以用得更隨意一些。當你希望發起一筆支付時,找到其他也想支付的人,一起創建一筆聯合支付。這樣做不僅會提高隱私性,也會讓你們的交易體積更小,因此更容易在網絡中傳播(而且手續費也會更低);額外的隱私性是一種福利。”
最後,conjoin 還是這樣一種協議,只要足夠多的人使用它,那么所有人都贏了,每個人都可以從中得到隱私性收益:
“這樣的交易跟使用常規方法創建的交易在表象上是沒有區別的。因此,只要這些交易足夠廣泛,它們甚至也會提高那些並不使用這種技術的用戶的隱私性,因爲輸入和混合不再能被當成控制權同一的有力證據。”
爲了提供一個具體的例子,假設我們找到了 3 個希望參加一次 coinjoin 的人。他們預先同意混合 0.1 比特幣,通過產生 3 個等額的輸出、使他人無法分辨這三個地址分別來自誰,他們可以得到隱私性上的好處。對於分析員來說,找零地址跟輸入的關系還是很清楚的,但這三個等額的輸出就搞不清是誰的了。
只有 3 個參與者的時候,這樣的隱私性收益並不一定很大,尤其其他參與者可能會在後續交易中將自己去匿名化(跟自己的真實身份產生關聯),但這可以讓同一筆錢通過多輪的 coinjoin 或者使用更大的匿名集來改善。
總結一下,coinjoin 是一筆使用來自多方的輸入和輸出創建的交易,這樣其他人就難以斷定哪個輸出屬於誰。
想要更深入低了解如何創建一筆 Coinjoin 交易、有哪些工具可用,可以看這個指南。
Coinjoin 是最有效也最被廣泛採用的比特幣隱私解決方案之一,但它也又一些重大缺點:
交互性:coinjoin 需要來自參與者的重度交互;他們需要同意一個相等的輸出面額,而且必須全部在一定時間內提供自己的籤名。重度交互需求會給用戶帶來摩擦,也因此阻礙了它被更多用戶採用。
中心化的協調者:Wasabi 和 Whirlpool 是當前最流行的 Coinjoin 方法。他們也爲執行的協調工作收取手續費,這些手續費並不包含爲參與交易而交給礦工的區塊確認手續費(因爲 coinjoin 交易又許多的籤名數據,因此手續費是相當高的)。Join Market 是一個非協調式服務的例子,但取舍就是需要更多的用戶交互。
需要多次參與以強化隱私性:爲了獲得更好的隱私性,通常的建議是參與多次 coinjoin(因爲單次參與可能會因爲匿名集太小而收獲甚微)。但多次參與既花時間、又增加了交互,而且還要支付更多手續費。
Coinjoin 看起來跟普通交易並不完全相同:coinjoin 交易有一個明確的、可以辨識的特徵:來自多方的多個輸入會產生多個 相同面額 的輸出。這就意味着,如果你的錢幣在你參與 coinjoin 之前已經被識別出來了,那么監視者也會直到你參與了 coinjoin。他們也許無法知道你的資金去了哪裏、你在 coinjoin 之後又做了什么,但他們知道你有多少資金,而且你參與了一次 coinjoin
顯然,由於這些局限性,coinjoin 並不是比特幣隱私的終極解決方案,尤其是對於更多想要默認隱私方案的被動用戶來說。
幾年之後,一種更好的結局方案出現了,這種方案不需要交易相關方採取 任何 額外的步驟,是直接一對一的,不需要中心化的協調者也不需要市場(因此很節約時間和金錢),而且看起來跟普通的交易沒有區別:Payjoin。
Payjoin 是由一系列更早的創新構成的,我們來看看。
BIP-21
早期比特幣的一個重要的用戶體驗(UX)提升是 BIP-21。“BIP” 是 “比特幣升級提議” 的縮寫,它包含一系列的標准,要么是要求比特幣協議的共識變更(例如,硬分叉或者軟分叉),要么是提供跟比特幣交互的有用信息和方法。
BIP-21 是一種定義 URI 用法的標准,它簡化了用戶跟比特幣交互的流程,使得用戶只需點擊一個鏈接或者掃描一個 QR 碼,就能發起支付。少數的查詢參數,例如 數額
、標籤
以及 消息
也得到了定義,所以客戶端軟件可以容易地獲取和解析它們,提供更好的用戶體驗。這裏是一個帶有一些參數的 BIP-21 URI 案例:
重要的是,這個標准是可以延展的,你可以創建自定義的查詢參數,而且可以在上面开發新的標准。舉個例子,除了比特幣地址,你還可以添加定制化的參數 lightning
,提供你在閃電網絡中的收款方式,從而用戶可以通過任一種方式給你支付:
這個強大而且靈活的 BIP 被證明在結合來自 coinjoin 的概念時相當有用。
Pay-to-Endpoint(P2EP)
我找到的最早提到 payjoin 概念的文獻來自 Blocksteam,出版於 2018 年 8 月,該文引用了產生出這個概念的一次研討會。該文將最終的想法稱爲 “Pay-to-Endpoint”,因爲它結合了 coinjoin 的概念和 BIP-21,讓交易的發送者和接收者可以合作、通過一個由接收者提供的兼容 BIP-21 的網絡端點(endpoint)爲這筆交易提供輸入。下圖就是一個由該文給出的例子,展示了由接收者提供的端點的樣子:
特別值得注意的是這裏的 p2ep
參數,其數值是一個網絡端點(在這裏是一個 .onion
地址,但也可以是簡單的 http://
地址或者任何其他兼容的網絡端點),可以向接收方的錢包發送信號表示發送者愿意嘗試 P2EP 支付。如果 P2EP 支付不成功,錢包會反饋給發送者,要求正常給某個地址支付,並且只使用發送者的輸入。
因爲輸入的貢獻是通過 P2EP 來協調的,而且不會產生 coinjoin 那樣的 “帶有污點” 的等面額輸出,所以 payjoin 交易更難識別出來。
這個想法是向正確方向邁出的一大步,但依然處於萌芽階段,沒有定型,而且需要移除一些額外的復雜性。
題外話:中本聰的 Pay-to-IP
這個想法的一種變體,叫做 “Pay-to-IP”,實際上由中本聰在 最早的一版 比特幣軟件中實現過。但是,這種辦法會帶來重大的隱私性困,所以在後續版本的比特幣軟件中被拋棄了。
Bustapay
在同一個月的晚些時候,Ryan Haver 在比特幣开發者郵件組中提出了 P2EP 的一個改進版本,並正式形成了一個 BIP,稱爲 “Bustapay”。這個版本簡化了最初的 P2EP 協議,而且爲了簡潔,移除一些復雜性,他的想法是,簡單對普及是至關重要的。
Bustapay 提議依然有一些重大的問題,需要提煉,而且協議也沒有到達應有的完善程度。但這是正確方向上的又一步,而且它爲了讓錢包集成而專注於簡潔性,是關鍵性的一步,尤其對比特幣开發者這個行動緩慢而謹慎的生態系統來說。雖然 Bustapay 從未得到推廣,但它是今天的 payjoin 提議的最後一個先驅 —— 我們已經准備好錢包集成、積極改變鏈上交易了。
Payjoin 提議
最後,在 2019 年中,Bustapay 和 P2EP 的概念被 Nicolas Forier(BTCPayServer 的創始人)和 Kukks進一步提煉和增色,形成了 BIP-78,題爲 “一種簡單的 Payjoin 提議”。
在了解了催生 payjoin 的協議的背景之後,這份提議开頭的摘要的含義和目的就十分清楚了:
“本文檔提議一種用於兩方在他們發生支付時協商一筆 coinjoin 交易的協議。”
該提議提供了比以前的方法嚴格得多的信息,指明如何在一個發送者和接收者之間構造一筆 coinjoin 交易,從而打破交易輸入所有權同一性线索,並且是簡單、靈活而且便宜的。
Payjoin 的工作原理
假設 Alice 希望給 Bob 支付 1.1 BTC,然後一個區塊鏈監視公司看到了一筆這樣的交易:
他們可能會認爲 Alice 給 Bob 支付了 0.5 BTC,然後將剩余的錢作爲找零轉給了自己,也就是這樣:
而且大多數時候,這么認爲並沒有問題!畢竟,通常情況下,找零的面額總是比較大,而且 0.5 更像一個 “整數”,更有可能用在支付中(相比於 1.1)。
他們可能也會懷疑,爲什么 Alice 用了一個沒有必要的輸入(0.8 和 0.3 這兩個輸入都是多余的),但他們永遠無法肯定這不是一筆普通的交易,也無法斷定爲什么使用了額外的輸入 —— 可能 Alice 只是在整理自己的錢包,以便日後管理。這 可能 是一筆 payjoin,但就算你這么想,哪個 UTXO 是 Alice 的、哪個是 Bob的呢?沒法知道。因爲大部分交易 都不是 payjoin,他們更有可能錯誤地認爲這不是一筆 payjoin 交易。
但是,Alice 既聰明又希望保護自己的隱私,而且她知道 payjoin,所以她請求 Bob 也爲這筆交易提供一個輸入。Bob 也同意了,所以他創建了以筆交易,花費了一個的一個(甚至多個)UTXO 作爲輸入,然後發回給 Alice。如果這筆交易對 Alice 沒有問題,那么她會廣播到網絡中。這筆交易實際上是這樣的:
只要鏈監視者假設所有輸入都來自於 Alice(就像在第一個例子中那樣,而且現在也確實是這么做的),他們關於哪些輸入屬於 Alice 和 Bob 的看法會錯得離譜!
有趣的是,Alice 和 Bob 都爲所有人提供了隱私性好處。因爲,跟 coinjoin 不同,這筆交易更像一筆普通交易,只要足夠多人使用 payjoin,監視者就無法斷定哪些交易是普通交易。在挫敗監視者的實話,Alice 和 Bob 也讓 每一筆 交易都變得有些可疑。只要足夠多的人這么做,所有的交易都會變得可疑。鏈上隱私性通常是一個數字遊戲,參與的人越多,每個人的隱私性也就越好。
在這個案例中,Alice 和 Bob 合作創建了一筆交易,用上了他們各自的輸入,以保護隱私性。當然,整個過程是可疑自動化的(而且在現實中也確實 是 自動化的)。
在 BIP-78 中,整個過程的更加正式的定義如下:
-
接收者向發送者展示一個帶有查詢參數
pj=
的 BIP-21 URI,這個參數的數值指向一個 網絡端點/服務端,人們可以向該端點發送 “部分籤名的比特幣交易(PSBT)”。這個端點可以使用 HTTPS、.onjoin 或其他任何使用身份加密的協議,例如: 發送者僅使用自己的、完全可以滿足支付需要的輸入,創建一個成型的、可以廣播的 PSBT,發送到接收者的端點。這個 PSBT 稱爲 “初始 PSBT”。
接收者修改這個 PSBT,以包含自己的輸入,並籤名自己的輸入,然後將修改後的 PSBT 發回給發送者。接收者並不修改發送者的任何輸入或者輸出。這個 PSBT 稱爲 “Payjoin 提議”。
發送者驗證這個提議,然後重新籤名自己的輸入以敲定整筆交易,最後廣播到網絡中。
不管在整個過程中的哪一步中出錯,比如接收者沒有可用來創建 Payjoin 提議的 UTXO,那么 TA 只需廣播初始 PSBT 即可,這就會是一筆普通交易。雖然這筆交易的所有輸入都來自同一個所有者,只有足夠多的人使用 payjoin,你就無法斷定兩方 沒有 payjoin,而且監視者將只能假設大家都 payjoin 了,然後找出別的辦法來跟蹤支付。
Payjoin 的諸多好處
打破更多監視线索
輸入所有權同一性假設,並不是 payjoin 可以打破的唯一一種影響隱私性的假設。BIP-78 指出了另外兩種可以用來辨識所有者的线索:
-
通過 腳本公鑰 來辨識找零:
在比特幣中,
腳本公鑰
就是 “鎖定腳本”,指定了可以花費一筆比特幣的條件。之所以稱爲 “腳本公鑰”,是因爲鎖定條件需要一個跟某公鑰(地址)相匹配的有效籤名來解鎖它。換句話說,只有控制着這個 UTXO 的關聯公鑰的私鑰的人,才能解鎖它。腳本公鑰有幾種類型,例如:P2PKH、P2WPKH、P2SH、P2TR。一般來說,錢包爲所有交易使用相同的
腳本公鑰
,因此,找零輸出(除去支付和手續費以外,發送者發回給自己的資金)將很可能跟發送者的輸入使用相同類型的腳本公鑰,而發送給接收者的輸出更有可能使用別的類型。這就意味着,在同一筆交易中使用相同腳本類型的 UTXO 可以被辨識爲可能屬於發送者,也即假設發送給接收者的輸出會是不同類型的。BIP-78 指定了一種方法,允許接收者僅使用發送者相同類型的腳本公鑰,這就打破了上述可能暴露支付輸出和找零輸出的线索。
-
通過支付數額(整數)來辨識找零和支付:
正常請胯下,給朋友支付總是會選擇整數,因爲這會自然得多。如果 Bob 要向 Alice 收費(而且他們沒有按照 “更接近整數” 的法幣價格來收取比特幣),那么他很可能會收取 0.0001 這樣的設e,而不是 0.00010231 這樣的非整數。如果交易的一個輸出是整數,那么很有可能這是支付輸出,而非整數輸出則是找零輸出(至少當前是如此)。
Payjoin 也描述了一種方法,讓接收者可以在構造 Payjoin 提議時添加額外的整數輸出,從而打破這種线索。
通過聯合更廣大的群體獲得不對稱的收益
如前所述,從隱私性的角度看,coinjoin 的一個主要缺點在於:1)coinjoin 交易跟普通交易很容易區別开來;2)很少有人會專門去做 coinjoin,而普通交易則不然。這就產生了比特幣的同質性問題,因爲很可能有些人會把 coinjoin 過的錢認爲是污染過的,因爲就是有人有這種 “追求隱私等同惡意” 的可笑想法。當然,如果 大部分交易,甚至只是一定比例的交易,都是保持隱私的,那追求隱私的交易就不顯眼了。
Payjoin 看起來就跟別的交易一樣,因此並不起眼。外部觀察者甚至沒有理由多看這樣的交易一樣,因爲它並不表現出有混淆支付和找零輸出的意圖。
因爲看起來就像別的交易,甚至採用 payjoin 的邊際收益也意味着每個人的隱私性都會更難侵犯,因爲監控的线索很快就會變得不再可靠。Adam Gibson(JoinMarket 的奠基性貢獻者,也是比特幣隱私性的專家)總結得非常好:
“即便你非常小心,這些 PayJoin 交易也跟常規支付沒有什么分別 [……] 那么,酷的事情來了:假設這種技術的微小採用也會被大家觀察到。假設 5% 的交易用到了這種方法。重點在於,沒人知道到底哪 5% 是 PayJoin 交易。這是一個偉大的成就 [……],因爲這意味着所有的支付,也包括那些並不使用 Payjoin 的支付,都獲得了隱私性上的好處!”
UTXO 整理
顯然,payjoin 及其先驅都致力於解決隱私性問題。但使用 payjoin 有一個很棒的輔助作用,BIP-78 也明說了:UTXO 整理。
中本聰提議爲每一筆收款交易使用一個心得地址,這就導致用戶的錢包會有許多 UTXO 要管理。當這些 UTXO 都被用作輸入、產生一筆新的交易時(假定着不是一筆 coinjoin 或者 payjoin 交易),這樣的交易要花掉很多手續費。因爲手續費是按照交易的體積(字節數量)來收取的(對應於作爲稀缺資源的區塊空間),所以更多輸入等價於更大的交易、更多的手續費。
需要指出的是,在 UTXO 整理時使用 payjoin 並不必然能節約手續費,因爲每個出現在鏈上的 UTXO 都仍然需要支付手續費。但是,它讓這部分手續費在一個長時間段中分散开來,並且提供了在支付的時候批量處理 UTXO 的機會。批量處理會讓 UTXO 的整理更加便宜(比起專門爲整理而發起一筆交易)。它也讓 UTXO 的關聯更加容易、更少佔用硬盤空間。此外,錢包還可以實現一種辦法,讓接收者提前指定自己想在低手續費時整理哪些 UTXO,從而讓 UTXO 的整理自動化,變得更加平滑。
閃電網絡和 Payjoin:天生一對
使用 Payjoin 开啓閃電通道
閃電網絡(LN)是一種建立在比特幣上的二層解決方案,將交易放在鏈下以實現即時、極低手續費的結算,因此極大地提高了交易的吞吐量、提升了隱私性,並允許比特幣進入新的應用場景(例如 “微支付”)。它使用了由節點之間的支付通道構成的網絡來路由支付,將資金從發起的地方轉發到目的地。這些通道要求各節點運營者與自己的通道對手鎖定一些 “流動性”(比特幣,然後這些比特幣就可以在一個節點及其通道對手之間流動)。你在一個通道中能花費多少比特幣受限於這條通道中 屬於你的一端 有多少流動性。
在維護一個閃電節點時,絕大部分的復雜性都來自於开啓這些通道以及管理各通道的流動性。新用戶的入門是最大的痛點之一,因爲涉及許多個步驟。假設 Alice 希望跟 Bob 开啓一條通道;她已經安裝好了一個全新的閃電節點,只是還沒注入資金。那么她需要做以下這些事:
發送一筆鏈上交易,爲她新創建的閃電錢包注入鏈上資金,資金數量至少要能夠开啓通道;然後等待這筆交易得到確認(至少要等待 10 分鐘)
使用她的閃電錢包軟件跟 Bob 協商一筆开啓通道的交易,並等待這筆得到確認
最起碼,Alice 必須支付兩次手續費,並爲每筆交易等待約 10 分鐘,這是很乏味的。
Payjoin 可以簡化這個過程並幫助 Alice 節約資金:Alice 可以將給閃電錢包提供資金和开啓通道在一筆交易中完成。
在這個場景中,Alice 預先配置好自己的 payjoin 接收端點,加入她要开啓的通道的細節:要鎖定多少比特幣、跟哪個對手开啓通道。然後,使用一個支持 payjoin 的 錢包,某個人(也包括 Alice)可以向端點發送一個初始 PSBT、協商一筆 payjoin 交易,而端點會完成必要的 API 調用,跟 Bob 的節點开啓一條通道。
換句話說,發送者(則這裏也可以是 Alice)跟 Alice 接收 payjoin 的端點通信、創建一筆交易,直接將資金發到 Bob 和 Alice 的 2-of-2 多籤名輸出中,從而在兩個節點之間構造一條閃電通道。這就將整個過程變成了一筆交易:
一個有趣的事情是,閃電通道的开啓和 payjoin 都有 活性 要求(雖然,至少 payjoin 不會要求很長時間),這就意味着在交易發生的時候,參與者必須全部在线。這跟鏈上比特幣交易相比是非常受限的(那只要求支付者在 支付的一刻 在线)。但是,這也讓兩套協議可以完美地結合在一起。
舉個例子,閃電網絡因爲將支付放在鏈下,所以可以很好地提高隱私性,而且可以極大地提升比特幣用作交易媒介的能力(即,真正能夠用於購买日常必需品),而且無礙於其價值存儲特性。但是,需要在鏈上开啓通道也意味着,你用於开啓通道的資金,以及跟你打开通道的人,都會在鏈上留下蹤跡。出於我們已經討論過的理由,payjoin 可以混淆並摧毀窺探者的許多线索。
這也讓事情變得更加 簡單,因爲用戶將只需發起一筆交易,而不必發起兩筆交易;變得 更快,因爲只需等待一筆交易得到確認;更 便宜,因爲只需支付一手續費。事實上,這種辦法可以一次性开啓多條通道。你可以制作一個你希望开啓通道的節點的列表,配置到一個 BIP-21 payjoin 接收端點中,然後在接收支付時一次性、自動化地全部开啓,而且只需等待一次確認、支付一次手續費。完全可以!
已經有一個項目在實現這個想法了,叫做 “Nolooking”,允許你列出一組公鑰,然後一次性 批量 打开多條閃電通道!這樣一來,Alice 不僅可以跟 Bob 开啓一條通道,還可以跟 Bob、Carol 和 Dina 开啓通道,而且 只需一筆鏈上交易!毫無疑問中,這種能力可以大大簡化閃電網絡的用戶體驗。想想就令人激動:未來的閃電錢包會默認啓用 payjoin,而 事實上 的用戶體驗就是只需選擇你的通道夥伴,只需發起一筆比特幣交易,就 完事了!你的閃電節點現在有許許多多的通道了,而且爲了开啓它們你只發起了一筆交易。這該多么令人驚訝?
很容易設想,這會簡化自主保管型閃電通道的採用。如果閃電錢包軟件可以有一個 “快速啓動” 按鈕,用戶要做的只是輸入他們想要鎖定多少比特幣(也即他們想要多少流動性)、設置一個开啓少量大小合理的通道的默認值、在路由和手續費上略微犧牲,那該多有趣。對於高級的用戶,只需提供一個 “我知道我在幹什么” 按鈕。
弱點
任何協議都有弱點,payjoin 也不例外。
一個主要的問題在於活性(聯網)要求。在當前的實現中,接收者的 payjoin 網絡服務端必須在構造交易時財險,因爲發送者和接收者要協商最終的交易(當然,這都是編程好的)。這可能會限制商家服務器以及閃電節點的採用,而他們又是唯一有激勵持續在线的人群。從用戶的角度看,如果交易能夠隨時發送,而不必管接收者的服務端在不在线,那就更好了。
另一個不太可能利用但更危險的弱點是,如果一個 payjoin 服務端(即接收者的服務端)是在一個不安全的服務器上的,那么接收者的輸出可能會在運行中(回傳給發送者之前)被篡改,導致屬於接收者的資金被盜。
不過,我們接下來會說到,人們已經提出了解決上述兩個問題的解決方案。
最後,payjoin 協議還有一個弱點是,它面臨採用上的門檻,因爲錢包必須付出开發工作來集成它。一個特別的挑战在於,理想的用戶界面應該是默認採用 payjoin 的。發送者的錢包和接收者的錢包都會直接嘗試 payjoin,而不必由用戶主動在隱私設置裏打开。最好的隱私是默認實現隱私,因爲要求用戶主動採取行動,他們可能就泄氣了。因此,若要讓 payjoin 被普通用戶採用,需要有一種他們不必費力理解的順滑體驗。錢包應該默認开啓它。記住,協議已經內置了在 payjoin 失敗時候的反應:回退成常規交易,無需用戶的手動介入。
無需服務端的 Payjoin
Dan Gould 已經爲版本 2 的 payjoin 提交了一份 BIP 草案,允許在 異步 以及無服務端的情境下完成 payjoin。這種 無需服務端的 payjoin 將解決要求接收者在接收支付時在线的問題,以及與之相關的服務端安全問題。因爲永遠在线的 payjoin 接收者服務端可能是 payjoin 的用戶採用的最大障礙,這個 BIP 的實現可能會給 payjoin 的採用以及比特幣的被動隱私帶來很大好處。
Payjoin 的採用狀況
截至 2023 年底,payjoin 的採用依然相對較少,但從 2018 年其誕生开始,也在持續增長。因爲 payjoin 在當前已經可用了,而且並不需要任何比特幣共識變更,唯一的阻礙就是編寫出能夠支持它的錢包軟件;而幫助开發者的工具每天都在進步。Payjoin Dev Kit (PDK) 是一種新的 payjoin 實現,帶有錢包可以用來集成 payjoin 的模塊。它甚至由一個 payjoin-cli 工具,你可以用命令行來創建 payjoin。這個庫是用 Rust 寫的,但允許其它語言使用它的 binding 正在开發。
錢包支持
BTCPayServer 和 JoinMarket 已經支持 payjoin 的發送和收取,雖然不是默認的。BlueWallet、Sparrow、Wasabi 和 BitMask 支持發送。少數其他錢包通過一個插件來支持它,包括 Bitcoin Core。還有活躍的 PR 試圖在 Mutiny Wallet 中集成 payjoin。這裏列出了當前的採用狀況。
Payjoin 與比特幣的未來
前面已經引用過 Adam Gibson 的說法:即使只有 5% 的鏈上交易使用 payjoin 來構造,也會對比特幣的隱私性有很大影響。我們只需越過一個門檻,就足以讓分析公司無法放心地假設他們能正確地解釋交易。一旦他們監視我們的方法被打破,那些既不了解比特幣隱私性的好處、也無意保護我們的權利的人所施加的不明智的、武斷的、惡意的限制也會變得無關緊要。
而且如我們所見,因爲 payjoin 會帶來的許多可能性,它不僅僅是一種隱私解決方案,也是一種可延展的合作式交易協議,允許節約手續費、單筆交易开啓多條閃電通道等等有趣用途。它可以爲比特幣帶來的好處是無可限量的,而且現在就能實現,無需改變比特幣自身。
那我們還等什么呢?
支持
如果你希望支持 payjoin 的开發或者作貢獻,請加入 discord、給我們捐贈或者了解 payjoin.org。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。