首页 > 解决方案 > 如何捕获 Hyperledger Fabric 上的事务生成的事件?

问题描述

我想知道链代码事件是否可以被已通过 SDK 安装链代码的特定通道的所有对等方捕获。我尝试了一些实验,但似乎只能由需要特定事务的对等方捕获链码事件,但我需要通道的所有对等方接收该特定事件。

标签: hyperledger-fabrichyperledgerhyperledger-chaincode

解决方案


链码发出的事件存储在事务中。

在您的情况下,您将需要连接到对等点并侦听合同事件。

这是 Node.JS 客户端的示例:

const n = await gateway.getNetwork("mychannel");
const contract: network.Contract = n.getContract("fabcar");
contract.addContractListener(async (event) => {
  console.log(event.eventName, event.payload.toString("utf-8"));
});

输出将是:

itemCreated 1f6629d7-999b-4cbb-8b36-68e1de2aa373

然后在链代码中,您将设置一个事件,这是 Java 中的一个示例:

ctx.getStub().setEvent("itemCreated", StringUtils.getBytes(item.id, StandardCharsets.UTF_8));

如果要调查交易中有哪些事件,可以通过执行以下脚本来获取块:

BLOCK_NUMBER=1 # whatever block you want to fetch
peer channel fetch -c mychannel ${BLOCK_NUMBER}
configtxlator proto_decode --input mychannel_${BLOCK_NUMBER}.block --type common.Block > mychannel_${BLOCK_NUMBER}.json

然后你会在 JSON 中看到一个名为 events 的键:

JSON 中的事件属性


推荐阅读