newsence

GhostPool:在加密內存池准入中隱藏身份關鍵元數據

ethresear.ch·27 天前

GhostPool 引入了一種協議,透過零知識證明和作廢標記在加密內存池中隱藏發送者與隨機數資訊,同時保留執行動態准入檢查的能力。

摘要

加密內存池(Encrypted mempools)在交易被納入區塊前隱藏了交易內容,但通常不會隱藏身份關鍵的准入元數據。在許多設計中,准入路徑仍然會暴露諸如**發送者(sender)隨機數(nonce)**等字段——或起到同樣實際作用的公開信封簽名者——因為這些字段是實現動態內存池檢查的基礎。

如果隱藏了發送者和隨機數而沒有替代方案,節點將失去評估隨機數和償付能力所需的信息。准入將變得「盲目」。

GhostPool 通過以下方式取代公開的 (sender, nonce) 准入檢查:

  • 針對加密交易的根綁定零知識准入證明(root-bound zero-knowledge admission proof)

  • 密文到載荷的承諾綁定(ciphertext-to-payload commitment binding)

  • 以及跨越加密交易和明文交易的共享作廢號命名空間(shared nullifier namespace)

主要構建基於標準賬戶模型,其中隨機數的穩定性提供了最清晰的正確性論證,且協議自然支持隊首隨機數(head-of-line nonce)。GhostPool 保持網絡層來源和經濟元數據(如 Gas 限制和費用參數)不變。它是一個准入層協議,可與各種加密內存池設計組合,例如 Shutter 風格的門限加密多方延遲加密用於待處理交易隱私的批量門限加密,以及最近的 公開信封加密內存池提案


1. 導言

1.1 加密內存池隱藏載荷,而非准入元數據

加密內存池現在是一個廣泛的設計空間,而非單一提案。示例包括門限加密內存池公開信封加密內存池,以及基於多方延遲加密批量門限加密的學術提案。

在這些方法中,主要目標通常是隱藏交易內容,直到協議定義的解密點。通常保持暴露的是准入接口,以及隨之而來的身份關鍵元數據,如發送者和隨機數。

這正是 GhostPool 目標所在的層次。

只要發送者和隨機數保持可見,加密內存池就能保留動態准入檢查,但也保留了賬戶級別的洩漏。例如,目前的通用原生加密內存池提案保留了一個具有自身費用支付和隨機數語義的公開信封,並不以用戶隱私為目標。GhostPool 解決了互補的問題:私密准入

1.2 驗證盲目性

接收交易的節點必須至少檢查四件事:

  • 格式:信封結構、字段大小、有效的編碼

  • 授權:來自發送者的有效簽名

  • 隨機數:交易指向發送者的下一個可用隨機數

  • 償付能力:賬戶能夠支付交易的最壞情況成本

前兩項是靜態的。後兩項是動態的:它們需要通過發送者索引進行賬戶查詢。

這產生了一個直接的權衡:

  • 如果發送者和隨機數保持可見,節點可以保留動態准入檢查,但加密提交仍會洩漏賬戶級別的活動。

  • 如果隱藏發送者和隨機數且沒有替代方案,節點將完全無法執行隨機數或償付能力檢查。

我將這種失效模式稱為驗證盲目性(validation blindness)

這與更為人熟知的內存池 DoS 文獻不同,後者研究的是在交易身份和價格已可見的情況下的准入、驅逐和鎖定攻擊。GhostPool 的問題更簡單也更基礎:在私密准入下,除非進行加密替換,否則動態檢查本身會消失。

1.3 協議聲明

GhostPool 通過以下替代方案解決了私密隊首准入的驗證盲目性:

  • 一個根綁定零知識准入證明

  • 通過公開載荷承諾實現的密文綁定

  • 以及一個共享作廢號命名空間,用於追蹤加密交易和明文交易的隨機數插槽消耗。

