如何监听 Hyperledger Fabric 中的事件(提交事件)?

How to listen to the event(commit event) in Hyperledger Fabric?

我们搭建了一个fabric server,把一些交易放到里面。我们有一些应用程序将与结构服务器合作。这是一个情况。

如您所知,执行 chaincode 需要一些时间。特别是 blockchain 会在几十秒后提交。所以我想要 peer 回调一个 url 或者只是让应用程序知道执行的结果。有可能吗?

您甚至可以注册到 hub 并列出 block/transaction 正在提交的通知。如果您正在寻找示例,请考虑查看 fabcar from fabric-samples. In particular you might want to take a look on invoke.js

var options = {
    wallet_path: path.join(__dirname, './creds'),
    user_id: 'PeerAdmin',
    channel_id: 'mychannel',
    chaincode_id: 'fabcar',
    peer_url: 'grpc://localhost:7051',
    event_url: 'grpc://localhost:7053',
    orderer_url: 'grpc://localhost:7050'
};



    let eh = client.newEventHub();
    eh.setPeerAddr(options.event_url);
    eh.connect();


    let txPromise = new Promise((resolve, reject) => {
        let handle = setTimeout(() => {
            eh.disconnect();
            reject();
        }, 30000);

        eh.registerTxEvent(transactionID, (tx, code) => {
            clearTimeout(handle);
            eh.unregisterTxEvent(transactionID);
            eh.disconnect();

            if (code !== 'VALID') {
                console.error(
                    'The transaction was invalid, code = ' + code);
                reject();
            } else {
                console.log(
                    'The transaction has been committed on peer ' +
                    eh._ep._endpoint.addr);
                resolve();
            }
        });
    });
    eventPromises.push(txPromise);

API 也存在于 Java 和 Golang SDK 中。

Hyperledger Composer 改变了我们使用 Hyperledger Fabric 区块链的方式。虽然我不能在这里给你所有的介绍,但我提供了一段代码,告诉你如何 (credits to):

  1. 定义事件
  2. 从您的交易中发出一个事件
  3. 从您的应用程序中监听事件

1) 定义一个事件:这里我有一个事件,由医生、病人和一条消息组成。

    event MedicalEvent {
    --> Doctor thedoctor
    --> Patient thePatient
    o String theMessage
    }
    transaction sampleTransaction {
    --> Doctor thedoctor
    --> Patient thePatient
    }

2) 从交易中发出事件:这里我们将有链码的逻辑。

    /**
     *@ALL NECCESSARY DECORATIONS GO HERE
     /
    sampleTransaction(obj) {
    var factory = getFactory();
    var patient = obj.thepatient;
    var doctor = obj.thedoctor;
    var message = 'Take your medications PROPERLY';

    return getParticipantRegistry('org.acme.WHATEVER.Patient')
    .then(function(patientRegistry) {
       var basicEvent = factory.newEvent('org.acme.WHATEVER', 'addMeLiveEvent');
       basicEvent.theDoctor=doctor;
       basicEvent.thePatient=patient;
       basicEvent.theMessage = message;
       emit(basicEvent);
     })
    }

3) 监听事件:这里我有我的 Nodejs 监听事件。

    const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection;
    this.bizNetworkConnection = new BusinessNetworkConnection();
    this.cardName ='admin@YOUR-NETWORK';
    this.businessNetworkIdentifier = 'YOUR-NETWORK';

    this.bizNetworkConnection.connect(this.cardName)
    .then((result) => { 
    //You can do ANYTHING
    })
    .catch((error) => {
    throw error;
    });


    this.bizNetworkConnection.on('event',(evt)=>{
     console.log('Amount Transfered: '+evt.theMessage);
    });