Tokens SDK 1.2.2:Corda4.6下保密代币操作添加Observer节点出错问题
根因分析
- 该报错的核心原因是保密代币(Confidential Token)的持有者采用匿名身份标识,观察者节点未收到对应匿名身份的证书链,无法解析出持有者的合法X500名称,导致向Vault数据库插入代币数据时,
HOLDER字段为空违反非空约束。 - 交易本身能正常完成是因为代币的实际持有方已经同步了完整的身份证书链,可以正常解析并存储代币状态,只有未拿到身份数据的观察者节点会触发异常。
解决方案
方案1(推荐,改动最小)
调用相关保密代币流时,显式将观察者节点传入流的observers可选参数:
ConfidentialIssueTokens、ConfidentialMoveFungibleTokens、ConfidentialMoveNonFungibleTokens三个流均原生支持observers入参,传入观察者节点的Party对象列表后,流会自动将交易涉及的所有保密身份证书链同步给对应观察者,观察者即可正常解析持有者信息,完成代币状态入库。- 如果你是基于上述流做了二次封装,需要确保
observers参数可以从你的自定义流透传到底层的Tokens SDK流。
调用示例:
// 发行保密可替代代币时传入观察者参数 val issueFlow = ConfidentialIssueTokens( tokens = toBeIssuedTokenList, observers = listOf(observerParty) ) subFlow(issueFlow)
方案2(适用于不需要观察者识别持有者身份的场景)
如果业务要求观察者不能获取代币持有者的真实身份,可以调整观察者节点接收Finality交易的存储策略:
- 观察者调用
ReceiveFinalityFlow时,指定statesToRecord参数为StatesToRecord.ONLY_RELEVANT,此时观察者只会存储自己是参与方的状态,不会存储不相关的代币状态,自然不会触发字段约束报错。 - 若需要观察者留存交易但不解析代币schema,可以自定义代币状态的持久化逻辑,跳过
HOLDER字段的非空校验,该方案需要修改对应代币实体的JPA注解,不推荐新手使用。
验证方式
修改完成后重新运行测试,观察者节点日志无数据库约束报错,对应流没有进入Flow Hospital,即可确认问题修复。
内容的提问来源于stack exchange,提问作者Tywin Lannister
相关产品推荐
相关产品推荐

