ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Olares 中的去中心化标识符(DID):从助记词到链上身份的自生成机制

Olares 中的去中心化标识符(DID):从助记词到链上身份的自生成机制
  • 云原生
  • 后端
  • 运维

【免费下载链接】Terminus

Open-Source Personal Cloud OS for Always-On Agents

项目地址:https://gitcode.com/gh_mirrors/terminus2/Terminus
点击查看免费下载

去中心化标识符(Decentralized Identifier,DID)是 Olares 个人云操作系统身份体系的地基:它无需任何中心化注册机构即可全球唯一、可验证地标识一个主体,并在 Olares ID 中通过"助记词 → 私钥 → 公钥 → DID 链上地址"的自生成流程落地。本文以 docs/zh/developer/concepts/did.md 为核心脉络,结合仓库中 cli/pkg/wizard/did_key_utils.go 与 cli/pkg/web5/dids 的源码实现,完整讲清 DID 的结构定义、派生算法、实际应用与安全注意事项。

DID 是什么:自主、全球唯一、可验证的标识符

去中心化标识符(DID)由 W3C DID Core 规范定义,是一种自主管理(self-sovereign)、全球唯一且无需中心化注册即可验证的标识符。DID 可以指向任何主体——个人、组织、物品、数据模型或抽象实体,具体指向什么由它的控制者(Controller)决定。

DID 的核心目标是让个人与组织掌控自身身份信息,并可在无需第三方介入的前提下,选择性且安全地共享这些信息。在 Olares 中,这一理念被进一步落到产品形态上:Olares 以 DID 与区块链注册表为支柱,构建了去中心化、可点对点直接交换信息与价值的自主权网络(详见 docs/developer/concepts/self-sovereign-network.md)。

DID 的三段式结构

一个完整 DID 由三部分组成:

组件说明
DID URI 方案标识指明标识符的格式(固定为did)
DID 方法标识指定用于创建 DID 的协议 / 方法(如key、jwk、dht、web)
方法专属标识(Method-Specific ID)方法内部唯一标识

以仓库中 Olares 实际生成的did:key:z...为例:did是 URI 方案标识,key是方法标识(表示该 DID 由公钥本身直接派生,无需链上注册即可离线解析),z...是方法专属标识——一串以z开头的 Base58btc 编码字符串。

从源码层面看,cli/pkg/web5/dids/did/did.go 中的DID结构体完整建模了这段语法:除了URI、Method、ID三个核心字段外,还支持可选的参数(Params)、路径(Path)、查询(Query)与片段(Fragment),并严格遵循 W3C DID Core 的 ABNF 语法规则(did.go 中的正则定义)对任意 DID URI 进行解析。Parse函数会按^did:<method>:<method-specific-id>...的模式拆分输入,解析失败时返回invalid DID URI错误。

Olares ID 中 DID 的派生流程

在 Olares ID 中,DID 通过类似区块链地址的助记词算法自生成,整个流程可以概括为一条单向链:

助记词 → 私钥 → 公钥 → DID 链上地址

第一步:助记词(Mnemonic)

随机生成的 12 个英文单词,用于派生私钥。它是一切身份密钥的种子,也是账户跨设备迁移与恢复的唯一凭证。

仓库实现位于 cli/pkg/wizard/did_key_utils.go 的GenerateMnemonic():通过 BIP39 标准生成 128 位熵,再由熵生成 12 单词助记词。也就是说,12 个单词对应 128 bit 随机熵,保证全球唯一性与足够的暴力破解难度。

// GenerateMnemonic generates new BIP39 mnemonic func GenerateMnemonic() string { // Generate 128 bits of entropy for 12-word mnemonic entropy, err := bip39.NewEntropy(128) ... mnemonic, err := bip39.NewMnemonic(entropy) ... return mnemonic }

第二步:私钥(Private Key)

私钥由助记词派生,需妥善保管;它用于生成公钥与链上地址。泄露私钥等于交出整个身份的控制权。