該協議首先在標準賬戶模型中闡述,在該模型中隨機數穩定性論證最為簡單,且追蹤的插槽即為原生賬戶隨機數。在這種設置下,發送者和隨機數可以從明文加密准入路徑中移除,而不會重新引入驗證盲目性。

協議刻意專注於:

  • 隊首隨機數

  • 能夠驗證密文載荷承諾的加密內存池格式,

  • 以及公開的費用/Gas 元數據。

第 7 節討論了更廣泛的賬戶模型以及 GhostPool 未隱藏的剩餘元數據。


2. GhostPool 概覽

對於標準賬戶模型,GhostPool 依賴於一個簡單的單調性事實:

如果自證明生成以來,賬戶的隨機數未發生變化,那麼其餘額只能保持不變或增加。

因此,償付能力證明不需要在每個新區塊都重新生成。只需要保持相關的隨機數插槽未被消耗即可。

GhostPool 通過為每個 (account, nonce) 對分配一個確定性的作廢號(nullifier),將過期證明問題轉化為插槽追蹤問題,且無需在加密准入路徑中暴露賬戶。

圖 1. GhostPool 用根綁定證明加插槽作廢號取代了公開的 (sender, nonce) 准入檢查,從加密准入路徑中移除了發送者/隨機數,而不會重新引入驗證盲目性。


3. 協議

3.1 信封格式

提交的加密交易採用**信封(envelope)**形式:

E = (\texttt{ciphertext},\ \texttt{payload_commitment},\ N,\ \pi_{\text{leaf}},\ \texttt{ref_root},\ \texttt{public_meta})

其中:

  • ciphertext 是加密的載荷,

  • payload_commitment 是對隱藏載荷的公開承諾,

  • N 是規範作廢號,

  • \pi_{\text{leaf}} 是葉子證明(leaf proof),

  • ref_root 是生成證明時所依據的精確狀態根,

  • public_meta 包含非私密的傳輸和池管理字段。

在基礎構建中,public_meta 還包含為了打包和排序而有意保持明文的執行相關字段,例如:

  • gas_limit,

  • max_fee_per_gas,

  • max_priority_fee_per_gas,

  • 以及任何過期或路由提示。

GhostPool 不要求最新的狀態根。它要求一個精確的根和一個有界的時效性規則。

3.2 葉子證明

葉子證明 \pi_{\text{leaf}} 在不洩露發送者或隨機數的情況下證明以下內容:

  • 授權:隱藏交易由與隱藏賬戶對應的有效密鑰簽名。

  • 隨機數有效性:賬戶的鏈上隨機數等於交易中使用的隱藏隨機數。

  • 償付能力:賬戶餘額足以支付交易聲明的最壞情況執行成本,即其價值加上從公開 Gas 和費用字段派生的費用上限。

  • 公開字段一致性:任何有意保持明文的執行相關字段與隱藏交易的相應字段匹配。

  • 作廢號綁定:公開作廢號 N 是從相同的隱藏密鑰和隱藏隨機數正確派生的。

  • 載荷承諾綁定:隱藏交易承諾於公開的 payload_commitment。

  • 錨點綁定:所有狀態見證均針對精確的 ref_root 進行證明。

該證明針對固定狀態根建立了授權、隨機數有效性、償付能力和插槽綁定。時效性和在最新基礎費用下的當前可納入性仍是由證明之外評估的內存池策略決定。

對於以太坊風格的費用語義,自然的證明陳述是使用交易聲明的費用上限進行最壞情況成本限制,而不是關於在最新基礎費用下當前可納入性的主張。

3.3 密文綁定

僅有有效的證明是不夠的。節點還必須知道證明所指的隱藏交易與公開密文是同一個。

GhostPool 將此綁定分為兩部分:

  • 證明內部:隱藏交易 \rightarrow payload_commitment

  • 加密層內部:密文 \rightarrow payload_commitment

