Vitalik Buterin:隐身地址的不完全指南

Vitalik Buterin:隱身地址的不完全指南

BroadChainBroadChain2023/01/24 下午12:34
此內容由 AI 翻譯
摘要

從長遠來看,隱身地址生態系統看起來確實嚴重依賴於零知識證明。

原文作者:Vitalik Buterin

編譯:DeFi 之道

特別感謝 Ben DiFrancesco、Matt Solomon、Toni Wahrstätter 和 Antonio Sanso 提供的寶貴意見與審閱。

隱私問題,是以太坊生態系統面臨的最大挑戰之一。預設情況下,所有上鏈資訊都是公開的。這不僅包括金錢與金融交易,也涵蓋了日益增多的 ENS 域名、POAP、NFT、靈魂綁定代幣(Soulbound Token)等。實際上,使用整套以太坊應用程式,就意味著將你生活中的重要部分公開展示,任人檢視與分析。

如何改善這種狀況,已是公認的重要議題。然而,截至目前,關於隱私改善的討論大多集中在一個特定用例上:ETH 與主流 ERC-20 代幣的隱私保護轉帳(通常是轉給自己)。本文將介紹另一類工具的機制與應用場景,它們能在更多情境下提升以太坊的隱私性:隱身地址(Stealth Address)。

什麼是隱身地址系統?

假設 Alice 想送 Bob 一項資產。這可能是一筆加密貨幣(例如 1 ETH、500 RAI),也可能是一個 NFT。Bob 收到資產時,不希望全世界都知道是他收的。要完全隱藏轉帳事實本身很困難,尤其是像 NFT 這種鏈上僅有一份的資產;但隱藏接收者的身份則相對可行。Alice 和 Bob 都希望支付流程能像現在一樣簡單。Bob 只需向 Alice(或在 ENS 上註冊)提供一個「地址」編碼,說明如何向他付款;僅憑這個資訊,Alice(或任何人)就能向他發送資產。

請注意,這與 Tornado Cash 等工具提供的隱私有所不同。Tornado Cash 擅長隱藏 ETH 或主流 ERC-20 代幣等可替代資產的轉帳(儘管最常用於私下轉帳給自己),但很難為不常見的 ERC-20 代幣轉帳提供隱私,更無法為 NFT 轉帳添加隱私。

Vitalik Buterin:隱身地址的不完全指南

使用加密貨幣支付的常見流程。我們希望在維持流程不變的前提下,增加隱私性(讓外人無法得知是 Bob 收到了資產)。

隱身地址正好能滿足這個需求。隱身地址可以由 Alice 或 Bob 生成,但最終只由 Bob 控制。Bob 生成並保管一個支出密鑰(spending key),並用這個密鑰生成一個隱形元地址(stealth meta-address)。他將這個元地址交給 Alice(或在 ENS 上註冊)。Alice 可以對這個元地址進行運算,生成一個屬於 Bob 的隱形地址。接著,她就能將任何資產發送到這個地址,而 Bob 將完全掌控這些資產。在轉帳的同時,她會在鏈上發布一些額外的加密資料(一個臨時公鑰),幫助 Bob 識別出這個地址屬於他。

換個方式理解:隱身地址能達到與 Bob 為每筆交易手動生成新地址相同的隱私效果,但完全不需要 Bob 進行任何額外操作。

隱身地址方案的完整工作流程如下:

Vitalik Buterin:隱身地址的不完全指南

 1. Bob 生成自己的根支出私鑰(m)與隱形元位址(M)。

 2. Bob 在 ENS 上新增一筆記錄,將 M 註冊為 bob.eth 的隱形元位址。

3. 假設 Alice 知道 Bob 就是 bob.eth。她透過 ENS 查詢到 Bob 的隱形元位址 M。

 4. Alice 生成一個僅自己知道、且僅使用一次的臨時私鑰(用於產生這個特定的隱形位址)。

 5. Alice 運用一種演算法,將她的臨時私鑰與 Bob 的元位址結合,產生一個隱形位址。接著,她就能將資產發送到這個位址。

 6. Alice 同時也會生成對應的臨時公鑰,並將其發布到臨時公鑰註冊表(這個動作可以和第一筆交易——也就是將資產發送到該隱形位址的交易——在同一次操作���完成)。

7. 為了找出屬於自己的隱形位址,Bob 需要掃描臨時公鑰註冊表,取得自上次掃描以來,任何人因任何目的所發布的所有臨時公鑰清單。

8. 針對每一個臨時公鑰,Bob 嘗試將其與自己的根支出私鑰結合,以生成一個隱形位址,並檢查該位址內是否有資產。如果發現資產,Bob 就會計算出該位址的支出私鑰並妥善保存。

上述所有步驟都依賴於密碼學「混淆」(cryptographic obfuscation)的兩種應用。首先,我們需要一對能夠生成共享密鑰的演算法:其中一個演算法使用 Alice 的秘密資訊(她的臨時私鑰)和 Bob 的公開資訊(他的元位址),另一個則使用 Bob 的秘密資訊(他的根支出私鑰)和 Alice 的公開資訊(她的臨時公鑰)。這個目標可以透過多種方式實現;奠定現代密碼學基礎的 Diffie-Hellman 密鑰交換,正是實現此功能的經典方法。

但僅有共享密鑰還不夠:如果我們直接用共享密鑰生成一個私鑰,那麼 Alice 和 Bob 兩人都能從該位址提取資金。我們當然可以就此打住,讓 Bob 再把資金轉移到新位址,但這樣做效率低下,且不必要地降低了安全性。因此,我們額外加入了一套密鑰盲化(key blinding)機制:透過一對演算法,Bob 可以將共享密鑰與其根支出私鑰結合,而 Alice 則可以將共享密鑰與 Bob 的元位址結合。這樣一來,Alice 能生成隱形位址,Bob 也能為該隱形位址生成支出私鑰——所有這些操作,都不會在隱形位址與 Bob 的元位址之間(或任意兩個隱形位址之間)建立公開的關聯。

基於橢圓曲線密碼學(ECC)的隱形位址

基於橢圓曲線密碼學(ECC)的隱形位址,最初由 Peter Todd 於 2014 年在比特幣(BTC)的背景下提出。該技術的運作原理如下(此處假設讀者已具備橢圓曲線密碼學的基本知識;可參考這裡這裡這裡的教學):

• Bob 生成一個私鑰 m,並計算 M = G * m,其中 G 是橢圓曲線上約定俗成的生成點(generator point)。隱形元位址就是 M 的編碼形式。

• Alice 生成一個臨時私鑰 r,並發布其臨時公鑰 R = G * r。

• Alice 可以計算出共享密鑰 S = M * r,而 Bob 則可以計算出相同的共享密鑰 S = m * R。

• 一般來說,在比特幣(BTC)和以太坊(ETH)(包括設計正確的 ERC-4337 帳戶)中,位址是由用於驗證該位址交易的公鑰經過雜湊(hash)後得到的。因此,只要算出公鑰,就能推導出位址。為了計算公鑰,Alice 或 Bob 可以計算 P = M + G * hash(S)。

• 要計算該位址的私鑰,則只有 Bob(且僅有 Bob 一人)可以計算 p = m + hash(S)。這個方法滿足了前述所有需求,而且極為簡潔!

目前甚至有一項以太坊改進提案(EIP)正嘗試為以太坊(ETH)定義隱形位址標準,該提案既支援上述方法,也為使用者保留了開發其他方法的空間(例如,支援 Bob 擁有獨立的支出私鑰與檢視私鑰,或採用不同的密碼學方案以實現抗量子安全性)。看到這裡,你可能會想:隱形位址並不困難,理論基礎已經很穩固,實際應用只是實作細節問題。然而,一個真正有效的實作,必須克服若干重大的實作挑戰。

隱身地址與交易手續費支付

假設有人送你一個 NFT。為了保護你的隱私,對方會將 NFT 發送到一個由你控制的隱身地址。你的錢包掃描鏈上的臨時公鑰後,就能自動發現這個地址。現在,你可以自由證明對該 NFT 的所有權,或將其轉讓給他人。但這裡有個問題:這個地址裡沒有 ETH,因此無法支付交易手續費。即使是 ERC-4337 代付機制也幫不上忙,因為它只適用於 ERC-20 這類可替代代幣。你也不能從主錢包直接轉 ETH 到這個地址,否則就會在鏈上留下公開的關聯記錄。

在文章裡插入 2017 年(或更早)加密貨幣騙子的迷因,是作者展現資歷與專業的一種技巧;這表示他們在這個圈子裡待了很久,眼光獨到,不會輕易被 SBF 這類人物矇騙。

有個「簡單」的解決方案:直接用 ZK-SNARKs 轉帳來支付手續費!但這樣做會消耗大量 gas,一次轉帳就可能需要額外幾十萬 gas。

另一個更聰明的辦法,是借助專業的交易聚合器(MEV 領域稱之為「搜尋者」)。這些聚合器允許用戶一次性購買一組用於支付鏈上交易的「票券」。當用戶需要在一個沒有任何其他資產的隱身地址中轉移 NFT 時,他們可以向聚合器提供一張經過 Chaumian 盲簽方案處理的票券。這個協議源自 1980 至 1990 年代提出的中心化隱私電子現金方案。搜尋者接受這張「票券」,並持續將該交易免費打包,直到交易被某個區塊確認。由於涉及的金額很小,僅用於支付手續費,因此相較於「完整」的中心化隱私電子現金系統,其信任和監管風險要低得多。

隱身地址:支出密鑰與查看密鑰的分離

假設 Bob 不希望只有一個能執行所有操作的主「根支出密鑰」,而是想將根支出密鑰和查看密鑰分開。查看密鑰可以查看 Bob 的所有隱身地址,但無法從中動用資產。

在橢圓曲線的框架下,可以透過一個簡單的密碼學技巧實現:

• Bob 的元地址 M 現在表示為 (K, V),編碼為 G * k 和 G * v,其中 k 是支出密鑰,v 是查看密鑰。

• 共享密鑰現在是 S = V * r = v * R,其中 r 仍是 Alice 的臨時私鑰,R 仍是 Alice 發布的臨時公鑰。

• 隱身地址的公鑰為 P = K + G * hash(S),私鑰為 p = k + hash(S)。

請注意,第一個巧妙的密碼學步驟(生成共享密鑰)使用了查看密鑰,而第二個步驟(Alice 和 Bob 各自生成隱身地址及其私鑰)則使用了根支出密鑰。

這有許多應用場景。例如,如果 Bob 想接收 POAP,他可以將查看密鑰交給 POAP 錢包(甚至是一個安全性較低的網頁介面),讓這個介面掃描區塊鏈並查看所有 POAP,而無需授予它花費這些 POAP 的權限。

隱身地址與更高效的掃描

為了更輕鬆地掃描所有臨時公鑰,一種技術是為每個臨時公鑰附加一個「視圖標籤」。在上述機制中,實現方式之一是讓視圖標籤成為共享密鑰的一個位元組(例如,S 的 x 座標模 256,或 hash(S) 的第一個位元組)。

這樣一來,Bob 只需對每個臨時公鑰執行一次橢圓曲線乘法來計算共享密鑰,而需要進行完整地址生成與驗證這類複雜計算的頻率,將降低到只有 1/256。

隱身地址與抗量子安全性

上述方案依賴於橢圓曲線,雖然目前表現良好,但不幸的是容易受到量子電腦的攻擊。一旦量子電腦成為現實威脅,我們就必須轉向抗量子演算法。目前有兩個主要的候選方案:橢圓曲線同源與格密碼學。

橢圓曲線同源(Isogeny)是一種與橢圓曲線相關但本質不同的數學結構,具有線性特性。這讓我們能運用類似的密碼學技巧,同時巧妙地避開構建可能易受量子電腦離散對數攻擊的循環群。

同源密碼學的主要弱點在於其底層數學極度複雜,而這種複雜性可能隱藏潛在的攻擊風險。去年,部分基於同源的協議已被攻破,但其他協議目前仍保持安全。它的主要優勢則在於相對較小的金鑰尺寸,以及能直接沿用許多現有的橢圓曲線方法。

Vitalik Buterin:隱形地址的不完全指南

CSIDH 中的 3-同源性,來源在此處。

格(Lattices)則是另一種截然不同的密碼學結構,其依賴的數學遠比橢圓曲線同源簡單,且能實現一些極為強大的功能,例如全同態加密(FHE)。隱形地址方案也能建構在格之上,儘管如何設計出最佳方案仍是待解的難題。然而,基於格的結構往往伴隨著較大的金鑰尺寸。

Vitalik Buterin:隱形地址的不完全指南

全同態加密(FHE)是格的一項重要應用。FHE 也能以另一種方式協助隱形地址協議:幫助 Bob 將「檢查整條鏈中是否包含某個隱形地址資產」的計算任務外包出去,同時無需透露其檢視金鑰(view key)。

第三種方法是利用通用黑盒原語(generic black-box primitives)來建構隱形地址方案。這些原語是許多人早已因其他需求而使用的基本元件。方案中共享密鑰生成的部分,可以直接對應到金鑰交換(key exchange)——這正是公鑰加密系統的核心組成之一。更具挑戰性的部分,在於設計一套並行演算法:讓 Alice 僅生成隱形地址(而非支出金鑰),同時讓 Bob 生成支出金鑰。

遺憾的是,你無法僅使用比建構公鑰加密系統更簡單的元件來實現隱形地址。這裡有一個簡明的證明:你可以利用隱形地址方案反過來建構出一個公鑰加密系統。如果 Alice 想向 Bob 加密一條訊息,她可以發送 N 筆交易,每筆交易要麼發往 Bob 的一個隱形地址,要麼發往一個她自己的隱形地址;Bob 則可以透過觀察自己收到了哪些交易來解讀訊息。這一點至關重要,因為已有數學證明指出:你無法僅靠雜湊函數(hash)實現公鑰加密,但卻可以僅用雜湊函數實現零知識證明。因此,隱形地址不可能單靠雜湊函數完成。