源码中,NewHDWalletFromMnemonic 先用bip39.IsMnemonicValid校验助记词合法性,再用bip39.NewSeed生成 64 字节种子;随后 getMasterNode 以"ed25519 seed"作为 HMAC-SHA512 密钥对种子做 HMAC 运算,取哈希前 32 字节作为私钥种子、后 32 字节作为链码——这正是 BIP32 分层确定性(HD)钱包主节点生成的实现方式,模拟了 Trust Wallet Core 的行为。最终通过ed25519.NewKeyFromSeed得到完整的 Ed25519 私钥对。

第三步:公钥与链上地址

公钥由私钥计算得出,可公开分享;链上地址用于 DID 注册。在 Olares 中,这一步由 createDIDFromPublicKey 完成,产出标准的did:key地址:

  1. 取 Ed25519 公钥(32 字节);
  2. 将 multicodec 标识0xed(Ed25519 编解码器 ID,常量定义见 did_key_utils.go)用 varint 编码后与公钥拼接;
  3. 对拼接结果做 Base58btc 编码并加前缀z;
  4. 最终得到形如did:key:z6Mk...的链上地址。
func createDIDFromPublicKey(publicKey ed25519.PublicKey) (string, error) { codecBytes := varint.ToUvarint(ED25519_CODEC_ID) idBytes := make([]byte, len(codecBytes)+len(publicKey)) copy(idBytes, codecBytes) copy(idBytes[len(codecBytes):], publicKey) id := base58.Encode(idBytes) return fmt.Sprintf("did:key:z%s", id), nil }