因此,封裝加密內存池格式必須為密文驗證載荷承諾——例如通過關聯數據(associated data)、認證包裝或等效機制。GhostPool 不要求特定的加密方案,它要求這個認證承諾鉤子。

這消除了用戶為一個隱藏交易證明有效性,同時附加另一個交易密文的攻擊。

3.4 作廢號

每個隨機數插槽都被分配一個規範作廢號:

B_{\mathrm{slot}} = \mathsf{HashToCurve}!\left(
\texttt{"ghostpool/nullifier/v1"} ,|, \texttt{chainid} ,|, address ,|, nonce
\right)

N = sk \cdot B_{\mathrm{slot}}

其中 sk 是發送者私鑰,且 address = \mathsf{Addr}(pk)。

GhostPool 不使用簡單的哈希(如 H(address ,|, nonce))或任何觀察者可以直接從可見狀態重新計算的確定性公開產物。設計目標是插槽唯一性,且無法僅從可見狀態進行公開枚舉

作廢號有四個用途:

  • 插槽唯一性:相同的 (account, nonce) 產生相同的 N,

  • 不可偽造性:沒有發送者私鑰,第三方無法為該插槽生成有效的作廢號,

  • 不可從公開狀態枚舉:僅猜測 (address, nonce) 不足以針對觀察到的 N 進行測試,

  • 共享插槽語義:加密流和明文流使用相同的插槽密鑰。

從直觀上看,觀察者可以從公開數據派生 B_{\mathrm{slot}},但如果沒有發送者私鑰或有效的公開證書,就無法測試觀察到的 N 是否屬於該插槽。

HashToCurve 應實例化為具有適當域分離的恆定時間 hash-to-curve 或 encode-to-curve 方法;參見 RFC 9380。協議級別的作廢號是群元素 N 的規範編碼。實現時可以額外對其進行哈希處理以進行本地索引。

這種構建與 PLUME 等確定性公開產物設計相近,但 GhostPool 專門將作廢號用作內存池准入的隨機數插槽密鑰

3.5 明文路徑

GhostPool 並不強迫明文交易進入加密准入電路。

明文交易繼續使用具有可見發送者、隨機數和費用字段的普通內存池路徑。唯一的額外要求是它還必須攜帶:

  • 其可見隨機數插槽的規範作廢號 N,以及

  • 一個輕量級的插槽證書 \pi_{\text{slot}},證明:

pk = sk \cdot G
\qquad\text{以及}\qquad
N = sk \cdot B_{\mathrm{slot}}

等效地,

\log_G(pk) = \log_{B_{\mathrm{slot}}}(N)

驗證者從普通交易簽名中恢復 pk,從 (address, nonce) 計算 B_{\mathrm{slot}},並將 \pi_{\text{slot}} 作為 DLEQ / Chaum–Pedersen 關係進行檢查。這比完整的葉子證明輕得多,且使用標準機制;參見 RFC 9497

這是同一個作廢號對象的公開認證路徑,加密交易則在葉子電路內部證明該對象。這也賦予了明文和加密交易一個共享的插槽命名空間。

3.6 准入流水線

當節點收到加密信封 E 時,它會按從廉價到昂貴的順序運行檢查:

  • 信封完整性:結構有效、必需字段存在、遵守大小限制。

  • 作廢號預過濾:檢查 N 是否與現有的池條目衝突。

  • 錨點時效性:驗證 ref_root 是規範的且足夠新。

  • 密文承諾檢查:驗證密文是否認證了聲明的 payload_commitment。

  • 葉子證明驗證:驗證 \pi_{\text{leaf}}。

  • 替換最終化:如果策略允許,替換相同作廢號的舊條目。

選擇此順序是為了在證明驗證之前拒絕格式錯誤或過期的對象。


4. 共享作廢號命名空間

GhostPool 的架構核心在於:加密明文交易採取不同的准入路徑,但收斂於一個共享的插槽命名空間。

