母 DID 到子 DID 的授权

今天可离线自测

母 DID 可以为一个用途、一组资源和一段有效期授权一个受限范围的子 DID,并绑定一个 AI Agent。整条流程今天可以在离线环境演练;链上权威绑定、吊销与配额要等阶段 B 与《窗口参数》。

动线总体状态今天可离线自测

步骤

  1. 1子 DID 是什么:受限权限授权,不是一把独立密钥

    今天可用

    子 DID 是一个 did:msg,其文档的 controller 为 [<母 DID>],并带有一个 AididDelegation service 条目,承载授权 payload:用途、资源范围、有效期、绑定的 Agent 与状态。

    在阶段 A,子文档复用母 DID 的 Dilithium-5 密钥材料:它的验证方法指向母 DID 公钥。所以这是「受限权限的外包」,不是「密钥的外包」。绝不要把它描述成给 Agent 一把自己的生产密钥。

    own-key 模式(母 DID 以自身签名绑定 Agent 自己的 Dilithium-5 公钥)在协议层已存在、可离线验证,但默认 fail-closed,且没有链上绑定与吊销。

  2. 2在本地创建它,并跑离线 demo

    今天可离线自测

    RP SDK 里的离线 demo(examples/node/offline-demo.mjs 第 6 节)用真实 Dilithium-5 签名、全程无网络地走完整条流程:创建子 DID、母 DID 签名授权、以子 DID 登录(11 步校验全部通过)、委派闸门放行、范围外资源被拒、审计回执验签,最后撤销——身份仍然验证通过,但登录被拒(delegation_revoked)。

    如果没有本仓,可以安装已发布的 SDK,并从 tarball 里跑同一个 demo。

  3. 3在 RP 侧验证子 DID(第 12 步,fail-closed)

    今天可离线自测

    RP 侧校验复用登录的 11 步,再追加第 12 步:从已 resolve 的子文档里读取委派条目(没有条目就以 delegation_not_found 拒绝),然后按范围、有效期与预期母 DID 裁决 payload。

    SDK 提供 verifyDelegation 与 createDelegationVerifier。它不抛异常、也不降级放行。它需要两种信任来源之一:链上的子文档,或母 DID 对 canonical 委派文本的签名。对 own-key payload,除非调用方显式以 allowOwnKey: true 选择接受,否则一律拒绝,因为离线没有吊销通道。

    它不做额度计数、也没有 deny-list。scope.maxUsesPerDay 只是已声明的元数据,计数、限流与 deny-list 必须由 RP 自行实现。

  4. 4仍然被阻塞的部分:链上绑定、吊销与配额

    今天不可用

    目前没有「子 DID 绑定到某个 Agent」的链上权威登记,没有吊销原语(链上的 deactivate 不可逆,也没有黑名单),也没有被强制的配额。这些都要阶段 B——我们自己的身份合约——在《窗口参数》发布后部署才能承载。阶段 A 是通过链方自有的 registry 合约把授权写进子 DID 文档,而这次写入今天同样被阻塞。

    在那之前,请把每一次子 DID 授权当作本机安排:只能通过更新文档来停止引用它。对外保持一致口径——这是受限范围授权,不是一把独立的生产密钥。

    今天为什么被阻塞

    • chainWrite Chain write paths (and the stage-B identity contract) await the chain-side window parameters. Mainnet is No-Go and no contract is deployed.
    • independentAgentKey The protocol-level offline self-held key (the parent DID binds the agent's own Dilithium-5 public key with its own signature) is implemented and off by default — verifyDelegation is fail-closed unless the caller opts in with allowOwnKey. There is NO on-chain binding, NO revocation and NO quota, so production availability awaits stage B / the window parameters.

    原因取自 status.json#capabilities —— 不是为这个页面手写的。