网站记忆和钱包实况对不上?CAIP-312 给会话权限装了一个查询接口 图 1
网站记忆和钱包实况对不上?CAIP-312 给会话权限装了一个查询接口 · 图 1

一个真实感的场景:应用以为你有权限,钱包却不这么想

你大概遇到过这样的拧巴时刻:某去中心化应用显示”已连接”,还挂着上次授权的两个地址,你点操作却被钱包弹窗拒绝;或者反过来,你明明在钱包里把某条链的授权去掉了,网页界面还显示一切正常。这类”两边记忆不一致”的毛病,根源在于早期连接协议只规定怎么建立会话,没规定应用随时可以回头问一句”现在到底批了什么”。编号 312 的链无关协议(CAIP-312)就是来补这一问的:它给钱包定义了一个叫 wallet_getSession 的 JSON-RPC 方法,让调用方能主动拉取当前会话的真实授权状态。需要先说明状态:截至本文按原始文本仓库核验时,该提案仍是 Draft(草案),不是所有钱包都已实现。

网站记忆和钱包实况对不上?CAIP-312 给会话权限装了一个查询接口 图 2
网站记忆和钱包实况对不上?CAIP-312 给会话权限装了一个查询接口 · 图 2

方法的形状:一个可选参数,三种答案

规范给 wallet_getSession 的参数只有一个:sessionId,字符串、可选。围绕这一个参数,规则分了三条路径。传了 sessionId 且钱包认得:返回那个会话的授权详情。不传 sessionId、且恰好存在一个没有编号的活跃会话:直接返回这个会话的授权与属性。除此之外都算失败——规范明确写了失败时”绝不能返回成功结果”。三种失败情形分别是:传了钱包不认识的会话编号;没传编号、但钱包里所有活跃会话都带编号;钱包里根本没有活跃会话。对普通用户来说,这解释了为什么同一个网页有时能”恢复现场”、有时只能重新连接:钱包和你这台设备上的会话有没有可对齐的编号,决定了查询是成功还是撞墙。

返回值怎么读:sessionScopes 是一份分链清单

成功响应的核心是一个 sessionScopes 对象,它的组织方式复用编号 217 协议(CAIP-217)的作用域对象定义,每条链一个键。规范示例里能看到典型的三层结构:键是 CAIP-2 风格的链标识(比如 eip155:1 指以太坊主网,格式细节见 CAIP-2链标识应该怎么解析?),值里再列出允许调用的 methods(如 eth_signTransactioneth_sendTransaction)、期望的 notifications(如 accountsChanged)以及授权账户 accounts。同一次返回可以并列多条链,示例里以太坊主网、Polygon 和 Solana 各自维护一份互不相干的清单。这个”按链分账”的结构意味着:查询结果说某条链的 methods 是空的,那这个应用在你确认之前无法替你在那条链上发起任何交易,与它在别的链上有多少权限无关。

断线补查纪律:事件漏了就立刻查一次

规范还留了一条对开发者至关重要的话:如果钱包与调用方之间的连接断开、存在错过事件的可能,调用方应当立即调用 wallet_getSession 把当前作用域拉回来。这条纪律的来龙去脉和会话变更事件有关——钱包侧改了授权会通过 你在钱包里改了权限,网站凭什么知道:CAIP-311 的会话变更广播事件 广播全量新清单,但断线窗口内的事件可能整批丢失,所以”重连后先查一遍”被写成标准动作。对用户的意义是:一个遵守规范的网站在刷新或断网后应该悄悄校准权限,而不是继续显示过期的”你已授权”状态。如果你发现某站长时间拿着早已被你撤销的权限记账,那是它没有落实这类核对,属于可以给它降信任的信号。

安全考量:为什么要绑定域名或一对一通道

提案的安全章节明确建议:这类会话查询应当走”域名绑定”或其他一对一的传输通道,必要时再叠加 sessionId 绑定,防止未授权方窥探或劫持会话。背景是连接通道并不只有一种——浏览器扩展、移动配对、网页内嵌各行其道,跨渠道广播式的通道里,谁能问 wallet_getSession、谁拿到了答案,都是敏感问题。规范同时承认失败信息的表达要克制:除非应用被钱包视为可信对端,否则推荐只回”未知错误”这类泛化提示,避免把”你有哪些会话”变成可被外部探测的指纹。这与 点下「撤销连接」之后发生了什么:CAIP-285 与 wallet_revokeSession 的协议动作 里错误码分级是同一套设计哲学。

用户侧核对清单与边界

把这个规范落到你手上的操作,可以整理成四条。第一,重连老站点后若显示异常,优先在钱包的连接管理里核对该站当前授权,而不是凭网站界面做判断;两边记录谁说了算,答案永远是钱包侧,相关清理办法见 钱包连接过的网站清单怎么清:断开连接和撤销授权是两件事。第二,同一钱包连着多条链时,把返回清单按链逐个核对,特别留意 accounts 里出现的地址是不是你预期那个——同一句助记词在不同链可以派生不同账户,地址相同不代表余额相同。第三,查询失败不等于权限没了,三种失败原因里两种只是”编号对不上”,此时要求网站重建会话即可。第四,认清这是草案:没有 wallet_getSession 实现的钱包,靠的还是连接时一次性授权的静态记录,权限实况只能以钱包界面显示为准。最后提醒,会话授权只是”能不能请你签名”的门,不等于代币层面的支出授权,后者要用链上授权清单单独盘点,任何涉及资产的撤销操作都请以链上交易结果为准,本文不构成任何操作收益承诺。