最后更新:
zk.money 是一款开源、自托管的加密货币钱包,允许人们私密地发送和接收加密货币。它由总部位于英国的开发商 Aztec Labs 在 Aztec Network 上构建。该钱包将资金私密地保存在 Aztec Network 上,这是一个建立在以太坊之上的注重隐私的 Layer 2 网络,因此系统内部进行的交易余额、金额、发送者和接收者都不会发布到任何公链上。[1][2] 用户可以从以太坊存入资金,在 zk.money 内部私密地转移资金,并随时提现回以太坊主网。[3]
zk.money 可以作为其自身域名的 Web 钱包使用,也可以作为本地运行的桌面应用程序使用,同一个通行密钥(passkey)允许在不同设备上访问同一个钱包。[1] 资金从 Ethereum 流入,在 zk.money 内部进行私密转移,并可以根据用户需求随时提取回以太坊。[4] 交易在发送前会在用户自己的设备上进行证明,因此私钥永远不会离开设备。[3]
该系统由运行在以太坊和 Aztec 网络上的多个组件组成:不可变的链上智能合约、名为 Oxide 的安全与迁移协议,以及 Web 界面或桌面应用。[4] Aztec 网络被描述为以太坊之上的一个完全私密、完全可编程的网络,是 zk.money 的票据(notes)和余额最终存放的地方。[1] zk.money 宣称在系统内部进行的支付无需支付以太坊 Gas 费,而从以太坊存入 zk.money 的资金则需要 Ethereum Gas 费且是公开的,因为所有以太坊交易都是公开的。[1]
该钱包是非托管的,由不可变的智能合约驱动。Aztec Labs 表示,zk.money 钱包中持有的任何加密货币都完全由用户控制,除了用户本人外,没有人可以移动资金,不存在特权管理员角色,也没有拥有管理员密钥来移动资金的中心化 zk.money 服务器。[1] 系统内的单个运行角色可能会宕机或拒绝服务,但现有的余额仍然可以被提取。[3]
zk.money 不使用助记词,也没有需要单独记录的密钥;用户的两个密钥都是从通行密钥(passkey)派生出来的。[3] 当用户登录时,钱包从通行密钥派生出私钥,并将其以未加密的形式保存在浏览器的存储中直到退出登录,因此刷新、打开新标签页或关闭浏览器都不会再次提示输入通行密钥。[3] 文档指出,该私钥可以显示余额和历史记录,但不能移动资金。[3] 备份账户意味着通过 iCloud 钥匙串、Google 密码管理器或 1Password 备份通行密钥;仅存储在硬件安全密钥上的通行密钥没有备份,丢失该密钥将导致丢失钱包。[3] zk.money 不持有通行密钥的副本,没有托管服务,如果通行密钥在所有地方都丢失了,没有人能重建该账户。[1]
Oxide 是一个与 Aztec 网络并行运行的独立协议,针对网络证明系统中的漏洞提供独立的第二层安全保护。[1] 它构建在 AWS Nitro Enclaves 之上——这是一种可信执行环境(TEE),即一种硬件隔离的环境,代码在其中运行并与主机隔绝——其工作原理是让用户模拟 Aztec 网络交易。[1] Aztec Labs 表示,Oxide 可以在不了解操作内容的情况下证明操作的有效性,因此第三方无法看到交易详情;并且由于 Oxide 的信任假设与保护 Aztec 网络的零知识(ZK)电路是分离的,一个系统的故障不会损害另一个系统。[4] 其既定目的是为防御密码系统中的漏洞增加另一层防线。[4]
Oxide 在每个角色上都是开源且无需许可的。zk.money 为 Oxide 运行默认的飞地(enclave)和解析器,但任何人都可以运行自己的飞地和解析器,并将钱包指向它。[1][3] 在实践中,L2BEAT 指出,每次提款和退款都需要 ZK 证明以及来自运行批准镜像的实时 AWS Nitro 飞地的签名;该飞地负责解密并读取其处理的操作。[5]
最初的 zk.money 是一个运行在 Aztec Connect 上的隐私去中心化金融 (DeFi) 应用程序。Aztec Labs 表示,在第一年,第一代 zk.money 就拥有超过 75,000 个独立钱包,交易额超过 1 亿美元,该公司将其视为隐私加密转账需求的早期证明。[4] 该应用程序于 2023 年停止接受存款,并于 2024 年 3 月关闭。[3] Aztec Labs 将 2023 年的退役归因于隐私转账并非失败,而是因为它们需要当时尚不存在的基础设施。[4]
该基础设施正是 Aztec 网络本身。Aztec Labs 表示,它花了三年时间构建并启动了该网络,并将其描述为去中心化隐私层,可以让像 zk.money 这样的系统扩展到主流应用。随着网络的上线,它开始在其上发布开源隐私产品。[4] 该公司引用 ZKPassport 作为此类产品之一,并将重生的 zk.money 作为另一个产品。[4] L2BEAT 于 2026 年 10 月 1 日记录了对 zk.money 的首次完整发现。[5]
当钱包回归时,优先访问权被授予了之前 zk.money 的早期用户,通过与朋友分享自己的标签也可以获得立即访问权限。[4] 在发布后的几周内,团队表示已修复了未被清扫的存款,使滞留资金变得可追回,并增加了一个更快的提现选项,用户只需支付少量小费即可跳过证明队列,在五分钟内完成提现。[6] 2026 年 10 月初,该项目表示参加了在新加坡举行的 token2049,其代表在主活动和隐私峰会(Privacy Summit)上发表了演讲。[6]
每个账户不再需要复制冗长的十六进制地址,而是申领一个由通行密钥(passkey)保护的可读标签,例如 “yourname.zk.money”。[4] 标签在设计上是公开的,以便任何人都可以向其付款,但知道标签并不会泄露交易历史,且标签的余额和历史记录对他人都不可见。[3] 标签遵循先到先得的原则,团队保留了少量标签;被保留的标签只能通过在 X 上使用与该保留标签完全匹配的账号向官方账号发送消息来申领,之后会发送申领链接。[3] 在技术层面,标签公开映射到 Aztec 地址和密钥,并有两个用途:通过 以太坊域名服务 (ENS) 链下查询推导 第 1 层 (L1) 存款地址,以及让钱包从链上注册表中读取 Aztec 地址以路由私密的 第 2 层 (L2) 转账。[5]
存款通过名为 SIPA 的单次使用 第 1 层 地址到达。任何人都可以从任何钱包或交易所向接收者的存款地址发送 DAI、USDC 或 USDT,资金会自动归集到接收者的私有余额中;存入的 USDC 和 USDT 在存款时会通过 Curve 3pool 兑换为 DAI。[3][5] 每个存款地址都是单次使用的,用户被告知每次收款都要获取一个新地址,这样进账款项就无法被关联,因为重复使用 SIPA 会关联其存款。[1][5] 为了避免直接提供地址,用户可以发送请求链接,或者在支持 ENS CCIP 的 以太坊 钱包中,交易对手可以输入类似 bob.zk.money 的标签,解析器会推导出其背后的新鲜存款地址。[3]
zk.money 支持两种可分享的链接。支付链接持有资金:发送者锁定一定金额并分享链接,任何使用自己的通行密钥申领该链接的人都会收到资金,无需事先拥有账户。每个支付链接都有 1 天、7 天或 30 天的申领窗口,以及一个立即开启的退款窗口,因此未被申领的链接可以由发送者随时收回;链接永远不会既被申领又被退款,以先发生的两种结果之一为准。[3] 请求链接则相反——它请求某人付款并向其提供存款地址,在有人发送资金之前不持有任何资金。[3] zk.money 内部的支付是最终的,钱包在确认前会显示解析后的接收者;对于不完全信任的交易对手,文档建议发送支付链接,因为未申领的资金会退回给发送者。[3] 钱包使用 XMTP(一种端到端加密消息网络)来确认通过二维码或链接添加的联系人,并发送支付请求。[5]
启动时,系统支持 DAI 作为其内部资产,每笔存款、支付和提现最初都限制在 2,500 美元以下。[3][1] L2BEAT 记录的这些上限各为 2,583 DAI,存款共享 50,000 DAI 的额度,该额度会在一天内自动恢复。[5]
该团队概述了其称将通过 zk.money 在 Aztec 上实现的进一步功能,包括储蓄库、银行和 IBAN 支付、私密资助 Layer 2 账户、通过 ZKPassport 实现零知识护照证明以解锁更高额度、共享“资金池”和团体账单,以及更多的通行密钥(passkey)支持。[6] 这些是该项目描述的计划,而非已发布的功能。
存款和提款会收取少量费用,从转移的金额中扣除。每笔费用的一部分会充入一个独立的付费合约,该合约为所有使用 zk.money 的用户支付网络费用,这就是为什么在覆盖额度内内部活动是免费的,而剩余部分则用于支付资金进出 Ethereum 的 gas 成本。[3] 该项目表示,目前的免费内部覆盖额度为每天最多 100 笔交易,且不收集任何账户数据,该覆盖额度可能会发生变化。[3] 存款费用为 0.35 美元,提款费用为 0.20 美元。[3]
申请标签的费用为 4.90 美元,外加支付给付费合约的 0.10 美元,总计 5.00 美元,从首次存款中扣除。首次存款必须至少为 15 美元的 USDC、USDT 或 DAI;15 美元的 DAI 存款在扣除费用和任何兑换后大约剩余 10 美元。[3] 对于能够证明拥有 2024 年停止服务的旧版 zk.money 系统钱包所有权,或者通过其分享链接邀请一人申请标签的用户,可以在注册流程中豁免 4.90 美元的部分;即使豁免,仍需至少 5 美元的首次存款,用户需支付 0.60 美元的费用,5 美元的 DAI 存款后剩余 4.40 美元。[3] 根据 L2BEAT 的核算,归集(sweep)支付 0.25 DAI,申请名称时为 0.5 DAI;注册默认费用为 5 DAI(包括其归集费);门户网站从每笔存款和普通提款中提取 0.1 DAI 以赞助 Aztec 费用,赞助需要注册名称或凭证。[5] 一个专门的出资人合约负责收集门户网站的资金分成,任何人都可以将其兑换为 AZTEC 并作为 Fee Juice 桥接到 L2 付费合约,从而支付用户的 Layer-2 费用。[5]
zk.money 在其账本内部隐藏了发送者、金额以及存款与取款之间的联系,而名称、存款以及向 Ethereum 的取款在设计上是公开的。[5][4] L2BEAT 的分析针对不同的观察者对这种保护进行了不同等级的划分。公共观察者可以看到链接隐私得到了保留,但申请名称会将其与资金钱包绑定,向新联系人的首次付款会通过握手暴露该接收者,且注册后的首次赞助交易会与账户绑定。[5] 链上分析师可能会使链接面临风险,因为匿名集仅限于 Aztec 上的 zk.money 用户,且从系统外部向某个名称进行的首次付款会公开地与其绑定。[5]
对于其他对手,风险会增加。网络观察者——如 RPC 提供商、中继器、索引器或互联网服务提供商——可以看到网络流量、IP 地址、时间戳以及存款和取款所落入的区块,且桌面钱包不提供 Tor 或代理设置。[5] 持有协议密钥或明文的特权内部人员——如升级管理员、排序器、查看密钥持有者、TEE 供应商、托管证明者或票据注册表运营商——可以完全链接存款和接收者,从而暴露发送者、接收者、金额和资产。[5] 未来如果对手现在存档链上数据,并在以后破解椭圆曲线密码学,则可以解密发布到 Ethereum 的历史票据和付款事件。[5]
托管资金的安全性建立在多重证明设计之上:门户网站仅在 Aztec 证明了取款消息且一个注册的飞地签名者共同签署后才释放资金,因此窃取托管资金需要 ZK 层和飞地层同时失效,而其中任何一层的失效都会破坏隐私。[5] L2BEAT 总结称,如果 Aztec 的私有执行或退款证明不健全且飞地层也失效,或者恶意钱包代码获取了有害签名,或者替换的合约列表重定向了未来的付款,或者名称的控制者重定向了未来的付款,资金就可能被盗。[5] 如果用户丢失了通行密钥,或者所有经过 AWS 认证的飞地停止运行,或者解析器筛选拦截了外部付款且接收者缺乏重新推导存款地址的工具,资金可能会丢失。[5]
L2BEAT 将退出窗口评定为无限,因为托管和批准的飞地镜像是不可变的,但指出该协议未通过其“离场测试”:如果所有中心化参与者消失,用户将无法完全使用它,因为取款和退款需要一个在 AWS Nitro 上运行批准镜像的活跃飞地,且发布的钱包也依赖于 zk.money 的服务。[5] 该项目被评为部分可复现——合约、桌面钱包、飞地和电路源码是公开的,且部署的退款和解析器验证器与发布的电路匹配,但批准的飞地二进制文件仍未被复现,且解析器、快照和托管钱包的发布源码尚未公开。[5] 隐私评级假设使用的是 zk.money Desktop v0.1.0;托管的网页钱包在每次访问时都会从 zk.money 加载代码,这使其运营商成为事实上的内部人员,能够读取查看密钥,而独立设置——即修改桌面版本以固定验证地址、在自己的域名下提供服务并在 AWS 上运行批准的飞地——虽然可行但尚未经过测试。[5]
zk.money 依赖于 Aztec Ignition 可信设置,这是由 Aztec 在 2019 年针对 BN254 曲线上的 KZG 承诺发起的一次仪式,共有 176 名参与者且公开开放参与,L2BEAT 将其评为最低风险级别;该电路使用 UltraHonk (Plonk) 证明系统。[5]
审查应用于链下服务而非链上。钱包通过 zk.money 将 Ethereum 地址发送给 Predicate 进行筛选,而直接资助存款 SIPA 则可规避此操作;中继器会根据 OFAC 制裁名单(以及可选的 Predicate)筛选代币转移,而自行提交的清扫和提款则会跳过中继器筛选。[5] 名称解析器在 L2 通知接收者之前,会分别针对 OFAC 筛选存款地址和资助者;被拦截的付款会将资金留在钱包未知的地址中,仅能通过接收者自己的工具和 L1 授权进行恢复。[5]
Aztec 网络和 zk.money 的核心智能合约都是不可变的。[5] 在 Ethereum 上,ZkMoneyPortal 合约持有托管资金,且仅在经过验证的 Aztec L2 到 L1 消息(由注册的 TEE 签名者共同签署)下释放资金;任何人都可以通过经批准的飞地镜像(enclave image)的最新 AWS Nitro 证明来注册 TEE 签名者,在 L2BEAT 发现时已有两名注册签名者。[5] 证明通过 NitroValidator 和 CertManager 进行验证,其唯一的信任锚点是硬编码的 AWS Nitro 根证书。[5] 存款和注册地址由无许可工厂部署为确定性克隆,一旦 Aztec 的规范 Rollup 发生变化,任何人都可以永久冻结该门户——这种冻结会停止新存款,并允许在最后验证的检查点进行退款,而不会阻止已进入的资金转出。[5][3]
尽管托管逻辑不可变,但命名和网络服务基础设施仍处于 Aztec Labs 的控制之下。两个 Aztec Labs 外部账户 (EOA) 治理着 *.zk.money 命名空间:一个拥有 NameRegistry,可以更换其注册、元数据和解析器合约并更改域名所有者,以及批准存款地址实现;另一个负责授权或拒绝每个名称申请,并可以签署自定义注册费并添加永久费用受益人。[5] 由于这些控制器可以重新分配名称并重定向未来的付款,且由于 Aztec Labs 在 ENS 中拥有 zk.money(可由 DNS 持有者收回)并控制托管钱包、桌面版本以及目前两个钱包使用的两个未签名合约列表,L2BEAT 将名称治理和钱包分发识别为系统的主要中心化点。[5] 名称申请需要来自带有名称黑名单的闭源服务器的域名所有者签名,并且在新设备上访问账户需要已注册的名称。[5]
提现和退款由另外两个作为门户注册 TEE 签名者的 Aztec Labs EOA 共同签署;如果没有注册 TEE 签名者的签名,任何资金都无法离开门户。[5] 辅助合约处理具体机制:提现即兑换(swap-on-withdraw)托管允许通过在固定滑点范围内将 DAI 路由通过 Curve 3pool 或 Uniswap,以 USDC、USDT 或 ETH 形式支付提现;默认支付执行器支付接收者和中继者小费;一组 UltraHonk 验证器根据硬编码的验证密钥检查退款和解析器电路。[5] 派生存款地址的解析器操作员可以链接钱包地址,因为它们共享一个密钥,但每次查询必须携带与用户注册密钥和 L2 地址匹配的 ZK 证明,从而防止操作员重定向付款,且用户可以选择自定义解析器操作员。[5]