一份 JSON 说清「哪条链、哪些方法、哪几个账户」:CAIP-217 授权作用域语法 图 1
一份 JSON 说清「哪条链、哪些方法、哪几个账户」:CAIP-217 授权作用域语法 · 图 1

一堆协议共用的那块积木

钱包给网站授权这件事,不同协议各讲各的流程:有的管怎么建会话,有的管一条命令该发到哪个网络。编号 217 的链无关协议(CAIP-217)不参与流程之争,它只回答一个更底层的问题:授权这件事本身怎么写成一个机器可读、无歧义的 JSON 对象。规范把它命名为作用域对象(scopeObject),作为积木供上层协议引用——会话建立协议 CAIP-25、命令路由协议 CAIP-27 都建立在它之上。提案按仓库原文处于 Draft(草案)状态,但它的语法已经渗透进你能在钱包弹窗高级详情里看到的字段结构里。理解它,等于拿到了解读各类授权请求的底层语法书。

一份 JSON 说清「哪条链、哪些方法、哪几个账户」:CAIP-217 授权作用域语法 图 2
一份 JSON 说清「哪条链、哪些方法、哪几个账户」:CAIP-217 授权作用域语法 · 图 2

基本形状:一个键,几个数组

语法骨架很直白:一个字符串键,值是一组数组。键有两种合法写法,要么是在命名空间登记处注册过的命名空间标识(比如笼统的 eip155 指所有以太坊系链),要么是一条具体的链标识(形如 eip155:1,命名空间加链编号,规则由 CAIP-2链标识应该怎么解析? 的 CAIP-2 定义)。值一侧有六个字段,其中方法(methods)与通知(notifications)为必备:前者是应用可以调用、或者代理可以反过来调用应用的 JSON-RPC 方法列表,后者是双方约定收发哪些 JSON-RPC 通知。四个可选字段里,账户(accounts)列出授权范围内的账户,每项是 CAIP-10账户ID为什么必须带链? 定义的带链账户标识;引用(references)、接口文档地址(rpcDocuments)与端点地址(rpcEndpoints)则服务于多链展开和能力发现这类进阶场景。

references 字段的三条红线

最容易读错的是 references(早期版本里叫 chains)。规范给它立了三条”MUST NOT / SHOULD”级约束,值得逐条消化。第一条:如果键已经写到具体某条链,这个字段绝不能出现——单链作用域再挂一串链引用属于自相矛盾。第二条:如果作用域覆盖的命名空间根本没定义链引用、或还没发布对应的链标识规范,它同样不许出现。第三条最烧脑:当键是覆盖整个命名空间、且该命名空间定义了链编号时,它应当在场;而一个空的 references 数组不能理解为”批准了该命名空间下所有链”,在补充条目之前它等于批准了零条链。换句话说,空数组是”暂时没有一条算数”,不是”全都算数”。把这一条读反,是把授权开大的经典事故路径。

空数组、零权限与”最小”到底长什么样

顺着上面的逻辑再看两个字段:methodsnotifications 的规范定义都是”零个或多个”,也就是说空数组合法、且含义就是零。一份合法的作用域对象完全可以长成”有键、有账户、方法列表为空”的样子——它表达的是”我让你知道这些账户在这里,但你一个调用都发不来”。这正是最小权限原则在语法层的落点:授权颗粒度不是有或无的开关,而是每链每字段的可调清单。用户在钱包授权弹窗的详情视图里如果能看到结构化信息,理想的呈现就应按链分块:这条链放开哪些方法(例如只读查询与要求签名的区别很大)、期望哪些通知(账户变化、链变化这类事件推送)、绑定哪些地址。凡是详情页含糊、只给你一个”连接”按钮就索取全部能力的站点,都应默认它索取过宽。

上层协议怎么消费它

对工程读者,217 的价值在于”一次定义、处处引用”:规范明确,任何链无关协议只要名字里带作用域对象且依赖清单里指向 217,就必须按本文的语法解释。于是会话生命周期家族共享同一份词汇表——建会话时的请求与回执各带一份作用域清单,会话存续期间任何授权变化通过事件传全量新清单(你在钱包里改了权限,网站凭什么知道:CAIP-311 的会话变更广播事件),查询接口原样返回这份清单(网站记忆和钱包实况对不上?CAIP-312 给会话权限装了一个查询接口),撤销则整套作废(点下「撤销连接」之后发生了什么:CAIP-285 与 wallet_revokeSession 的协议动作)。同一份 JSON 在四种流程里形状一致,应用与钱包只需实现一套解析。命名空间细节、隐式默认值允许由各命名空间的专属档案另行规定,所以同一段 JSON 在以太坊系与在其他生态的解读规则可能存在细微差异,核对时以对应命名空间的登记页为准。

普通用户的三段用法

不写代码的用户也能把这套语法变成核对习惯。第一段,看键:授权请求覆盖的到底是”某条链”还是”一整个命名空间”,后者意味着范围靠引用列表展开,空引用列表应当被理解为零条链,遇到整命名空间作用域先追问为什么。第二段,看方法:转账类、签名类、纯读取类是三档不同的信任级别,eth_call 之类只读方法和 eth_sendTransaction 这种花钱方法混在一起打包索取时,值得逐条剔除。第三段,看账户:授权账户列表里出现的每一个带链地址(形如 eip155:1:0x…,规则见 CAIP-10账户ID为什么必须带链?)都应是刻意选择的结果,不是你名下所有账户的自动汇总。三段都核完再签名,比事后撤销省心得多——事后清单管理的路径在 钱包连接过的网站清单怎么清:断开连接和撤销授权是两件事 里整理过。需要强调:作用域授权管的是”网站能否向你发起请求”,你在弹窗里仍然保有逐笔确认权;真正跳过确认的自动签名属于另一类会话密钥机制,风险模型完全不同,不要把两者当成同一件事。