圖 2. 加密和明文交易使用不同的准入檢查,但收斂於一個共享的作廢號命名空間和一個已使用作廢號視圖。

這個共享命名空間使得隨機數穩定性論證在實踐中可用。一個待處理的加密證明只要滿足以下條件就保持有效:

  • 其參考根(reference root)仍然足夠新,

  • 且其作廢號尚未進入已使用集合(spent set)。

在部署中,明文作廢號產物必須在重組地平線(reorg horizon)內可用,以便已使用集合保持可重構性。這些產物如何持久化是傳輸或格式的選擇。准入邏輯本身保持不變。


5. 池策略

5.1 要求

進入內存池的每筆交易——無論是加密還是明文——都必須攜帶規範作廢號:

  • 對於加密交易,作廢號的正確性在 \pi_{\text{leaf}} 內部建立;

  • 對於明文交易,作廢號的正確性由普通簽名路徑加上 \pi_{\text{slot}} 建立。

因此,GhostPool 依賴於單一的插槽追蹤不變量:

任何能夠消耗被追蹤隨機數插槽的事件,都必須反映在同一個插槽消耗視圖中。

在基礎構建中,這是直接實現的,因為加密和明文交易都參與共享的作廢號命名空間。

5.2 時效窗口

GhostPool 僅在 ref_root 處於最近 W 個規範區塊根之內時才接受加密證明。

從概念上講,加密條目在以下情況下保持待處理狀態:

  • ref_root 在窗口內,

  • 且 N \notin \texttt{spent}。

過期僅適用於加密條目。明文條目不攜帶根綁定的 GhostPool 葉子證明。

5.3 替換

替換是定義在共享作廢號插槽上的,而不是定義在可見的發送者字段上。

如果兩個池條目攜帶相同的作廢號,它們將競爭同一個底層 (account, nonce) 插槽。如果本地策略允許,新條目可以替換舊條目。

GhostPool 通過作廢號標準化了插槽等價性。它並不標準化跨明文和加密流的單一通用費用提升(fee-bump)規則。

5.4 重組

當鏈發生重組時,被撤銷區塊中包含的交易不再是最終的,因此它們的作廢號必須從已使用集合中移出。

節點維護一個逐區塊的作廢號更新日誌。在重組時:

  • 反向重放撤銷的區塊,

  • 正向應用新的規範區塊,

  • 重新評估時效性或使用狀態發生變化的待處理加密條目。


6. 聚合與傳播

當葉子證明較大時,遞歸 STARK 聚合是 GhostPool 自然的傳播層。

如果加密信封與其葉子證明一起被天真地傳播,證明帶寬和全網驗證工作量都會隨著吞吐量迅速增長。基於遞歸 STARK 的帶寬高效內存池中提出的遞歸傳播模式解決了這一設置:節點對新對象驗證一次,然後定期發布關於其當前所知的有效對象的遞歸證明。

GhostPool 在加密路徑上使用該模式。

首次收到加密信封的節點會驗證其葉子證明一次。然後,在每個滴答(tick)週期,它會生成一個覆蓋其本地視圖中所有仍然有效的加密信封的遞歸 STARK,並將該遞歸證明連同對等節點尚未見過的任何加密信封一起轉發給對等節點,但不帶原始葉子證明。

遞歸證明的公開輸入是所覆蓋加密信封的集合描述符——例如位圖或信封哈希列表。遞歸電路隨後接收:

  • 零個或多個帶有葉子證明的加密信封,

  • 零個或多個相同類型的其他遞歸 STARK,

  • 以及一個丟棄集合,

並證明所有直接提供的信封與所有遞歸導入集合的並集(減去被丟棄的信封)的有效性。

這種「並集減去丟棄」的結構非常契合 GhostPool。它允許聚合隨內存池演進:

  • ref_root 落在時效窗口之外的信封可以被丟棄,

  • 作廢號已進入已使用集合的信封可以被丟棄,

  • 被同一插槽的新交易所替換的信封可以被丟棄。

