Hyperledger Composer中如何从一个事务内部触发另一个事务
在Hyperledger Composer中从事务内部触发另一个事务的实现方法
没问题,在Hyperledger Composer里从一个事务内部触发另一个其实很直接,核心是通过getFactory()创建目标事务的实例,填充必要参数后调用emit()方法提交它。我结合你现有的updateOrder事务代码,给你做个完整示例:
第一步:确保目标事务已在CTO模型中定义
首先,假设你要触发的是一个名为NotifyCustomer的事务,用来通知客户订单状态已更新。先在你的CTO文件里定义这个事务:
namespace org.example.basic transaction NotifyCustomer { o String customerID o String orderID o String message }
第二步:修改updateOrder事务代码,添加触发逻辑
接下来修改你现有的updateOrder函数,在合适的时机(比如资产更新完成后)创建并触发NotifyCustomer事务:
async function updateOrder(uo) { // eslint-disable-line no-unused-vars // Get the asset registry for the asset. const assetRegistry = await getAssetRegistry('org.example.basic.OrderList'); // 更新指定订单的状态 for(let i=0; i < uo.asset.orderDtls.length; i++) { if(uo.asset.orderDtls[i].orderID === uo.orderID){ uo.asset.orderDtls[i].orderStatus = "Accepted"; // 记录要通知的客户ID(假设orderDtls里有customerID字段) const targetCustomerID = uo.asset.orderDtls[i].customerID; const targetOrderID = uo.orderID; // 创建NotifyCustomer事务实例 const notifyTx = getFactory().newTransaction('org.example.basic', 'NotifyCustomer'); // 填充事务参数 notifyTx.customerID = targetCustomerID; notifyTx.orderID = targetOrderID; notifyTx.message = `你的订单${targetOrderID}状态已更新为【Accepted】`; // 触发这个事务 emit(notifyTx); } } await assetRegistry.update(uo.asset); }
关键说明
- 创建事务实例:用
getFactory().newTransaction(namespace, transactionName)来生成目标事务的空实例,必须指定正确的命名空间和事务名称。 - 填充参数:根据你在CTO里定义的事务字段,给实例赋值所有必填项,否则事务提交会失败。
- 触发事务:调用
emit(transactionInstance)方法,这个方法会把新事务提交到区块链网络,后续会由对应的事务处理器函数处理(如果你给NotifyCustomer写了处理器的话)。
需要注意的是,如果你的目标事务不需要额外处理器(只是作为事件或者数据记录),也可以直接触发,Composer会自动处理事务的持久化。
内容的提问来源于stack exchange,提问作者zaheer ud deen
相关产品推荐
相关产品推荐

