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

Hyperledger Composer资产管理与可动态增减允许资产列表存储咨询

Hyperledger Composer 资产管理相关问题解答

1. 如何在Hyperledger Composer中进行资产管理?

我在实际的Hyperledger Composer项目里,通常会按这几个核心步骤来做资产管理,你可以参考下:

  • 第一步:定义资产模型
    先在CTO模型文件里明确资产的结构,比如把药品作为资产的话,要指定唯一标识字段和所需属性:

    namespace org.example.pharmacy
    asset Drug identified by drugId {
        o String drugId
        o String drugName
        o String manufacturer
        o String status // 比如待审批、已批准、已下架
    }
    

    这里的identified by是必须的,用来唯一标识每个资产实例。

  • 第二步:编写交易逻辑
    在JavaScript脚本文件(.js)里实现资产的创建、更新、转移等操作。比如创建药品资产的交易:

    /**
     * 创建新的药品资产
     * @param {org.example.pharmacy.CreateDrug} tx
     * @transaction
     */
    async function createDrug(tx) {
        const assetRegistry = await getAssetRegistry('org.example.pharmacy.Drug');
        // 先检查是否已存在同ID的药品
        const existingDrug = await assetRegistry.exists(tx.drug.drugId);
        if (existingDrug) {
            throw new Error(`药品ID ${tx.drug.drugId} 已存在`);
        }
        // 设置初始状态为待审批
        tx.drug.status = 'PENDING_APPROVAL';
        await assetRegistry.add(tx.drug);
    }
    

    类似的,你还可以写ApproveDrug交易来把药品状态改成APPROVED,完成审批流程。

  • 第三步:配置权限控制
    在permissions.acl文件里设置不同角色对资产的操作权限,比如只有审批员能修改药品的审批状态:

    rule ApproveDrugPermission {
        description: "允许审批人员更新药品审批状态"
        participant: "org.example.pharmacy.Approver"
        operation: UPDATE
        resource: "org.example.pharmacy.Drug"
        condition: (resource.status == 'PENDING_APPROVAL')
    }
    

    这样能保证只有授权角色才能执行敏感操作,避免资产被随意修改。

  • 第四步:资产查询与管理
    你可以通过Composer REST Server生成的API来查询和管理资产,也可以在queries.qry里定义自定义查询,比如查询所有待审批的药品:

    query getPendingDrugs {
        description: "获取所有待审批的药品"
        statement:
            SELECT org.example.pharmacy.Drug
                WHERE status == 'PENDING_APPROVAL'
    }
    

2. 能否在区块链上存储可动态增减的允许资产列表?

完全可以在链上存储这个动态的允许资产列表,而且我非常推荐这种方式——毕竟你的场景是药品审批后进入供应链,链上存储能保证列表的不可篡改性和全节点一致性,这正是区块链的核心优势,比链下存储更适合你的需求。

具体实现可以参考这两种思路:

  • 思路一:用专门的资产存储允许列表
    你可以定义一个ApprovedDrugList资产,里面包含一个数组字段来存储已批准的药品ID:

    asset ApprovedDrugList identified by listId {
        o String listId default="MAIN_LIST"
        o String[] approvedDrugIds
    }
    

    然后编写AddToApprovedList和RemoveFromApprovedList交易,用来动态增减列表里的药品ID。比如添加的交易逻辑:

    /**
     * 将药品加入批准列表
     * @param {org.example.pharmacy.AddToApprovedList} tx
     * @transaction
     */
    async function addToApprovedList(tx) {
        const listRegistry = await getAssetRegistry('org.example.pharmacy.ApprovedDrugList');
        const approvedList = await listRegistry.get('MAIN_LIST');
        // 检查是否已在列表中
        if (!approvedList.approvedDrugIds.includes(tx.drugId)) {
            approvedList.approvedDrugIds.push(tx.drugId);
            await listRegistry.update(approvedList);
        }
    }
    
  • 思路二:直接通过资产状态动态生成列表
    其实更简单的方式是,不给药品单独维护一个列表,而是通过药品资产的status字段来区分——当药品审批通过时,把状态设为APPROVED,之后你只需要通过查询就能实时获取所有允许进入供应链的药品,这相当于一个动态的允许列表。比如自定义查询:

    query getApprovedDrugs {
        description: "获取所有已批准的药品"
        statement:
            SELECT org.example.pharmacy.Drug
                WHERE status == 'APPROVED'
    }
    

    这种方式更简洁,也避免了维护单独列表的额外开销,适合大多数场景。

当然,如果你的允许列表规模极大、增减操作异常频繁,可能需要考虑链上存储的性能,但药品审批场景一般不会达到这个量级,所以链上存储是最优选择。链下存储虽然灵活,但失去了区块链的信任和溯源能力,不建议用于这种需要强一致性和可追溯的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:56:24