【问题标题】:How to listen to the event(commit event) in Hyperledger Fabric?如何在 Hyperledger Fabric 中监听事件(提交事件)?
【发布时间】:2019-02-20 07:46:22
【问题描述】:

我们设置了一个结构服务器,并将一些事务放入其中。我们有一些应用程序将与结构服务器合作。这是一种情况。

  • 应用程序使用fabric-sdk-javafabric-sdk-node 发送事务
  • 面料执行chaincode
  • fabric 将结果通知应用程序/应用程序监听交易事件(提交交易、生成区块链、附加区块链、更新世界状态等)
  • 应用程序通知客户交易结果。

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

【问题讨论】:

    标签: hyperledger-fabric hyperledger


    【解决方案1】:

    您甚至可以注册到集线器并列出正在提交的块/事务的通知。如果您正在寻找示例,请考虑查看来自fabric-samplesfabcar。特别是你可能想看看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 中。

    【讨论】:

    • 我认为这是一个过时的解决方案,因为事件现在是基于渠道的
    【解决方案2】:

    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);
        });
    

    【讨论】:

    • 问题是关于面料,而不是作曲家
    猜你喜欢
    • 2022-08-17
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多