Vitalik 新作:隱身地址不完全指南
原文標題:An incomplete guide to stealth addresses
作者:Vitalik Buterin
編譯:Karen,Foresight News
當前以太坊生態系統中最大挑戰之一是隱私。默認情況下,進入公共區塊鏈的任何內容都是公開的,這不僅意味著資產和交易活動,還意味著 ENS 域名、POAP、NFT 和靈魂綁定代幣等。使用一系列以太坊應用就意味著你的很多活動會公開給其他任何人查看和分析。
我們需要改善這種狀況。然而,到目前為止,關於改善隱私的討論主要圍繞一個特定的用例,即:ETH 和主流 ERC20 代幣的隱私保護轉移。這篇文章將描述一種不同類別工具的機制和用例,可以在許多其他情況下改善以太坊的隱私狀態,也就是「隱身地址」(stealth addresses)概念。
隱身地址系統是什麼?
假設 Alice 想要給 Bob 轉移資產,可能是一個一定數量的加密貨幣(例如 1 ETH、500 RAI),也可能是一個 NFT。當 Bob 收到資產時,他不想讓其他人知道該筆資產的接收人是他。隱藏已經轉移發生的事實是不可能的,特別是如果轉移的是一個在鏈上僅存在一個副本的 NFT,不過隱藏誰是接收者可能更可行。
Alice 和 Bob 更想要的應該是這樣一個支付流程系統,即,Bob 向 Alice(或支持 ENS 域名)發送某種能接收付款的「地址」編碼,僅此信息就足以讓 Alice(或其他任何人)向他發送資產,而且這與目前的支付工作流程幾乎完全相同。
需要注意的是,這種隱私性與 Tornado Cash 提供的隱私完全不同。Tornado Cash 可以隱藏 ETH 或主要 ERC-20 等主流可替代資產的轉帳(經常用於私下發送給自己),但在為鮮為人知的 ERC20 轉帳添加隱私方面非常薄弱,並且根本無法為 NFT 轉帳添加隱私。
如上提到的使用加密貨幣進行支付的普通工作流程,增加了隱私性,即,沒有人能知道資產接收人是 Bob,而且工作流程未發生改變。
隱身地址是可以由 Alice 或 Bob 生成的地址,但只能由 Bob 控制。Bob 生成一個支出密鑰(spending key)並對此進行保密,然後使用該密鑰生成一個隱藏元地址(stealth meta-address)。他將這個元地址傳遞給 Alice(或在 ENS 上註冊)。Alice 可以對該元地址執行計算以生成屬於 Bob 的隱身地址。然後 Alice 可以將她想發送的任何資產發送到這個地址,Bob 將完全控制這些資產。轉移過程中,Alice 在鏈上發布了一些額外的加密數據(一個臨時公鑰),來幫助 Bob 發現這個地址屬於他。
另一種看待它的方式是:隱身地址提供與 Bob 相同的隱私屬性,為每筆交易生成一個新地址,但不需要 Bob 的任何互動。
隱身地址方案的完整工作流程如下所示:
Bob 生成他的根支出密鑰(m)和隱身元地址(M)。
Bob 添加了一條 ENS 記錄來註冊(M)為 bob.eth 的隱身元地址 bob.eth。
我們假設 Alice 知道 Bob 的地址為 bob.eth。Alice 在 ENS 上查找 Bob 的隱身元地址(M)。
Alice 生成一個只有她知道的臨時密鑰,並且她僅能使用一次(生成這個特定的隱身地址)。
Alice 使用一種算法,將她的臨時密鑰和 Bob 的元地址結合起來生成一個隱身地址。她現在可以將資產發送到這個地址。
Alice 還生成她的臨時公鑰,並將其發布到臨時公鑰註冊表(這可以在與第一個將資產發送到這個隱身地址的交易相同的交易中完成)。
為了讓 Bob 發現屬於他的隱身地址,Bob 需要掃描臨時公鑰註冊表,以查找自其上次掃描以來任何人發布的整個臨時公鑰列表。
對於每個臨時公鑰,Bob 嘗試將其與他的根支出密鑰結合起來生成一個隱身地址,並檢查該地址中是否有任何資產。如果有,Bob 計算該地址的支出密鑰並記住它。
這一切都依賴於密碼欺騙的兩種用途。首先,我們需要一對算法來生成共享密鑰(shared secret):一個算法使用 Alice 臨時密鑰和 Bob 的元地址,另一個算法使用 Bob 的根支出密鑰和 Alice 的臨時公鑰。這可以通過多種方式完成;Diffie-Hellman 密鑰交換是建立現代密碼學領域的成果之一,它恰好實現了這一點。
但是僅共享秘密遠遠不夠:如果我們只是從共享秘密生成一個私鑰,那麼 Alice 和 Bob 都可以從這個地址消費。我們還添加了一個密鑰盲化機制:在一對算法中,其中 Bob 可以將共享密鑰與他的根花費密鑰結合起來,而 Alice 可以將共享密鑰與 Bob 的元地址結合起來,這樣 Alice 就可以生成隱身地址,並且 Bob 可以為該隱身地址生成支出密鑰,所有這些都無需在隱身地址和 Bob 的元地址之間創建公共鏈接(或一個隱身地址與另一個隱身地址之間)。
使用椭圆曲线密码学隐藏地址
使用椭圆曲线密码学隐藏地址最初是由 Peter Todd 于 2014 年在比特幣背景下引入的。該技術的工作原理如下:
· Bob 生成一個密鑰(m),並計算 M = G * m,其中 G 是椭圆曲线的公認生成點。隱身元地址是(M)。
· Alice 生成一個臨時密鑰(r),並發布臨時公鑰 R = G * r。
· Alice 可以計算出一個共享密鑰 S = M * r,Bob 也可以計算出相同的共享密鑰 S = m * R。
· 一般來說,在比特幣和以太坊(包括正確設計的 ERC-4337 賬戶)中,地址是包含用於驗證來自該地址的交易的公鑰的哈希。因此,如果你計算公鑰,就可以計算地址。為了計算公鑰,Alice 或 Bob 可以計算 P = M + G * hash(S)
· 要計算該地址的私鑰,Bob 可以計算 p = m + hash(S)
這滿足了我們上面的所有要求,而且非常簡單。
甚至有一個 EIP 試圖為以太坊定義一個隱身地址標準,它既支持這種方法,又為用戶提供了開發其他方法的空間(例如,支持 Bob 擁有單獨的支出和查看密鑰,或者使用不同的密碼學來實現抗量子安全)。現在你可能會想:隱身地址並不是很難,理論知識已經扎實,採用僅是個實施細節。然而,問題在於,真正有效的實現還需要通過一些重要的實施細節。
隱身地址和支付交易費用
假設有人給你發了一個 NFT。如果你想要確保隱私,他們會將其發送到您控制的隱身地址。掃描鏈上的臨時公鑰後,你的錢包會自動發現該地址。你現在可以自由證明 NFT 的所有權或將其轉讓給其他人。但有一個問題是,該帳戶中的 ETH 餘額為 0,因此也無法支付交易費用。即使是 ERC-4337 代幣付款人也不會奏效,因為它們只適用於可替代的 ERC20 代幣。而且你不能從你的主錢包向它發送 ETH,因為那樣你就創建了一個公開可見的鏈接,也就是說沒了隱私性。
有一種簡單的方法可以解決這個問題:只需使用 ZK-SNARKs 轉移資金來支付費用。但這樣會消耗大量的 Gas,僅單次轉帳就會額外消耗數十萬 Gas。
另一種比較聰明的方法涉及信任專門的交易聚合器(MEV 術語中的搜尋者 searchers)。這些聚合器將允許用戶支付一次以購買一組可用於支付鏈上交易的「tickets」。當用戶需要在一個不包含任何其他內容的隱身地址中花費 NFT 時,他們會向聚合器提供其中一張 ticket,使用 Chaumian 盲法進行編碼。這是在 1980 年代和 1990 年代提出的集中式隱私保護電子現金方案中使用的原始協議。搜尋者接受 ticket,並重複將交易免費包含在他們的捆綁包中,直到交易在一個區塊中被成功接受。
隱身地址和分離支出和查看密鑰
假設 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,那麼 Bob 可以給他的 POAP 錢包(或者甚至是一個不太安全的 Web 界面)查看密鑰來掃描鏈並查看他的所有 POAP,而不需要給這個界面花費那些 POAP 的權力。
隱身地址和易掃描
為了更容易地掃描整個臨時公鑰集,一種技術是向每個臨時公鑰添加一個視圖標籤。在上述機制中執行此操作的一種方法是使視圖標籤成為共享密鑰的一個字節(例如,S modulo 256 的 x 坐標,或 hash(S) 的第一個字節。
這樣,Bob 只需要為每個臨時公鑰執行一次椭圆曲线乘法來計算共享密鑰,由於有了視圖標籤,也更容易進行掃描。
隱身地址和抗量子安全
上面的方案依賴於椭圆曲线,不過儘管這種方案效果很好,但不幸的是,容易受到量子計算機的攻擊。我們將需要切換到抗量子算法。有兩個自然的候選者:椭圆曲线同源和格(lattices)。
椭圆曲线同源是一種非常不同的基於椭圆曲线的數學構造,具有線性特性,可以讓我們使用與上面所做的類似的密碼技巧,但巧妙地避免了構造可能容易受到量子計算機離散對數攻擊的循環群。
基於同源密碼學的主要弱點是其高度複雜的底層數學,以及在這種複雜性下隱藏可能的攻擊的風險。一些基於同源(密碼學)的協議去年被攻擊,但其他協議仍然安全。同源的主要優勢是相對較小的密鑰大小,以及直接移植多種基於椭圆曲线的方法的能力。
A 3-isogeny in CSIDH
格(lattices)是一種非常不同的密碼結構,依賴於比椭圆曲线同構簡單的數學,並且能夠做一些非常強大的事情(例如完全同態加密)。隱身地址方案可以建立在格上,儘管設計最好的方案是一個懸而未決的問題。然而,基於格的結構往往具有更大的密鑰大小。
全同態加密,格的應用。FHE 還可以用於以不同的方式幫助隱身地址協議:幫助 Bob 外包檢查整個鏈中是否包含資產的隱身地址的計算,而無需透露他的視圖密鑰。
第三種方法是從通用黑盒原語構建隱身地址的方案。該方案的共享密鑰生成部分直接映射到密鑰交換,這是公鑰加密系統中的重要組成部分。更難的部分是讓 Alice 只生成隱身地址(而不是支出密鑰)並讓 Bob 生成支出密鑰的並行算法。
不幸的是,你無法使用比構建公鑰加密系統所需的更簡單的成分來構建隱身地址。有一個簡單的證明是,可以用一個隱身地址方案構建一個公鑰加密系統。如果 Alice 想給 Bob 加密一條消息,她可以發送 N 筆交易,每筆交易要麼發往 Bob 的一個隱身地址,要麼發往一個屬於她自己的隱身地址,Bob 可以看到他收到了哪些交易來讀取消息。這很重要,在數學證明中你不能只用哈希來做公鑰加密,而你可以只用哈希來做零知識證明,因此,隱身地址不能只用哈希來完成。
這確實是一種使用相對簡單成分的方法:零知識證明,可以由哈希和(密鑰隱藏)公鑰加密組成。Bob 的元地址是一個公開的加密密鑰加上一個哈希 h = hash(x),他的支出密鑰是對應的解密密鑰加上 x。要創建一個隱身地址,Alice 生成一個值 c,並將 Bob 可讀的 c 加密作為她的臨時公鑰發布。該地址本身是一個ERC-4337 賬戶,其代碼通過要求交易提供零知識證明來驗證交易,證明值 x 和 c 的所有權,使得 k = hash(hash(x), c)(其中 k 是賬戶代碼的一部分)。知道 x 和 c,Bob 就可以自己重建地址及代碼。
(c) 的加密不會告訴除 Bob 之外的其他任何人任何信息,並且 (k) 是一個哈希,它幾乎不會透露有關 c 的任何事情。錢包代碼本身只包含 (k),(c) 私有意味著 (k) 無法追溯到 (h)。
然而,這需要一個 STARK。最終,我認為後量子以太坊世界很可能會涉及使用許多 STARK 的應用,因此我提倡像此處描述的聚合協議將所有這些 STARK 組合成一個遞歸 STARK 以節省空間。
隱身地址和社交恢復以及多 L2 錢包
很長一段時間以來,我一直很感興趣社交恢復錢包,社交恢復錢包具有多重簽名機制,其密鑰能在機構、你的其他設備和朋友的某種組合之間共享。如若你丟失主要密鑰,絕大多數密鑰允許恢復賬戶訪問。
然而,社交恢復錢包不能很好地與隱身地址結合:如果你必須恢復你的賬戶(改變控制它的私鑰),你還必須執行一些步驟來改變你的 N 個隱身錢包的賬戶驗證邏輯,這將需要 N 筆交易,以高昂的費用、便利性和隱私成本為代價。
社交恢復和多個 L2 協議的相互作用也存在類似的擔憂:如果你在 Optimism、Arbitrum、StarkNet、Scroll、Polygon 上有賬戶,出於擴展原因有十幾個並行實例,並且您在每個實例上都有一個賬戶,那麼更改密鑰可能是一個非常複雜的操作。
更改多條鏈中多個賬戶的密鑰是一項巨大的工作。
也許你可以使用一些自動化軟件在兩週的時間跨度內以隨機間隔將資產轉移到新的隱身地址,以降低基於時間的關聯的有效性。但這遠非完美。另一種方法是在監護人之間秘密共享根密鑰,而不是使用智能合約恢復。但是,這會消除停用監護人幫助恢復您賬戶的權力的能力,因此存在長期風險。
一種更複雜的方法涉及零知識證明。這允許許多賬戶,甚至跨越許多 L2 協議,在某處(在基礎鏈上或某些 L2 上)由單個 k 值控制,其中更改該值足以更改所有賬戶的所有權,所有這些都不會洩露你的多個賬戶之間的聯繫。
結論
當前基本的隱身地址可以快速實施,並且可以顯著提高以太坊上用戶的隱私。我認為出於其他與隱私相關的原因,錢包應該開始轉向更原生的多地址模型(例如,為你與之互動的每個應用創建一個新地址可能是一種選擇)。
然而,隱身地址確實會帶來一些長期的可用性問題,例如社交恢復的困難。從長遠來看,這些問題是可以解決的,不過隱身地址生態系統看起來確實嚴重依賴於零知識證明。