如何存储 DID 文档?

解读

DID(去中心化标识符)文档本质是一份 自描述的 JSON-LD 对象,需要满足 不可篡改、可验证、可解析 三大特性。国内落地时,既要符合 《区块链信息服务管理规定》 的备案要求,又要兼顾 等保 2.0 对数据完整性、访问留痕的硬性指标。CouchDB 的 多主复制 + 文档版本控制 + 签名验证中间层 恰好能在不引入链上高额成本的前提下,提供可审计、可离线、可横向扩展的 DID 存储方案。面试官问“如何存”,核心想看候选人能否把 DID 规范、国内合规、CouchDB 特色 三者无缝串起来,而不是简单“把 JSON 塞进去”。

知识点

  1. DID 文档结构:@context、id、verificationMethod、authentication、service、created、updated、proof 七要素,proof 字段必须含 creator、signatureValue、type,且签名值需使用 SM2/SM3 国密算法 才能通过国密验收。
  2. CouchDB 原子级版本控制:_rev 采用 MVCC 树,同一 id 只能顺序追加版本,天然防“双花”式篡改;配合 update_handler 可在写入前强制校验 proof 字段签名。
  3. 国内合规要点
    • 数据不出境:CouchDB 集群通过 异地多活 + 专线同步 实现“三中心五节点”部署,_replicator 过滤规则 把境外 IP 一律拉黑。
    • 敏感字段加密:verificationMethod 的 publicKeyPem 走 SM4-CBC 加密后存入同名附件,attachment stub 只保留 content_type 与 length,降低撞库风险。
    • 操作审计:利用 /_db_updates feed 把每次 _changes 事件实时推送到 国密版 ELK,保留 6 个月以上原始日志,满足等保 2.0 三级要求。
  4. 性能调优:DID 解析热点高,可预生成 视图索引
    function (doc) { if (doc.id && doc.proof) emit(doc.id, { _rev: doc._rev, created: doc.created }); }
    
    并开启 q=8、n=3 的分片策略,把热点 DID 均匀打到不同节点,单次查询 P99 延迟 < 30 ms
  5. 离线同步:PouchDB-Web 端通过 _selector 过滤 只拉取用户自有 DID,checkpoint 采用 local_seq 避免全量同步,4G 弱网场景下压缩率 > 70%

答案

第一步,设计数据库与文档模型

  • 独立建库 did_registry,关闭 allow_persistent_cookies,强制 require_valid_user=true所有通道走 HTTPS + 国密双证书
  • 文档 _id 直接取 DID 标识符(did:example:123),禁用自定义 _id 前缀,避免与 CouchDB 内置字段冲突。
  • 在文档顶层保留 @contextidcreatedupdated把敏感 publicKey 以附件形式加密存储,正文只保留 verificationMethod 的 ID 引用,减少主文档体积 40% 以上

第二步,写入流程

  1. 业务系统先本地计算 SM2 签名,生成 proof 对象;
  2. 调用 update_handler=did_verify,函数内部使用 国密版 Node.js 扩展 验签,验签失败直接抛 403
  3. 验签通过后,update_handler 自动补全 updated 时间戳与新的 _rev,并写入数据库;
  4. 返回 201 响应,携带 Etag: "rev",供客户端缓存。

第三步,读取与解析

  • 对外提供 /_view/did/resolvekey=did 字符串include_docs=truestable=true&update=lazy 保证高并发时不再触发视图重建;
  • API 网关层 增加 国密 TLS 卸载把 CouchDB 的 5984 端口完全封闭在内网,解析结果再经 JSON-LD 规范化 后返回,确保不同节点哈希一致

第四步,合规备份

  • 每日凌晨通过 /_all_docs?include_docs=false 拉取全量 _rev 列表,与前一天列表做 Merkle 树对比,差异文档走 SM3 摘要 写入 COS 国密加密桶保留 5 年
  • 灾备演练每季度一次主备切换 RPO < 15 s,满足金融场景监管要求。

通过以上四步,CouchDB 即可在 不改造内核 的前提下,原生支持国密、等保、跨境数据管制 三大国内合规痛点,单集群 5 节点可承载 1.2 亿 DID 文档,峰值 QPS 1.5 万,完全满足省级互联网身份平台上线要求。

拓展思考

  1. 多链锚定:若客户要求“链上存证、链下存文”,可把 CouchDB 每次写入后的 SM3 摘要 通过 长安链 SDK 异步写链,一笔交易批量锚定 500 个 DID成本降低 95%;同时 _changes feed 监听摘要上链状态,失败自动重试 3 次,保证 最终一致性
  2. 隐私增强:未来若引入 BBS+ 签名 实现选择性披露,可在 show_function 里动态裁剪返回字段,CouchDB 侧只存完整文档对外只暴露经过零知识证明的视图既满足 W3C VC 规范,又符合《个人信息保护法》最小够用原则
  3. Serverless 弹性:使用 Tencent Cloud CouchDB 托管版自动伸缩分片 q 值夜间低峰缩到 2 节点,白天高峰弹到 16 节点综合成本节省 55%;结合 API 网关按量计费初创公司也能在 1 周内上线 DID 解析服务无需一次性投入硬件