Я хотел бы знать, могут ли события чейнкода фиксироваться всеми одноранговыми узлами определенного канала, которые установили чейнкод через SDK. Я пробовал некоторые эксперименты, но кажется, что событие чейнкода может быть захвачено только узлом, которому требуется конкретная транзакция, но мне нужно, чтобы все пиры канала получали это конкретное событие.
Как я могу фиксировать события, сгенерированные транзакциями в Hyperledger Fabric?
Ответы (1)
События, которые генерирует чейнкод, сохраняются в транзакции.
В вашем случае вам нужно будет подключиться к узлу и прослушивать события контракта.
Это пример клиента 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:
person
David Viejo
schedule
10.06.2020
Хорошо, у меня есть две папки: одна с моим проектом, другая с оригинальными образцами ткани. Во втором я создал два приложения (для Org1 И Org2 (они находятся в одном канале и имеют один и тот же контракт)). Если я отправлю транзакцию от пользователя приложения 1, пользователь приложения 2 получит событие (установленное через addContractListener). В первом проекте этого не происходит, и я не могу понять, почему.
- person Pippo Pluto; 11.06.2020