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

