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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:36:03