如果一個節點當前擁有 {Tx1, Tx2, Tx3},另一個節點擁有 {Tx2, Tx3, Tx4},它們的遞歸證明可以合併成一個覆蓋並集 {Tx1, Tx2, Tx3, Tx4} 的更大證明。收到多個部分重疊聚合的構建者可以以完全相同的方式組合它們。

圖 3. 遞歸聚合將重疊的加密交易集合併為其並集的單一證明,並通過丟棄集合移除失效對象。

這為 GhostPool 在加密路徑上帶來了兩個具體優勢。

首先,它減少了全網驗證工作量。新的加密信封在首次進入網絡時仍需檢查一次,但下游節點越來越多地驗證集合信封的遞歸覆蓋證明,而不是獨立地重新驗證每個葉子證明。

其次,它減少了證明傳播開銷。每個加密信封主體仍需在網絡中傳播,但證明流量變成了基於每個對等節點的滴答週期,而不是基於每個信封。這是遞歸構建的主要帶寬收益:對象數據隨信封數量縮放,而證明開銷隨滴答頻率和對等節點數量縮放。


7. 討論

7.1 更廣泛的賬戶模型

隨機數穩定性論證在標準賬戶模型中最為簡單,因為發出交易是既消耗隨機數又減少餘額的機制。

EIP-7702 展示了為什麼一旦引入委託執行路徑,這種簡單性就無法保持不變。在這些設置中,原生餘額不能再僅從隨機數穩定性中推導出來,且被追蹤的插槽可能會通過非普通 GhostPool 追蹤交易的授權路徑被消耗。

這改變了協議需要追蹤的對象。一個自然的恢復方向是用託管式償付能力對象取代原生餘額償付能力,並相應地擴大插槽消耗追蹤。准入架構本身不會改變。

7.2 交易鏈

基礎協議僅支持隊首隨機數

如果用戶想要為隨機數 n, n+1, n+2 排隊私密交易,後面的交易無法針對當前鏈上狀態獨立證明。從 n+1 到 n 的作廢號的天真依賴指針會重新引入關聯性。

因此,私密排隊交易鏈需要另一層,很可能是針對可准入父級作廢號的集合成員證明或依賴證明。

7.3 經濟元數據與指紋識別

GhostPool 在加密准入路徑中隱藏了發送者和隨機數,但經濟元數據仍然是一個顯著的隱私風險。費用參數和 Gas 限制可以作為強大的統計指紋,當與密文大小、時機和特定應用行為等其他可觀察特徵結合時,它們會變得更具揭示性。

隱藏經濟元數據要困難得多,因為構建者需要它來進行排序和打包。更重要的是,標準的加密思想如 ORE(順序保留加密)HE(同態加密) 在公開提交設置中並不能解決這個問題。如果任何人都可以生成加密或與比較接口交互,那麼小域元數據仍然可以通過探測來恢復:加密猜測值,比較結果,並推斷出底層數值。

設計既能與公開提交、構建者激勵和區塊構建協作,又能保持費用和 Gas 機密性的方案,仍然是一個開放性問題。GhostPool 將其視為獨立的工作。


8. 結論

加密內存池在隱藏交易內容直到包含順序確定方面已經有了可靠的設計。它們通常還不具備的是一種私密的方式來決定加密交易最初是否可准入,而又不重新引入驗證盲目性。

GhostPool 填補了這一空白。

在其基礎範圍內——標準賬戶模型下的隊首隨機數准入,以及驗證載荷承諾的加密格式——GhostPool 用根綁定 ZK 證明加上跨越加密和明文交易的共享作廢號命名空間,取代了公開的 (sender, nonce) 准入檢查。這在保留語義准入檢查的同時,從明文加密准入路徑中移除了身份關鍵的准入元數據。


附錄

