Получить результат из транзакции Hyperledger Fabric - PullRequest
0 голосов
/ 16 мая 2018

Я отправил транзакцию в Hyperledger Fabric, но хотел бы получить объект, созданный этим.

Объект, который я получаю от этого - Undefined. Объекты: транзакция успешно создана в Hyperledger Fabric.

async submit(resource, method) {
    try{
      this.businessNetworkDefinition = await this.bizNetworkConnection.connect(cardname);
      if (!this.businessNetworkDefinition) {
        console.log("Error in network connection");
        throw "Error in network connection";
      }

      let factory        = this.businessNetworkDefinition.getFactory();
      let transaction    = factory.newTransaction(NS, method);

      Object.assign(transaction, resource)
      return await this.bizNetworkConnection.submitTransaction(transaction);
    }catch(error){
      console.log(error);
      throw error;
    }
  }

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Единственный способ получить что-то из моего цепного кода - через события.Есть собственный интерфейс, который может запрашивать данные транзакции или что-то в этом роде, но я еще не изучал его.

0 голосов
/ 17 мая 2018

В настоящее время функция submitTransaction ничего не возвращает.Это ошибка или она работает как задумано.

Для более подробной информации: Когда вы изучите исходный код композитора, вы, наконец, получите следующий код в composer-connector-hlfv1.

invokeChainCode(securityContext, functionName, args, options) {
        const method = 'invokeChainCode';
        LOG.entry(method, securityContext, functionName, args, options);

        if (!this.businessNetworkIdentifier) {
            return Promise.reject(new Error('No business network has been specified for this connection'));
        }

        // Check that a valid security context has been specified.
        HLFUtil.securityCheck(securityContext);

        // Validate all the arguments.
        if (!functionName) {
            return Promise.reject(new Error('functionName not specified'));
        } else if (!Array.isArray(args)) {
            return Promise.reject(new Error('args not specified'));
        }

        try {
            args.forEach((arg) => {
                if (typeof arg !== 'string') {
                    throw new Error('invalid arg specified: ' + arg);
                }
            });
        } catch(error) {
            return Promise.reject(error);
        }

        let txId = this._validateTxId(options);

        let eventHandler;

        // initialize the channel if it hasn't been initialized already otherwise verification will fail.
        LOG.debug(method, 'loading channel configuration');
        return this._initializeChannel()
            .then(() => {

                // check the event hubs and reconnect if possible. Do it here as the connection attempts are asynchronous
                this._checkEventhubs();

                // Submit the transaction to the endorsers.
                const request = {
                    chaincodeId: this.businessNetworkIdentifier,
                    txId: txId,
                    fcn: functionName,
                    args: args
                };
                return this.channel.sendTransactionProposal(request); // node sdk will target all peers on the channel that are endorsingPeer
            })
            .then((results) => {
                // Validate the endorsement results.
                LOG.debug(method, `Received ${results.length} result(s) from invoking the composer runtime chaincode`, results);
                const proposalResponses = results[0];
                let {validResponses} = this._validatePeerResponses(proposalResponses, true);

                // Submit the endorsed transaction to the primary orderers.
                const proposal = results[1];
                const header = results[2];

                // check that we have a Chaincode listener setup and ready.
                this._checkCCListener();
                eventHandler = HLFConnection.createTxEventHandler(this.eventHubs, txId.getTransactionID(), this.commitTimeout);
                eventHandler.startListening();
                return this.channel.sendTransaction({
                    proposalResponses: validResponses,
                    proposal: proposal,
                    header: header
                });
            })
            .then((response) => {
                // If the transaction was successful, wait for it to be committed.
                LOG.debug(method, 'Received response from orderer', response);

                if (response.status !== 'SUCCESS') {
                    eventHandler.cancelListening();
                    throw new Error(`Failed to send peer responses for transaction '${txId.getTransactionID()}' to orderer. Response status '${response.status}'`);
                }
                return eventHandler.waitForEvents();
            })
            .then(() => {
                LOG.exit(method);
            })
            .catch((error) => {
                const newError = new Error('Error trying invoke business network. ' + error);
                LOG.error(method, newError);
                throw newError;
            });
    }

Как вы можете видеть в конце, все, что происходит, ждет событий и Log.exit, которые ничего не возвращают.Поэтому в настоящее время вы должны получить результат транзакции другим способом.

...