You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PII示例网络添加Doctor参与者后授权事务无法识别该角色的问题

嘿,我之前在类似的PII网络场景里碰到过一模一样的问题,咱们一步步来拆解问题、解决它:

问题核心原因

你的事务逻辑和模型定义还没跟上新增的Doctor参与者,导致系统依然只在Member集合里查找被授权人,完全没去Doctor注册表中匹配。


1. 先修正CTO模型的事务定义

原来的授权事务里,被授权人(grantee)的类型大概率被限定为Member,得把它改成兼容Doctor的类型:

  • 旧的事务定义可能是这样:
    transaction GrantAccess {
        --> Member grantor
        --> Member grantee
        String permissionLevel
    }
    
  • 如果你给Member和Doctor定义了一个父类(比如Person),直接把grantee类型改成父类即可:
    transaction GrantAccess {
        --> Member grantor
        --> Person grantee
        String permissionLevel
    }
    
  • 要是没定义父类,也可以用联合类型明确允许两种参与者:
    transaction GrantAccess {
        --> Member grantor
        --> (Member or Doctor) grantee
        String permissionLevel
    }
    

2. 更新事务处理器的查找逻辑

这是最关键的一步!原来的代码肯定只在Member注册表中查询,现在要改成能同时匹配Doctor:

  • 旧的处理器代码大概是这样:
    async function grantAccess(tx) {
        // 只查Member注册表
        const memberRegistry = await getParticipantRegistry('org.example.Member');
        const grantee = await memberRegistry.get(tx.grantee.$identifier);
        // 后续授权逻辑...
    }
    
  • 改成先查Doctor注册表,没找到再查Member:
    async function grantAccess(tx) {
        let grantee;
        try {
            // 优先查找Doctor
            const doctorRegistry = await getParticipantRegistry('org.example.Doctor');
            grantee = await doctorRegistry.get(tx.grantee.$identifier);
        } catch (err) {
            // 没找到则 fallback 到Member
            const memberRegistry = await getParticipantRegistry('org.example.Member');
            grantee = await memberRegistry.get(tx.grantee.$identifier);
        }
        // 执行授权逻辑,比如更新权限关联记录
        // ...
    }
    
  • 要是用了父类Person,更简单,直接查询父类注册表:
    async function grantAccess(tx) {
        const personRegistry = await getParticipantRegistry('org.example.Person');
        const grantee = await personRegistry.get(tx.grantee.$identifier);
        // 后续逻辑...
    }
    

3. 重新部署网络,确保变更生效

改完代码和模型后,必须重新打包、部署网络才能让修改生效:

  • 打包成BNA文件:composer archive create -t dir -n .
  • 安装更新包:composer network install --card admin@your-pii-network --archiveFile your-network.bna
  • 升级网络版本:composer network upgrade --card admin@your-pii-network --networkName your-network --networkVersion x.x.x
  • 另外要确认Doctor参与者已经通过composer participant add命令或API正确注册到网络中。

4. 验证客户端调用参数

最后检查一下:调用授权事务时传入的grantee确实是Doctor的ID,别不小心传成Member的ID——这种低级错误有时候也会造成“找不到Doctor”的假象。

这样调整之后,Member就能正常给Doctor授权/撤销权限啦!

内容的提问来源于stack exchange,提问作者Vipoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:57:06