Hyperledger Fabric 1.4: Как протестировать и проверить функцию registerChaincodeEvent из Fabric Node SDK? - PullRequest
1 голос
/ 08 марта 2019

В настоящее время я добавляю событие из моего цепного кода при добавлении ресурса.

async addRequestNode(ctx, sampleAssetId, sampleData) {
    //console.info('============= Adding Sample Asset ===========');

    await ctx.stub.putState(sampleAssetId,sampleData);
    //console.info('============= Sample Asset Added ===========');
    ctx.stub.setEvent('sampleAssetAdded', 'sampleData');
}

Здесь, как вы можете видеть, я отправляю событие sampleAssetAdded.Я хочу перехватить это событие в своем клиентском приложении.

У меня настроен сервер, и я прослушиваю порт 8080. На сервере я создал экземпляр channelEventHub и дал идентификатор кода моей цепочки и имя события.

    const channelEventHub = new ChannelEventHub('mychannel','peer0.org1.example.com');
    let eventCapture = channelEventHub.registerChaincodeEvent('fabcar','sampleAssetAdded',(event, block_num, txnid, status) => {



        console.log('Successfully got a chaincode event with transid:'+ txnid + ' with status:'+status);


        storeBlockNumForLater(block_num);


        let event_payload = event.payload.toString('utf8');
        if(event_payload.indexOf('CHAINCODE') > -1) {
            clearTimeout(handle);

            channel_event_hub.unregisterChaincodeEvent(regid);
            console.log('Successfully received the chaincode event on block number '+ block_num);
            resolve('RECEIVED');
        } else {
            console.log('Successfully got chaincode event ... just not the one we are looking for on block number '+ block_num);
        }
    },(error) => {

        console.log('Got Some Error'+error);

    })

Но когда я добавляю актив, событие не захватывается.Я не знаю, что происходит не так.

Я даже консольно зарегистрировал eventCapture и получил это

Event Capture ----> ChaincodeRegistration {
  ccid: 'fabcar',
  eventNameFilter: /sampleAssetAdded/,
  event_reg: 
   EventRegistration {
     _onEventFn: [Function],
     _onErrorFn: [Function],
     unregister: false,
     disconnect: false,
     unregister_action: [Function] } }

Я не уверен, регистрируется ли он на событие или нет.

Я использую Node SDK иЯ упомянул этот сайт https://fabric -sdk-node.github.io / release-1.4 / tutorial-channel-events.html , но это совсем не полезно, поскольку у них нет полногокод и вместо этого иметь смутные фрагменты с неправильным или не работающим кодом.

Может кто-нибудь, пожалуйста, помогите, как настроить все это и проверить его тоже.

1 Ответ

2 голосов
/ 08 марта 2019

Вы не должны создавать экземпляр ChannelEventHub напрямую, так как для подключения требуется пользовательский контекст.Вы должны получить концентратор событий канала от объекта канала, используя

channel.getChannelEventHub(peer)

или

channel.newChannelEventHub(peer)

, в зависимости от того, хотите ли вы кэшировать концентратор событий в объекте канала или нет.Рекомендуем прочитать в https://fabric -sdk-node.github.io для каждого из этих API-интерфейсов, чтобы объяснить больше.

Далее вам необходимо подключить его и указать true для полных блоков, а неотфильтрованные блоки.Также вам нужно подождать, пока концентратор событий будет подключен, прежде чем пытаться совершить транзакцию, которая генерирует событие, иначе вы его не получите.

eventHub.connect(true, (err, eventHub) => {
   if (err) {
      // Error connecting
   } else {
      // connected successfully
   });

После подключения вы регистрируетесь для событий цепного кода.

...