跳至正文
Anon Wallet

钱包同步

屏蔽钱包面临一个普通钱包没有的问题:余额并不记录在你的地址名下,而是由一组加密票据构成,与其他人的票据一起存放在共享池中。池中的票据没有归属标签。要确定你拥有哪些资金,钱包必须从全部票据中找到属于你的票据。

实现这一点有两种方式,而选择哪一种,是屏蔽钱包最重要的隐私决策。

找到票据的两种方式

让服务器代为查找。 钱包将由查看密钥派生的筛选条件发送给索引器,索引器返回匹配记录。这种方式快速且成本低,但也完整披露了查询目标:筛选条件就是问题本身,服务器必须读取它才能回答。

下载数据,自己查找。 钱包以固定的公开分块下载池的历史,然后在本地尝试解密每张票据。只有属于你的票据才能成功解密。服务器不会知道具体哪些票据属于你,因为它从未收到这样的查询。

Anon 采用第二种方式,其机制称为 Digest 同步。

为什么查询本身就是泄露

很容易把这视为日志问题:只要索引器承诺不保存查询,风险就消失了。事实并非如此。

索引器查询是一个筛选谓词:给我符合 X 的承诺。这个谓词由查看密钥计算而来。服务器必须解析它才能回答,因此每次请求都会让你的密钥相关材料进入他人设备的内存,无论其数据保留政策如何。关闭日志只改变哪些内容写入磁盘,并不改变服务器必须知道什么。

不记录日志是一项承诺。不持有这些数据是一种架构。

这也是网络层匿名性无法补救查询模型的原因。即使通过 Tor 发送索引器请求,索引器仍清楚知道你查询了哪些承诺,只是在获知这些信息时不知道你的 IP。

Digest 请求是什么样的

Anon 的历史数据以不可变、统一分块的文件形式保存在 CDN 上。请求示例如下:

GET https://digest.anon.inc/v4/1/chunks/42/commitments.json.gz

请求中没有你的个人内容。路径取决于全局链状态:第 42 块文件覆盖固定范围的 Ethereum 区块,全世界任何人请求它都会收到相同字节。没有任何资产的钱包与持有上千张票据的钱包,对同一文件发出的请求完全相同。

由此产生两个特性:

  • 历史请求中没有由钱包派生的筛选条件。 即使 CDN 完整记录日志且完全失陷,它也只能知道某个 IP 下载了一个公开文件,无法知道该文件中哪些内容与你相关,因为 CDN 并不掌握这一事实。
  • 命中与未命中不可见。 数据到达后,在你的设备上解密。边缘节点无法判断第 42 块文件是否包含属于你的内容。索引器则必然知道,因为筛选条件正是查询本身。

已封存分块是不可变的,会在边缘缓存一年。因此,在稳定运行时,请求由你附近的 Cloudflare 数据中心响应,无需到达 Anon 的基础设施。

各个服务器能看到什么

同步并不是钱包唯一的网络活动,而且不同接口的特性并不相同。具体如下:

接口 运营方 是否由你的密钥派生? 可以获知的信息
Digest CDN(digest.anon.inc) Cloudflare 否 你的 IP,以及你获取了覆盖某个区块范围的公开文件
索引器头部 API(api.anon.inc) Anon 否 你的 IP,以及你的同步进度大致落后链最新状态多少
PPOI 代理 Anon,位于第三方聚合器之前 是 你的 IP,以及你查询了哪些盲化承诺
RPC 端点 你配置的提供方 否 你的 IP,以及你查询的公开地址和合约
广播者网络(Waku) 点对点 否 加密交易消息;对等节点可能观察到连接元数据
通过 OHTTP 访问的 Paymaster Anon 网关及独立中继 否 中继看到客户端 IP 和加密请求;网关看到解密后的请求及提交时间

头部 API 在分块封存之间让钱包保持更新。它接收区块或序列游标,也就是你在链上的同步位置,而非钱包内部的信息。因此,它透露的是“这个 IP 大约同步到了这里”,而不是“这些票据属于此人”。

PPOI 代理是独立的隐私路径。清白证明向聚合器查询从查看密钥派生的盲化承诺,这些请求针对特定钱包。当前代理可以缓存读取结果,并在缓存元数据中保留请求参数;对缓存键做哈希不会匿名化这些数据。运营方必须审查保留策略及网络元数据关联风险。参阅 PPOI 代理。批量历史路径没有钱包查询,POI 路径则有。

这不能防范什么

  • 时间与流量。 首次同步下载全部历史,与再次打开钱包时只下载最新部分,在网络上呈现不同模式。这大致泄露了“这个 IP 上次同步到区块 X 附近”,但不泄露哪些票据属于你。
  • 连接元数据。 直接接收连接的服务器可以观察其 IP 地址、时间及 TLS 元数据。OHTTP 中继将客户端连接与解密请求的网关分离,但中继仍能看到客户端 IP。
  • PPOI 路径上的盲化承诺,如上所述。

正确配置的 VPN 或 Tor 可以减少网络层暴露,但这会改变你信任的对象,并不能消除流量分析或针对特定钱包的应用层数据。

网络隐私不会消除请求中针对特定钱包的内容。

对于基于查询的索引器,泄露发生在应用层,用户除了不使用该钱包之外难以补救。统一、与内容无关的历史请求避免了这一特定筛选条件的披露。其他钱包请求及网络元数据仍需单独考虑。

权衡

这不是私密信息检索。这里没有用密码学隐藏请求,因为没有针对特定票据的请求需要隐藏:你只是下载整个隐私集并自行搜索。代价是带宽:首次同步会传输池的压缩历史,而不是少量匹配行。

对于这种工作负载,这一权衡是合理的。数据公开、不可变且对所有用户一致,因此非常适合缓存;成本按每个边缘位置的每个文件承担一次,而非每个用户承担一次,同时消除了一整类披露。但这仍是一种权衡,且只有分块选择不依赖用户数据时才成立。如果客户端根据钱包内容只获取“需要”的范围,就相当于以更慢的形式重新引入了查询。因此,分块边界仅由区块高度决定。