私密 Paymaster 中继
Anon 使用 Oblivious HTTP(OHTTP)分离钱包网络身份和 paymaster 请求。中继接收浏览器连接但无法解密;paymaster 解密处理请求,但连接来自中继而非浏览器。
隐私目标很明确:任何单一运营方都不应能将用户 IP 与提交给 paymaster 的交易请求关联。 OHTTP 不隐藏最终交易在链上公开的信息。
Wallet Independent relay Paymaster
| | |
| HPKE-encrypted request | |
|-------------------------->| opaque request |
| |----------------------------->|
| | decrypt, validate,
| | sponsor, and submit
| |<-----------------------------|
| encrypted response | |
|<--------------------------| |
sees: request + own IP sees: client IP + ciphertext sees: request + relay IP
私密请求包含什么
钱包在本地准备操作,包括已签名交易数据、零知识证明、费用报价和费用代币,将其编码为内部请求,用 paymaster 当前的 HPKE 公钥加密。
中继只收到 OHTTP 加密封装,无法读取交易、证明、费用代币、地址或加密响应。Paymaster 持有 HPKE 私钥,能打开封装。对私密 Railgun 操作,证明仍按协议保护屏蔽转账细节;中继增加浏览器连接与提交之间的传输层不可关联性。
请求流程
- 钱包预先配置中继 URL 及独立固定的 Ed25519 paymaster 签名密钥。生产值也发布在公知发现文档。
- 经中继获取
GET /ohttp-configs,使用固定签名密钥验证 HPKE KeyConfig,防止中继替换成其控制的密钥。 - Gas 报价和支持代币等不含身份的公开读取经中继获取,使用允许列表,可按 paymaster 的
Cache-Control缓存。 - 钱包用 HPKE 封装私密执行或状态请求,以
message/ohttp-req发送到POST /gateway。 - 中继向固定 paymaster 目标转发不透明封装,不从用户输入选目标,也不是开放代理。
- Paymaster 解密内部请求,验证证明、签名报价、费用和交易,再将接受的任务提交至链上。
- Paymaster 加密响应,中继仅转回
message/ohttp-res,无法读取。
各方能观察什么
| 参与方 | 可观察 | 设计上不可观察 |
|---|---|---|
| 钱包 | 自己的请求、密钥、响应、网络连接 | 其他用户活动 |
| 中继 | 客户端 IP、密文大小、时序、允许的公开读取路径和查询 | OHTTP 请求或响应明文;paymaster 私钥 |
| Paymaster | 解密请求、结果、时序、中继 IP | 在中继及入口移除客户端 IP 转发时的客户端 IP |
| 链上观察者 | 最终交易公开的数据和时间 | 传输中的 OHTTP 明文 |
安全保证
- 中继处的内容机密性。 HPKE 加密每个私密请求和响应;中继无解密或签名密钥。
- Paymaster 处的网络身份分离。 不转发客户端 IP 头的前提下,连接来自中继而非钱包。
- 抵御密钥替换。 客户端用在中继渠道之外固定的 Ed25519 密钥验证轮换 HPKE 配置。发现机制不替代固定信任锚。
- 密文完整性。 认证加密使被修改的密文验证失败。中继仍能丢弃、延迟或重放,因此应用必须安全处理重试。
- 受限转发。 固定目标、明确的公开读取路径、Go 服务的 1 MiB 请求上限及严格 OHTTP 媒体类型,确保它不是通用代理。
- 无浏览器凭据。 公开响应用通配符 CORS,不使用 cookie、授权头或浏览器凭据。
限制与假设
中继是分离信任的隐私工具,不是完整匿名网络。
- 中继和 paymaster 必须由不同且不串通的主体运营;合并观察结果可重新关联 IP 与请求。
- 全局观察者可按大小和时序关联两端流量,OHTTP 不提供混合网络式抗流量分析。
- 中继可记录 IP 和流量元数据,请按威胁模型选择独立性及数据政策合适的运营方。
- 直接调用 paymaster 会暴露网络地址;配置、公开报价、执行和状态请求均需经中继。
- OHTTP 不隐藏公开链元数据、时间、地址复用或交易本身披露的数值。
- 不保证可用性;中继可阻断、延迟、限流或选择性拒绝。
使用公共中继
Anon 提供兼容浏览器的 https://relay.anon.inc。当前 URL 和签名密钥可在 https://anon.inc/.well-known/anon-paymaster.json发现。
其他公共中继需满足:
- 指向您希望使用的 paymaster;
- 实现相同的
/ohttp-configs、/gateway、gas 报价及支持代币路由; - 允许客户端来源或提供兼容 CORS;
- 独立于 paymaster 运营;
- 具备可接受的可用性、日志与保留政策。
客户端不能将公共中继指向任意 paymaster。固定目标是防止开放代理的刻意设计;每个目标都需运营方配置并部署兼容实例。
自行运行中继
完整 Go、Docker 和 Cloudflare Worker 实现公开于 github.com/anondotinc/paymaster-relay,含测试、部署配置、健康检查和浏览器预检验证。
Go 与 Docker
Go 服务重新构造上游请求且不转发客户端头,提供最强的客户端 IP 分离,可运行于容器、虚拟机或 Kubernetes:
git clone https://github.com/anondotinc/paymaster-relay.git
cd paymaster-relay
docker build -t anon-ohttp-relay .
docker run --rm -p 8080:8080 \
-e OHTTP_GATEWAY_URL="https://paymaster.example.com" \
anon-ohttp-relay
在容器前终止 TLS,仅公开中继路由,设置合理的请求体和速率限制,避免记录请求体。
Cloudflare Worker
使用您控制的 Cloudflare 账户、区域及自定义域名部署。Fork 仓库后编辑 worker/wrangler.toml:
- 选择唯一的 Worker
name; - 替换自定义域名
routes[].pattern; - 将
TARGET设为目标 paymaster 的 HTTPS OHTTP 网关。
从仓库根目录部署并验证:
make cloudflare-login
make deploy RELAY_URL=https://relay.example.com
Cloudflare 在部署时管理自定义域名 DNS 与证书。
Cloudflare 客户端 IP 注意事项: 对非 Cloudflare 源站的 Worker 子请求,官方说明
CF-Connecting-IP包含客户端地址且 Worker 无法修改。Paymaster 入口必须在日志或应用处理前移除访客 IP 头。无法保证时请用 Go 中继。见 Cloudflare HTTP 头参考。
运营检查项
- 独立于 paymaster 组织运营。
- 仅指向预期的 HTTPS paymaster 网关。
- 不转发浏览器 cookie、授权值、用户代理或客户端 IP 头。
- 禁用请求和响应体日志,尽量缩短元数据保留期。
- 保持精确的 OHTTP 请求和响应媒体类型。
- 收紧公开读取允许列表,遵守上游缓存时效。
- 限流不应创建稳定的逐用户标识。
- 监控
/health,部署后验证/gateway浏览器预检。 - 公布 URL、运营方身份、日志政策及支持的 paymaster 目标。