Как получить возвращаемое значение функции умного контракта, когда она вызывается с помощью cacheSend () в drizzle - PullRequest
0 голосов
/ 11 февраля 2019

Я только что попытался создать простой DApp, используя трюфель, реакцию и морось.Мой вопрос заключается в том, как получить возвращаемое значение функции смарт-контракта, когда она вызывается с помощью cacheSend () в моросящий дождь?Как и ожидалось, при вызове функций cacheCall () и cacheSend () в контракте они должны отправить нужную транзакцию и вернуть соответствующий хэш транзакции.

В моем коде cacheCall () отправляет нужную транзакцию и возвращает соответствующуюхэш транзакции, и когда я его вижу console.log, он отображается на консоли.таким образом, нет никаких проблем с cacheCall ()

// this works fine
const dataKey1 = contract.methods.GetNumber.cacheCall();
console.log(dataKey1);

Но cacheSend () отправляет нужную транзакцию, но не возвращает хеш соответствующей транзакции !!Вместо этого он возвращает значение 0, когда я console.log возвращаю значение cacheSend ()

// this does not work
const dataKey2 = contract.methods.setNumber.cacheSend(3);
console.log(dataKey2);

Вот умный контракт:

pragma solidity ^0.5.0;

contract Test {

    uint public number = 10;

    function setNumber(uint _x) public returns (uint)
    {
        number = number+_x;

        return number + 5;
    }

    function GetNumber() public view returns (uint)
    {
        return number;
    }
}

Внешний интерфейс должен выглядеть следующим образом:

The return value of GetNumber function = 13 
The return value of setNumber function = 18

Это код

import React from "react";

class TestDrizzle extends React.Component {
  state = { dataKey1: null, dataKey2: null };

  componentDidMount() {
    const { drizzle, drizzleState } = this.props;
    const contract = drizzle.contracts.Test;

    // let drizzle know we want to call the `GetNumber` method with `value`
    // this works fine
    const dataKey1 = contract.methods.GetNumber.cacheCall();
    console.log(dataKey1);

    // let drizzle know we want to call the `setNumber` method with `value`
    // this does not work
    const dataKey2 = contract.methods.setNumber.cacheSend(3);
    console.log(dataKey2);


    this.setState({ dataKey1, dataKey2 });
  }

  render() {
    // get the contract state from drizzleState
    const { Test } = this.props.drizzleState.contracts;

    // using the saved `dataKey1`, get the return value of GetNumber function
    const result_1 = Test.GetNumber[this.state.dataKey1];

    // using the saved `dataKey2`, get the return value of setNumber function
    const result_2 = Test.setNumber[this.state.dataKey2];

    return (
      <p>
        The return value of GetNumber function = {result_1 && result_1.value}{" "}
        {<br />}
        The return value of setNumber function = {result_2 && result_2.value}
      </p>
    );
  }
}

export default TestDrizzle;

Буду признателен, если вы посмотрите на мой проект https://github.com/fbalwy/Drizzle-tutorial.git

...