您好!我想介紹一下我的想法(研究+概念驗證),並希望得到一些反饋或意見。
要點:
根密鑰可以是現有的 7702 帳戶。
消費密鑰和查看密鑰必須存放在安全盒中(例如,KMS/HSM/MPC)。
隱蔽地址發現需要存儲 ERC-5564 元數據:
viewTag(1 字節)和ephemeralPublicKey(33 字節)。這些元數據可以存儲在合約存儲、事件日誌、本地/客戶端存儲或後端(取決於用戶體驗和隱私要求)。
筆記:
可以從單個元地址導出 N 個隱蔽地址。
每個派生地址都可以代表一個專用的子賬戶,用於訂閱、私人交易、私人支付或支付渠道。
創建請求可能來自第三方(通過 API),經用戶批准後,通過鏈上子賬戶的支出策略強制執行到賬戶實現。
可以使用隱私池或市場上其他隱私資金機制,以不可關聯的方式為子賬戶充值。
現有示例:
基於: stealth/contracts/STEALTH_ARCHITECTURE.md openfort-xyz/stealth-addresses Bob 擁有 7702 賬戶。在實現過程中:
event Announcement ( uint256 indexed schemeId, address indexed caller, bytes1 indexed viewTag, bytes ephemeralPubKey, bytes metadata ) ;bytes public stealthMetaAddress; error InvalidEphemeralPubKeyLength () ; error EmptyMetadata () ; function announce ( uint256 schemeId, bytes calldata ephemeralPubKey, bytes calldata metadata ) external { // Validate ephemeral public key length (66) if (ephemeralPubKey.length != 66 ) { revert InvalidEphemeralPubKeyLength () ;} // Validate metadata contains at least viewTag if (metadata.length == 0 ) { revert EmptyMetadata () ;} // Extract viewTag from first byte of metadata bytes1 viewTag = metadata[ 0 ]; emit Announcement ( schemeId, msg.sender, viewTag, ephemeralPubKey, metadata ) ;}在這種情況下,Bob 可以基於他的st:eth:0x<spendingPubKey><viewingPubKey>創建一個隱身賬戶,並調用Stealth.announce()來發布數據。
這將發出一個事件,並將數據以低成本存儲到 Bob 的主帳戶中。
從外部觀察者的角度來看,這些數據看起來就像隨機數據。無法從中推斷出隱蔽地址或密鑰。觀察者或許可以推斷出 Bob 使用了隱蔽地址,但仍然無法確定 Bob 公佈的是自己的隱蔽地址還是其他用戶的隱蔽地址。
另一方面,愛麗絲也可以告訴鮑勃,她已經向鮑勃要求的秘密地址發送了付款。
在這兩種情況下,我們都保持了隱蔽地址與其所有者之間的不可關聯性。
此外,私鑰可以委託給可信的監控系統,該系統可以掃描元數據,檢測是否為給定的支出公鑰創建了隱身地址,併發出信號。然後,為了恢復隱身地址,我們可以離線操作(例如,在安全的環境中),並安全地恢復私鑰,從而將隱身地址與前端 7702 賬戶的所有者關聯起來。
這是存儲隱蔽地址元數據最便宜、最無需信任的方式,無需在客戶端或後端存儲隱蔽私鑰。
什麼是 ERC5564(隱形地址)?: https://github.com/openfort-xyz/-stealth-addresses/tree/0xkoiner/dev/documentation
演員/關鍵
ROOT 7702 帳戶:用戶的主帳戶(資金 + 協調)。
KMS :存儲ERC-5564 支出/查看密鑰(或通過 HSM/MPC 保護它們)。
P-256 不可提取密鑰:子賬戶實現的長期簽名者。
隱私池:用於以不可關聯的方式為子賬戶提供資金。
第 0 階段 — 提供“隱形元地址”(ERC-5564)
生成支出密鑰對和查看密鑰對(ERC-5564 接收器密鑰)。
將spend_sk和view_sk存儲在KMS中(最好是Threshold/拆分控制;更多內容見下文)。
將隱蔽元地址(= spend_pk + view_pk)發佈到您想要的任何地方(用戶個人資料、應用程序註冊表、二維碼)。
這很重要:您可以確定性地導出許多一次性隱蔽地址,而無需存儲它們。
你的觀點沒錯:你不會存儲派生的隱蔽私鑰,只會存儲根接收密鑰。
第一階段——創建新的子賬戶地址(ERC-5564 派生)
對於您想要的每個新子賬戶:
創建臨時密鑰對。
根據 ERC-5564,從
(epk, metaAddress)計算(stealthAddress, viewTag)。(可選)創建公告記錄/事件,以便錢包可以發現它(如果您想要第三方支付用戶體驗;對於自行管理的子賬戶來說並非絕對必要)。
此時,您將獲得新的 EOA 地址,該地址將成為您的 7702 子賬戶。
第二階段——使用派生的EOA 密鑰引導 7702 子賬戶(無需存儲)
目標:使用隱蔽地址的ECDSA(secp256k1)功能僅一次來安裝代碼 + 輪換權限。
在可信服務邊界內,即時派生隱蔽私鑰:
使用
view_sk掃描/識別目標(或者如果您是創建者,您已經知道是哪個目標了),使用
spend_sk+epk(以及 ERC-5564 指定的任何派生方式)來計算該隱蔽地址的一次性私鑰。
僅使用該派生的私鑰簽署設置帳戶代碼的 EIP-7702 授權(您的自定義實現)。
在相同的設置流程中,調用
initialize(...)來:將P-256 公鑰設置為主簽名者(不可提取),
設置您的限制模塊/權限,
(可選)設置“委託/會話密鑰”策略。
立即將內存中派生的隱蔽私鑰清零。
重要細節(安全性):
即使你“清除”了派生的隱蔽私鑰,如果有人之後攻破了KMS(它可以重新計算支出/查看密鑰),他們仍然可以重新派生出該私鑰,並簽署新的7702授權。因此,你真正的根之根就變成了KMS 。把它當作硬件錢包級別的資產來對待。
第三階段——通過隱私池為子賬戶提供私人資金
ROOT 7702 將ETH/ USDC/ETC存入隱私池。
之後,從 Privacy Pools 提取到stealthAddress(現在是一個 7702 智能賬戶) 。
最佳實踐:使用 Privacy Pools 的原生中繼/費用機制(或中繼器)來避免子賬戶在獲得資金之前就需要有ETH來支付 gas 費用。
第四階段——開始正常使用AA(4337 + 付款人)
現在子賬戶有資金,長期控制權為 P-256:
使用由P-256簽名的 4337 用戶操作。
如果你想要贊助加油:
要麼在子賬戶中保留一些ETH ,要麼
使用支持 ERC-20 計費且與您的執行模式兼容的支付服務商。
支付主管 + “在同一用戶操作中提款 + 批准”
注意:付款方驗證發生在執行之前。因此,“先提款,再批准,最後償還付款方”的做法可能會讓付款方承擔風險,除非其系統設計能夠承受這種風險。更安全的做法是:
- PP提現會先為賬戶充值,然後用戶運營人員才能安全地支付/批准。
使用案例:商家創建的、不可關聯的訂閱子賬戶
目標
讓可信的服務(Spotify/YouTube/ChatGPT)創建一個專用的子賬戶用於訂閱:
無法在鏈上鍊接到用戶的 ROOT 賬戶,
由商家控制(因此他們可以按月收費),
設有嚴格的消費限額(以防止商家過度消費),
用戶可以隨時撤銷/取消並取回剩餘款項。
受信任的服務(Spotify、YouTube、ChatGPT)可以通過 API 向用戶請求其專屬的訂閱子帳戶。
用戶通過其 ROOT 7702 帳戶批准此請求,包括訂閱策略(每月上限、允許的代幣、允許的接收者)以及將控制支出的服務的 P-256 公鑰。
獲得批准後,平臺會通過密鑰管理系統 (KMS) 生成一個新的 ERC-5564 隱蔽地址(因此無需存儲派生的私鑰,但仍可恢復)。用戶的 ROOT 賬戶隨後會將資金存入隱私池,之後這些資金會以一種避免 ROOT 賬戶和子賬戶之間鏈上關聯的方式提取到新生成的隱蔽子賬戶中。
子賬戶收到資金後,通過 EIP-7702 授權升級為自定義智能賬戶實現,並進行初始化,使服務的 P-256 密鑰成為活動簽名者,並在鏈上強制執行嚴格的支出限制和執行權限。
從那時起,該服務可以在配置的限制範圍內運行循環訂閱費用,同時用戶保留一個退出機制:Root Key 可以隨時撤銷該服務,恢復控制權(通過 KMS 支持的派生/恢復路徑),並提取任何剩餘餘額,而不會洩露與主 ROOT 賬戶的直接鏈上連接。





