
SSP 中继能看到什么,又看不到什么
SSP 是一个双设备钱包。你的浏览器扩展持有一把密钥,你的手机持有另一把,任何一方都无法单独动用资金。但这两台设备必须彼此通信,而它们是通过一台由我们运营、被称作中继的服务器来做这件事的。
那台服务器正是提出一个令人不适的问题的合适场所:如果一切都经由钱包公司运营的基础设施,那么这家公司究竟看到了什么?
这是个公允的问题,它值得一个具体的答案,而不是一个安抚性的答案。所以,以下是代码里实际存在的东西。
中继无法签署任何东西
先从最要紧的部分说起。
中继从不接收私钥。不是加密的,不是分片的,任何形式都没有。你的钱包密钥留在浏览器扩展里,密钥应用的密钥留在手机上,而穿过网络的只有公钥、未签名的数据,以及已经在你的设备上生成好的签名。
这不是一项政策承诺,而是一项结构性承诺。二取二多重签名要求两个签名才能动用资金,而中继一把密钥也没有。一个彻底恶意的中继——我们的、被攻陷的,或被攻击者替换掉的——依然无法产出一笔有效交易,因为产出它需要从未发送给它的秘密。
这就是那项保证。接下来的一切,讲的都是中继确实经手的东西——一个更窄、但确实非空的集合。
什么会经过它,又停留多久
中继保存四类记录。其中两类会自我删除。
同步数据,在你配对两台设备时产生。它携带链、你的钱包身份、密钥应用的扩展公钥、由此得出的 WK 身份、公开随机数、生成的地址,以及带签名的恢复用 xpub。
操作数据,在你签署某样东西时产生。它携带链、派生路径、你的 WK 身份、操作类型、载荷本身,以及相关的 UTXO。
这两个集合在 MongoDB 里都有一个 TTL 索引,设定为 expireAfterSeconds: 900。十五分钟。无论别的事情是否发生,数据库都会删除该记录——它不是某个人得记着去跑的清理任务,也不是隐私政策里的一句承诺。它是一个索引,由数据库本身强制执行。
推送通知令牌,以便在有东西需要批准时能唤醒你的手机。这些会持续存在,因为一个每十五分钟就过期的通知令牌毫无用处。
恢复用 xpub,每个身份一个,完全没有有效期。这是刻意的,代码里就是这么写的:它的存在是为了让钱包在任何需要的时候都能取到它,而不是只能在两个应用碰巧同时醒着的那些短暂窗口里。
我们应当直说的那部分
再看一眼那份同步载荷。它包含一把扩展公钥。
xpub 不是花费密钥,无法授权任何交易。但它绝非无关紧要。从一个账户的 xpub 可以推导出该账户将会用到的每一个地址,这意味着持有它的人能够观察那条链上的全部余额与交易历史。那是对你在该账户上的财务生活的读取权限——恰恰是链上隐私所依赖于避免的那种关联。
操作载荷同样真实。在你签名期间,中继经手着这笔未签名交易:钱去往何处、金额多少、来自哪些输出。
所以诚实的总结不是「中继什么也看不见」。而是:
中继无法花掉你的钱,而在每次十五分钟的时间里,它能看到你正拿这笔钱做什么。
十五分钟的窗口就是那项缓解措施,而且是有分量的一项——它限制了在同一个地方能积累多少历史。但在那个窗口之内,数据就在那儿,我们宁愿把这话说明白,也不愿让「非托管」去承担它并未挣得的修辞工作。
值得借鉴的设计原则
恢复服务里有一句注释,它对架构的刻画胜过任何示意图:
钱包会用自己推导出的身份公钥去校验那个签名,所以这个存储并不被信任。
恢复用 xpub 与 SSP Key 对其生成的一个分离签名一同保存。当钱包取回它时,钱包会独立地推导出身份公钥,并自行校验该签名。如果中继返回了一把不同的 xpub——无论是因为被攻陷、因为缺陷,还是出于蓄意替换——签名都不会通过校验,钱包会予以拒绝。
依赖中继的软件把它当作一条不可信的管道来对待。在自己运营的基础设施之上构建时,这才是正确的方式,因为它意味着你自己的服务器出错,不会变成你用户的麻烦。这也是评估任何钱包时该寻找的模式:不是「他们承诺规矩行事吗?」,而是「如果他们的服务器不规矩,会发生什么?」。
一个怀有敌意的中继实际能做什么
对真实威胁模型值得说得具体些。
它可以观察。 在 TTL 窗口之内,看到你的 xpub 和你待处理的交易。那是隐私层面的暴露,不是被盗的风险。
它可以审查。 拒绝在你的设备之间传递消息,这会让你无法按常规流程签署新交易。恼人且具破坏性——但与失去任何东西不是一回事。你的密钥依然是你的,你的资金依然在链上,而恢复路径的存在,恰恰是因为中继有可能不在。
它可以撒谎,而且多半会失败。 替换恢复用 xpub 会被上文描述的签名校验挫败。这正是那道校验之所以重要的原因。
它无法签名。 没有密钥,就没有签名,也就没有交易。
现实中最坏的情形是监视与干扰,而不是损失。相比托管服务——那里对应的最坏情形是钱没了——这是一个明显更好的处境。它不等同于「谁都看不到任何东西」,而把这两者混为一谈,正是人们对自身隐私形成错误图景的方式。
对于可见的那部分,你能做什么
弄清配对会暴露什么。 同步一条链,意味着该链的一把 xpub 会途经中继。这是双设备设计得以运作的代价。
记住窗口很短,但不为零。 每次操作十五分钟是一个上界,而不是不存在。
把恢复用 xpub 当作永久的。 按设计它不带有效期地保存,而且它是附有可校验签名的公钥材料——但它是持久的,你应当知道这一点,而不是某天发现它。
评判架构,而不是评判保证。 关于任何钱包服务器的有用问题,不是这家公司是否承诺审慎。而是:如果服务器撒谎,软件能不能察觉。我们的软件校验签名,而不是信任响应,而这一点你可以在代码里读到,不必听我们的一面之词。
我们最希望被理解的,是这笔交换的形状。双设备钱包需要一条协调通道,而协调通道是元数据汇聚之处。我们已用数据库强制的过期时间对它加以限制,并把客户端设计成不信任服务器——但诚实的版本是:中继确实短暂地看到了真实的东西,而再周密的架构也无法把这个数字变成零。


