Hyperledger Indy创建RevocationRegistry失败:credDefId格式异常
Hyperledger Indy 撤销注册表定义创建credDefId格式错误排查方案
报错信息:
reason -> client request invalid: InvalidClientRequest("Format of credDefId field is not acceptable. Expected: 'did:marker:signature_type:schema_ref' or 'did:marker:signature_type:schema_ref:tag'",)当前使用的入参:
- credDefId:
Th7MpTaRZVRYnPiabds81Y:3:CL:Th7MpTaRZVRYnPiabds81Y:2:gvt:1.0:Tag1- schemaId:
Th7MpTaRZVRYnPiabds81Y:2:gvt:1.0
核心原因
报错的本质是credDefId的格式与连接的Indy节点版本要求不匹配:
- 绝大多数部署的Indy节点(1.13及以下版本)要求credDefId中
schema_ref字段使用schema写入账本后分配的数字序列编号,而非完整的schemaId字符串 - 当前使用的credDefId直接将完整schemaId作为
schema_ref拼接,导致整体段数超出节点要求,触发格式校验失败 - 本地调用
Ledger.buildCredDefReq()生成的是临时预计算ID,并非写入账本后节点认可的正式ID,直接使用会出现格式不兼容问题
排查步骤
- 确认连接的Indy节点池的版本,核对节点配置中关于credDefId格式的兼容规则
- 核对credDef创建流程的后续处理逻辑:是否在credDef请求提交到账本并获得共识确认后,从返回的响应体中提取
id字段作为正式credDefId,而非直接使用本地生成的临时ID - 校验拿到的credDefId格式:符合1.13及以下版本节点要求的credDefId示例为
Th7MpTaRZVRYnPiabds81Y:3:CL:12:Tag1,其中第4段为schema对应的数字序列编号,而非完整schema字符串
解决方法
- 调整代码逻辑:提交credDef创建请求到账本后,等待节点返回共识成功的响应,从响应的解析结果中提取官方分配的
id值作为后续创建revRegDef的入参,不要使用本地构造credDef时生成的临时ID - 若使用1.14及以上版本节点,可在节点配置中开启完整schemaId作为credDefId组成部分的兼容开关,无需修改ID格式即可正常请求
- 若无法调整节点配置,也可手动拼接符合要求的credDefId:先查询对应schema在账本上的数字序列编号,替换当前credDefId中完整schemaId的部分即可
内容的提问来源于stack exchange,提问作者DeoxyribonucleicAcid
相关产品推荐
相关产品推荐