以下內容均為可選。它使提案更易於實現和審查,但可以在不改變核心敘述的情況下移除。

附錄 A. 符號與參數

  • h:節點觀察到的當前頭部區塊號

  • W:時效窗口(以區塊計)

  • \mathcal{R}_h:窗口內的規範區塊根集合,例如 {\texttt{root}[h-W], \dots, \texttt{root}[h]}

  • ref_root:\pi_{\text{leaf}} 內部使用的精確根

  • payload_commitment:對隱藏交易載荷的公開承諾

  • sk, pk:簽名私鑰/公鑰

  • address = \mathsf{Addr}(pk):賬戶地址

  • nonce:賬戶隨機數

  • \mathsf{HashToCurve}(\cdot):域分離的 hash-to-curve 或 encode-to-curve 函數

B_{\mathrm{slot}} 的推薦域分離輸入:

  • 協議域字符串,例如 "ghostpool/nullifier/v1"

  • chainid

  • address

  • nonce

附錄 B. 非正式證明陳述

B.1 加密葉子證明關係

公開輸入

  • payload_commitment

  • N

  • ref_root

  • 來自 public_meta 的公開費用和打包字段

見證(Witness)

  • sk, pk, address, nonce

  • 隱藏交易字段(to, value, gas_limit, max_fee_per_gas, max_priority_fee_per_gas, calldata 等)

  • 簽名材料

  • ref_root 下的賬戶和狀態見證

陳述

證明者展示存在一個見證使得:

  • address = \mathsf{Addr}(pk)

  • 隱藏交易簽名在 pk 下驗證通過

  • \mathsf{nonce}(address;\ ref_root) = nonce

  • \mathsf{balance}(address;\ ref_root) \ge \texttt{worst_case_cost(hidden_tx)}

  • 公開 Gas 和費用字段等於隱藏交易的相應字段

  • payload_commitment = Commit(hidden_tx)

  • B_{\mathrm{slot}} = \mathsf{HashToCurve}(\texttt{dst} | \texttt{chainid} | address | nonce)

  • N = sk \cdot B_{\mathrm{slot}}

B.2 明文插槽證書關係

公開輸入

  • pk(從普通交易簽名中恢復)

  • B_{\mathrm{slot}}(從可見的 (address, nonce) 計算)

  • N

見證

  • sk

陳述

證明:

\log_G(pk) = \log_{B_{\mathrm{slot}}}(N)

這是一個標準的 DLEQ / Chaum–Pedersen 陳述;參見 RFC 9497

附錄 C. 插槽證書詳情

素數階群上離散對數相等的標準 Chaum–Pedersen 證明如下:

  • 證明者知道 sk 使得 pk = sk \cdot G 且 N = sk \cdot B。

  • 證明者採樣隨機數 r 並計算承諾:
    a_1 = r \cdot G,\qquad a_2 = r \cdot B

  • 驗證者提供挑戰 c。

  • 證明者響應:
    z = r + c \cdot sk

  • 驗證者檢查:
    z \cdot G = a_1 + c \cdot pk

以及
z \cdot B = a_2 + c \cdot N

Fiat–Shamir 變換使其成為非交互式的。

附錄 D. 實踐筆記

  • 窗口大小
    一個自然的起點是 W \in [32, 128] 個區塊。

  • 存儲
    存儲開銷主要在於:

    • pending_map,受內存池大小限制
    • spent_set,受為恢復和重組安全而追蹤的近期鏈地平線限制
  • 證明成本
    最昂貴的工程點可能是加密葉子證明,特別是如果實現在證明系統內部保留 secp256k1 風格的授權關係。

  • 錢包支持
    錢包支持可能需要暴露:

    • 直接的作廢號生成支持,
    • 或與所選 DLEQ 實現兼容的通用「證明插槽證書」路徑。
https://ethresear.ch/t/ghostpool-hiding-identity-critical-metadata-in-encrypted-mempool-admission/24327