Iroha非admin账户转账报错STATEFUL_VALIDATION_FAILED如何解决?
Iroha TransferAssets 状态验证失败排查方案
1. 提取详细错误根因
默认Iroha节点不会输出状态验证失败的具体原因,首先修改节点配置中的log_level参数为debug,重启节点后重新发起转账交易,检索节点日志中STATEFUL_VALIDATION_FAILED关联的上下文条目,即可获取具体错误码,定位问题类型。
2. 校验角色权限配置
- 确认
user角色的can_transfer、can_receive权限是否绑定了正确的域名与资产范围,绝大多数同类问题都是权限配置时未指定test域名下的对应资产,仅配置了全局权限名,导致普通用户的权限无法在目标域名下生效 - 确认
admin@test是否额外持有root或transfer_all全局权限,admin账户可通过全局权限豁免普通用户的权限校验逻辑,所以不会触发报错
3. 校验交易构造逻辑
检查用iroha-helpers构造转账交易的传参是否存在以下问题:
// 常见错误示例 const transferTx = await irohaHelper.transfer({ fromAccountId: 'userA', // 遗漏@test域名后缀 toAccountId: 'userB@test', assetId: 'xxx#test', amount: '10', privateKey: userA.privateKey.trim() // 私钥多了空格/格式错误 })
如果admin账户的交易构造逻辑是单独封装的,不存在上述传参问题,就会出现仅admin可正常转账的情况。
4. 校验账户签名配置
查询userA@test的账户详情,确认其签名阈值是否为1:如果配置了多签规则,签名阈值大于1但构造交易时仅传入了1个有效签名,也会触发状态验证失败。admin账户默认签名阈值为1,因此不会触发该问题。
验证与修复
可以临时给userA@test授予全局transfer权限,如果此时转账成功,即可确认是之前的user角色权限配置遗漏了作用域,重新调整权限的域名、资产绑定规则即可解决。
内容的提问来源于stack exchange,提问作者Alexander V.
相关产品推荐
相关产品推荐