仓库还以GetDID、GetPrivateJWK、GetPublicJWK三个便捷函数分别暴露"助记词 → DID 地址 / 私钥 JWK / 公钥 JWK"的完整派生入口(见 did_key_utils.go),并生成带KID(格式为did:key:z...#z...)、ALG: EdDSA、CRV: Ed25519、KTY: OKP、USE: sig的标准 JWK 密钥对,可直接用于 Web5 体系的签名与验证。

从 Web5 SDK 看 DID 的创建、解析与文档结构

除了向导侧的自生成实现,Olares 还内置了一套完整的 Web5 DID 工具包(cli/pkg/web5/dids),按"每种 DID 方法一个独立包 + 统一解析器"的原则组织:

  • cli/pkg/web5/dids/didkey/didkey.go 的Create()默认使用LocalKeyManager与 Ed25519 算法生成密钥,进而产出did:key及其 DID Document。通过函数式选项(KeyManager、AlgorithmID)可以替换密钥管理后端或算法;
  • cli/pkg/web5/dids/didkey/key.go 的KeyToID()与上述createDIDFromPublicKey采用完全一致的编解码约定:multicodec0xed+ Base58btcz前缀;
  • cli/pkg/web5/dids/didcore/document.go 实现了 W3C DID Core 的全部数据结构,包括Document、VerificationMethod、Service以及assertionMethod、authentication、capabilityDelegation、capabilityInvocation、keyAgreement五类验证用途。创建 DID 时,createDocument会把公钥同时挂到前四类用途上,供签名、登录认证、能力委托与调用使用;
  • cli/pkg/web5/dids/resolver.go 提供单例 DID 解析器Resolve(),先按语法解析 URI,再按方法分发到对应解析器;对未注册的方法返回methodNotSupported,语法错误返回invalidDid。

DID 在 Olares 中的实际应用

DID 不是停留在概念层的抽象,而是贯穿用户初始化、签名认证与数据存储的关键标识:

  • 用户密钥存储:NewUserStore(mnemonic, terminusName)会从助记词一次性派生出 DID 与公私钥 JWK,并保存在UserStore中(见 cli/pkg/wizard/user_store.go),此后GetDid()、GetPrivateJWK()供各业务模块直接取用;
  • 签名与认证:UserStore.SignJWS()将私钥导入LocalKeyManager,重建BearerDID与 DID Document,然后以 DID URI 作为 JWT 签发者(Issuer)调用 Web5 JWT 签名(见 user_store.go),实现真实密钥签名的 JWS 凭证——这是 Olares 中身份证明与授权的基础;
  • 数据隔离:用户的应用状态以 DID 为命名空间存储,如 cli/pkg/wizard/app_state.go 中app-state-<did>的存储 ID 设计,以及 cli/pkg/wizard/app.go 日志中account.did与 CLI 侧mv.id的一致性校验,都表明 DID 是用户数据归属与校验的核心键;
  • 链上注册与名称解析:创建 Olares 用户前,CLI 会通过 cli/cmd/ctl/settings/users/did_precheck.go 对user@example.olares.com形式的 Olares ID 做 DID 网关预检(域名后缀为olares.cn走api.olares.cn/did,否则走api.olares.com/did)。若网关返回failed to resolve did,则表明该身份尚未在区块链上成功解析注册(见 did_precheck.go)。

Olares ID 与 DID 的关系

DID 解决了去中心化网络中的身份难题,但did:key:z6Mk...这种长串对人类而言难以记忆和使用。因此 Olares 在 DID 之上封装了Olares ID——一种类似邮箱地址的易记标识(如alice123@olares.com),既保留了 DID 的密码学可验证性与去中心化特性,又做到了人性化、易分享(详见 docs/developer/concepts/olares-id.md)。

每个 Olares ID 都绑定一个 DID:用户使用 Olares 创建账户的同时,DID 即随之生成。账户在其生命周期内会经历"未绑定"与"已绑定"两个阶段——未绑定阶段已在本地产出助记词、私钥与 DID,但尚无 Olares ID;此时即可导出备份助记词,并借助助记词在其他设备导入账户,实现跨设备统一认证(见 docs/developer/concepts/account.md)。

安全注意事项:妥善保管私钥与助记词

:::warning 重要 请务必妥善保管私钥与助记词,避免泄露并确保可恢复性。 :::

这条警告背后是两层现实约束:

  1. 不可逆性:派生链是单向的(助记词 → 私钥 → 公钥 → DID 地址),但反向不可推导。丢失助记词意味着丢失私钥与整个身份;而助记词泄露则意味着任何持有者都能重建私钥并冒充该身份;
  2. 去中心化的代价:DID 体系没有中心化机构可以挂失或重置。与邮箱密码可找回不同,DID 身份的恢复完全依赖助记词的妥善备份——这也是 Olares 账户体系将"导出并备份助记词"作为未绑定阶段首要操作的原因。

实践中建议:将助记词离线备份(如抄写在纸上并妥善存放于安全位置),切勿以明文形式存储于易失介质或通过网络传输,并优先配合密码管理器或硬件钱包保管私钥材料。

小结

从 W3C 的三段式语法,到 Olares 中"12 词 BIP39 助记词 → HD 钱包派生 Ed25519 私钥 → multicodec + Base58btc 编码生成did:key链上地址"的完整实现,DID 为 Olares 提供了自主、全球唯一、密码学可验证的身份基石。它与易记的 Olares ID 互为表里,共同支撑起签名认证、用户数据隔离、链上注册解析等关键环节。理解这条派生链,是深入理解 Olares 身份体系与去中心化网络设计的起点。

延伸阅读(仓库内):

  • DID 概念文档 与英文版 docs/developer/concepts/did.md
  • Olares ID 概念文档
  • 助记词派生实现
  • Web5 DID 工具包说明
  • DID 解析器 与 DID Document 数据结构
  • 云原生
  • 后端
  • 运维

【免费下载链接】Terminus

Open-Source Personal Cloud OS for Always-On Agents

项目地址:https://gitcode.com/gh_mirrors/terminus2/Terminus
点击查看免费下载

相关推荐

上一篇:Repomix Explorer Skill 实战指南:让 Claude Code 等 AI 助手用自然语言探索任意代码仓库
下一篇:像老乡鸡那样做笋子烧肉:CookLikeHOC 菜谱还原与烧肉汁标准化解析

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进