這裡有一種確實採用相對簡單元件的方法:零知識證明,它可以由雜湊函數與(密鑰隱藏型)公鑰加密共同組成。Bob 的元地址(meta-address)包含一個公開加密金鑰,以及一個雜湊值 h = hash(x);其支出金鑰則是對應的解密金鑰加上 x。為了創建一個隱形地址,Alice 生成一個值 c,並將 c 加密後作為臨時公鑰發布(此加密內容只有 Bob 能讀取)。該地址本身是一個 ERC-4337 帳戶,其合約程式碼透過要求交易方提供零知識證明來驗證交易,證明交易方同時擁有 x 與 c,使得 k = hash(hash(x), c)(其中 k 即為帳戶合約程式碼)。只要掌握 x 和 c,Bob 就能自行重建該地址及其合約程式碼。

Vitalik Buterin:隱形地址的不完全指南

c 的加密內容不會向 Bob 或任何其他人洩露資訊;而 k 是一個雜湊值,因此幾乎不會洩露關於 c 的任何資訊。錢包合約程式碼本身只包含 k,c 則是私密的,這意味著 k 無法追溯回 h。

然而,此方法需要依賴 STARK,而 STARK 的證明體積通常較大。最終,我認為後量子時代的以太坊生態系很可能會廣泛採用 STARK;因此,我提倡使用本文所述的聚合協議,將所有這些 STARK 整合為單一的遞迴 STARK,以節省空間。

隱形地址、社交恢復與多 L2 錢包

長久以來,我一直是社交恢復(social recovery)錢包的支持者。這種錢包採用多重簽署機制,將金鑰分散儲存在機構、你自己的其他裝置以及朋友之間;只要取得其中大多數金���,就能恢復對帳戶的存取權,除非你遺失了主金鑰。

然而,社交恢復錢包與隱形地址難以完美整合:如果你必須恢復帳戶(即變更控制帳戶的私鑰),你還需要執行額外步驟,更新你 N 個隱形錢包的帳戶驗證邏輯。這將耗費 N 筆交易,帶來高昂的手續費、操作不便以及隱私成本。

社交恢復功能與多個第二層協議(L2)之間的互動,也存在類似問題:假設你在 OptimismArbitrum、Starknet、Scroll、Polygon 上都擁有帳戶,而其中一些 Rollup 為了擴容需求,可能設有十幾個平行實例,你在每個實例上都有一個帳戶。那麼,更換私鑰將會是一項極其繁瑣的操作。

要在多條鏈上的多個帳戶中更換金鑰,無疑是一項大工程。

一種方法是接受「恢復操作極為罕見」的事實,並容忍其高昂的成本與繁瑣的流程。你也可以借助自動化工具,在兩週內以隨機間隔將資產轉移到新的隱蔽地址,以降低基於時間的關聯分析效果。但這種方法並不完美。另一種方法,則是將根私鑰在監護人之間秘密共享,而非透過智能合約進行恢復。然而,這會讓你失去隨時撤銷監護人恢復權限的能力,從而帶來長期風險。

更複雜的方法則涉及零知識證明(ZKP)。我們可以修改前述基於 ZKP 的方案邏輯:帳戶不再直接持有 k = hash(hash(x), c),而是持有鏈上某個位置(對應於 k 值)的承諾(commitment)。當從該帳戶支出時,你需要提供一份零知識證明,同時證明:(i)你知道鏈上與該承諾匹配的位置;(ii)該位置儲存的值包含某個 k 值(你無需揭露它),並且你掌握一組 x 與 c,滿足 k = hash(hash(x), c)。

這種設計允許多個帳戶——甚至橫跨多個第二層協議——由單一的 k 值統一控制(這個 k 值可以存放在基礎鏈或某個 L2 上)。只需更改這一個數值,就能同步更新所有帳戶的所有權,且整個過程不會洩露各帳戶之間的關聯。

結論

基本的隱身地址(Stealth Address)技術如今已能相當快速地部署,並能顯著提升以太坊(ETH)上用戶的實際隱私水準。當然,這需要錢包端投入一些開發工作來提供支援。話雖如此,我認為出於其他隱私考量,錢包也應逐步轉向更原生的多重地址模型(例如,為你交互的每一個應用分別創建新地址,就是一種可行方案)。

然而,隱身地址確實會引發一些長期可用性問題,例如社交恢復的困難。目前可以暫時接受這些問題,例如:承認社交恢復會伴隨一定程度的隱私損失,或接受需要延遲兩週、以緩慢方式將恢復交易發布到各類資產(此流程可交由第三方服務處理)。長期來看,這些問題確實有解決方案;但整體而言,隱身地址生態系統的未來發展,高度仰賴零知識證明(ZKP)技術的成熟與普及。