之前见 @quake 发过 obscell-wallet—— 一个跑在终端里的 CKB 隐私钱包(隐身地址 + 机密交易)。那版要下载二进制、装 Rust 工具链,对只想 “点开看看” 的人来说门槛有点高。于是我把同一个协议重写成了浏览器版:Obscell Web Wallet。纯前端,打开网页就能用,链上数据和 TUI 版完全互通。
在线体验:https://obscell-web.pages.dev
背景与致谢
先感谢 @quake(TUI 版 obscell-wallet 的作者)和 @Rea-Don-Lycn(obscell 合约原作者)。web 版不发明新协议:stealth 地址的 ECDH、CT 的 Pedersen 承诺、Bulletproofs 范围证明,全部沿用原版设计,协议参数逐位对齐。所以两个钱包读的是同一份链上数据 ——TUI 版收到的钱,web 版能扫到;web 版发的 CT 交易,TUI 版也能解开。
它是什么
一个完全跑在浏览器里的 CKB 隐私钱包:
-
隐身地址:收款地址可以反复使用,但每次收款链上都会出现一个不同的一次性地址;付款方用你的 view_pub 做一次 ECDH 派生,链上观察者无法把这个地址和你的收款记录关联起来
-
机密代币(CT):金额用 Pedersen 承诺隐藏,链上只看到
C = v·G + r·H,看不到数值 -
Bulletproofs 范围证明:保证金额非负且在有效范围内,同时不泄露数值
-
代币发行与铸造:支持创建带供应上限的隐私代币(创世 + 增发)
-
HD 钱包:BIP39 / BIP32 派生,多账户,助记词可导出恢复
-
无后端、无索引器:浏览器直连公共 CKB 节点,扫描、解密、签名全部在本机完成
-
密钥不出浏览器:seed 用 Argon2id 加密后落 IndexedDB,空闲自动锁定
-
中英双语界面
实现上几个值得说的点
Bulletproofs 证明生成用 WASM,且与合约同源。 ct-token-type 合约强制要求每笔 CT 转账携带范围证明,而证明的 transcript(标签、生成元、位数)必须和合约逐字节一致,任何一处对不上都只会表现为 “合约拒收”,而且只有真发一笔才知道。所以我没有手写 JS 复刻,而是直接把与合约同一份的 zkcrypto bulletproofs 5.0.1 编成 wasm 加载。ABI 里还带参数版本号(32 位 / 64 容量),加载时当场校验 —— 免得浏览器缓存里挂着一份旧 wasm,等到发交易那一刻才收到一个含义模糊的 InvalidRangeProof。
没有索引器,靠增量扫描。 浏览器直连 RPC 拉 block range,本地逐个 cell 做 ECDH 判定 —— 只有持有 view_key 的人才能匹配成功,所以这一步天然只能在用户自己的浏览器里做。扫描带游标和 24 块重组保护带,每 60 秒自动补一次新增区块;页面切到后台或正在输入时跳过,回到前台立刻补。没有索引器意味着没有第三方知道你扫了哪些块。
发送前的 “披露面板”。 隐私钱包和普通钱包最本质的区别,是发送前要清楚 “这一笔会让链上观察者知道什么”。确认页会明确列出:这笔交易的 inputs 有没有混花 “别人转来的” 和 “自己的找零”、有没有把多笔不同来源的收款混在一起花(一次性地址的不可关联性会被自己抹掉)、收款方是不是可关联的普通 CKB 地址、找零有没有回到新的隐身地址。来源判定只信本地记录,判不出来就标 unknown,不猜。
现状与已知边界
-
目前只在 testnet 可用。 实测 testnet 上四个合约全部在位(stealth-lock /ct-info-type/ct-token-type /ckb-auth),mainnet 上 0/4—— 主网还没部署这套合约,所以隐私功能暂时上不了主网。普通 CKB 转账在主网是没问题的,但 stealth 和 CT 要等合约先部署。
-
不是 Chrome 扩展。评估过可行性(现有产物塞进 MV3 就能跑),样式也按 “可直接迁移到扩展” 的约束来写,但第一版先做网页。
-
仍然是早期版本,欢迎试用、报 bug、提意见。
链接
-
Web 钱包(在线体验):https://obscell-web.pages.dev
-
原版 TUI 钱包:https://github.com/quake/obscell-wallet
-
智能合约(从 Rea-Don-Lycn/obscell 分叉):https://github.com/quake/obscell