【问题标题】:Hyperledger Fabric chaincode eventsHyperledger Fabric 链码事件
【发布时间】:2018-10-21 20:59:51
【问题描述】:

我正在尝试通过 node-sdk API 在 Hyperledger 结构中使用自定义链码事件

registerChaincodeEvent(ccid, eventname, onEvent, onError)

我收到错误 Timeout-Failed to receive the chaincode 事件。不过

registerTxEvent(txid, onEvent, onError)

工作正常,但我需要听一些自定义链码事件。我正在附加链码函数,它发出事件并调用chaincode.js、日志和network-config.yaml 文件。

【问题讨论】:

  • invokechaincode.js - hastebin.com/izozunocir.js 链码函数 - hastebin.com/ajerilutoh.go 日志 - hastebin.com/dufaqaleni.vbs network-config.yaml - hastebin.com/tagotubuho.php
  • 我获得了一些成功。然而,它仍然没有返回 block_num、txnid 和它应该根据链码事件的节点 SDK 事件文档提供的状态。对我来说,它仍然显示在日志调用链代码下方 - 成功获得了一个链代码事件,其中 transid:undefined with status:undefined with event:{ "PropertyNumber" : "Property2", "message" : "This account already exists", "code" : "503"}
  • 看不到你的链码。
  • 评论里的文件已经没有了,能再更新一下吗?我无法成功使用 registerChaincodeEvent()。

标签: hyperledger-fabric


【解决方案1】:

registerChaincodeEvent() 添加以下代码 sn-p。我已将 registerTxEvent() 替换为 registerChaincodeEvent()。

var promises = [];
let event_hubs = channel.getChannelEventHubsForOrg();
event_hubs.forEach((eh) => {
    let event_monitor_execute = new Promise((resolve, reject) => {
            let regid1 = null;
            let handle = setTimeout(() => {
                    if (regid1) {
                             // might need to do the clean up this listener
                            eh.unregisterChaincodeEvent(regid1);
                            logger.info('Timeout - Failed to receive the chaincode event');
                    }
               reject(new Error('Timed out waiting for chaincode event'));
            }, 50000);
            eh.connect(true);
            regid1 = eh.registerChaincodeEvent(chaincodeName,'evtsender',(event,block_num,tx,status) => {

                    logger.info('Successfully got a chaincode event with transid:'+tx + ' with status:'+status);
                    let event_payload = event.payload;
                    logger.info('Successfully got a chaincode event with payload:'+ event_payload.toString('utf8'));
              //      if(event_payload.indexOf('CHAINCODE') > -1) {
                    if(block_num){
                            clearTimeout(handle);
                            eh.unregisterChaincodeEvent(regid1);
                            logger.info('Successfully received the chaincode event on block number '+ block_num);
                            resolve('RECEIVED');
                    } else {
                            logger.info('Successfully got chaincode event ... just not the one we are looking for on block number '+ block_num);
                    }
            }, (error)=> {
                    clearTimeout(handle);
                    logger.info('Failed to receive the chaincode event ::'+error);
                    reject(error);
            }
            );

    });
    promises.push(event_monitor_execute);
});

上述代码需要在invoke-trnasactions.js文件的balance-transfer代码中添加。Link:https://github.com/hyperledger/fabric-samples/tree/release-1.1/balance-transfer

另外请通过添加以下代码来编辑相同的链码:

    err = stub.SetEvent("evtsender", []byte("MOVE EXECUTED"))
    if err != nil {
            logger.Infof("Error while set eventfunction:%v", err)
            return shim.Error("error")
    }

在example_cc.go文件的move()末尾。

【讨论】: