如何存储 DID 文档?
解读
DID(去中心化标识符)文档本质是一份 自描述的 JSON-LD 对象,需要满足 不可篡改、可验证、可解析 三大特性。国内落地时,既要符合 《区块链信息服务管理规定》 的备案要求,又要兼顾 等保 2.0 对数据完整性、访问留痕的硬性指标。CouchDB 的 多主复制 + 文档版本控制 + 签名验证中间层 恰好能在不引入链上高额成本的前提下,提供可审计、可离线、可横向扩展的 DID 存储方案。面试官问“如何存”,核心想看候选人能否把 DID 规范、国内合规、CouchDB 特色 三者无缝串起来,而不是简单“把 JSON 塞进去”。
知识点
- DID 文档结构:@context、id、verificationMethod、authentication、service、created、updated、proof 七要素,proof 字段必须含 creator、signatureValue、type,且签名值需使用 SM2/SM3 国密算法 才能通过国密验收。
- CouchDB 原子级版本控制:_rev 采用 MVCC 树,同一 id 只能顺序追加版本,天然防“双花”式篡改;配合 update_handler 可在写入前强制校验 proof 字段签名。
- 国内合规要点:
- 数据不出境:CouchDB 集群通过 异地多活 + 专线同步 实现“三中心五节点”部署,_replicator 过滤规则 把境外 IP 一律拉黑。
- 敏感字段加密:verificationMethod 的 publicKeyPem 走 SM4-CBC 加密后存入同名附件,attachment stub 只保留 content_type 与 length,降低撞库风险。
- 操作审计:利用 /_db_updates feed 把每次 _changes 事件实时推送到 国密版 ELK,保留 6 个月以上原始日志,满足等保 2.0 三级要求。
- 性能调优:DID 解析热点高,可预生成 视图索引
并开启 q=8、n=3 的分片策略,把热点 DID 均匀打到不同节点,单次查询 P99 延迟 < 30 ms。function (doc) { if (doc.id && doc.proof) emit(doc.id, { _rev: doc._rev, created: doc.created }); } - 离线同步: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 内置字段冲突。 - 在文档顶层保留
@context、id、created、updated,把敏感 publicKey 以附件形式加密存储,正文只保留verificationMethod的 ID 引用,减少主文档体积 40% 以上。
第二步,写入流程:
- 业务系统先本地计算 SM2 签名,生成
proof对象; - 调用 update_handler=did_verify,函数内部使用 国密版 Node.js 扩展 验签,验签失败直接抛 403;
- 验签通过后,update_handler 自动补全
updated时间戳与新的 _rev,并写入数据库; - 返回 201 响应,携带
Etag: "rev",供客户端缓存。
第三步,读取与解析:
- 对外提供 /_view/did/resolve,key=did 字符串,include_docs=true,stable=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 万,完全满足省级互联网身份平台上线要求。
拓展思考
- 多链锚定:若客户要求“链上存证、链下存文”,可把 CouchDB 每次写入后的 SM3 摘要 通过 长安链 SDK 异步写链,一笔交易批量锚定 500 个 DID,成本降低 95%;同时 _changes feed 监听摘要上链状态,失败自动重试 3 次,保证 最终一致性。
- 隐私增强:未来若引入 BBS+ 签名 实现选择性披露,可在 show_function 里动态裁剪返回字段,CouchDB 侧只存完整文档,对外只暴露经过零知识证明的视图,既满足 W3C VC 规范,又符合《个人信息保护法》最小够用原则。
- Serverless 弹性:使用 Tencent Cloud CouchDB 托管版,自动伸缩分片 q 值,夜间低峰缩到 2 节点,白天高峰弹到 16 节点,综合成本节省 55%;结合 API 网关按量计费,初创公司也能在 1 周内上线 DID 解析服务,无需一次性投入硬件。