#hyperledger-fabric #hyperledger
#hyperledger-fabric #hyperledger
Вопрос:
Я использую Hyperledger Fabric SDK NodeJS v1.4.1 и пытаюсь перехватить событие chaincode. Вот мой код:
let gateway = new Gateway();
await gateway.connect(config, {
wallet: wallet,
identity: identity,
discovery: { enabled: true, asLocalhost: false },
});
let network = await gateway.getNetwork("myChannel");
let contract = network.getContract("myChaincode");
contract.addContractListener("myListener","myChaincodeEvent",(err, event, blockNumber, transactionId, status) => {
if (err) { throw err; }
logger.debug(`Chaincode:${event.chaincode_id} - Event: ${event.event_name} - Block Number: ${blockNumber} Transaction ID: ${transactionId} Status: ${status}`);
},{unregister:false,disconnect:false});
Моя проблема в том, что я получаю событие, но не могу извлечь из него полезную нагрузку.
Я прочитал, что необходимо установить параметр в концентраторе канала:
full_block=true
но я не понимаю, где установить этот параметр, если я использую подход шлюза.
Ответ №1:
Вот пример кода, который я использовал, показывающий, где установить соответствующий параметр фильтрации
this.contract.addContractListener('some-string', 'trade-network',
(err, event, blkNum, txid, status) => {
console.log('event received', status, event, blkNum, txid);
if (err) {
this.emit('error', err);
} else if (status amp;amp; status === 'VALID') {
// only if a valid block is committed should we emit an event
let evt = event.payload.toString('utf8');
evt = JSON.parse(evt);
if (Array.isArray(evt)) {
for(const oneEvent of evt) {
this.emit('ChaincodeEvent', oneEvent);
}
}
else {
this.emit('ChaincodeEvent', evt);
}
}
},
{filtered: false}
);
Надеюсь, это поможет.
Комментарии:
1. Случайно ли. Есть ли у вас какой-либо пример, использующий все возможные варианты прослушивания? Установка startBlock ничего не меняет (он по-прежнему запускается с самого нового), даже если в документе указано, что его можно использовать.
2. Я не извиняюсь, я не пробовал. Предложил бы создать JIRA, если это не сработает.
Ответ №2:
Вы можете передавать параметры в ChannelEventHub.connect (параметры)
вот так
channelEventHub.connect({ full_block: true })
проверьте документ API
https://fabric-sdk-node.github.io/release-1.4/ChannelEventHub.html