Вызов общедоступного метода в смарт-контракте с версией Web3.js: '1.0.0-beta.46'

Я начал первые шаги в блокчейне Ethereum с паритетом в частной сети. Я смог настроить четность и выполнить развертывание смарт-контракта в цепочке режима разработки в моей частной сети через пользовательский интерфейс Parity, который также может вызывать методы контракта.

Проблема, с которой я столкнулся, связана с вызовом функции в смарт-контракте с использованием Web3.js. Мне удалось подключиться к цепочке с помощью библиотеки Web.js;

Web3 = require('web3')

web3 = new Web3('ws://localhost:8546')

mycontract = web3.eth.Contract([{"constant":false,"inputs":[],"name":"greet","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}],0xEb112542a487941805F7f3a04591F1D6b04D513c)

Когда я вызываю метод ниже;

mycontract.methods.greet().call()

Он дает мне следующий вывод вместо того, чтобы возвращать ожидаемую строку «OK Computer» через объект обещания, как написано в функции приветствия смарт-контракта.

{ [Function: anonymousFunction]
  send: { [Function] request: [Function] },
  estimateGas: [Function],
  encodeABI: [Function] }

Код смарт-контракта:

pragma solidity ^0.4.22;
//Compiler Version: 0.4.22
contract Greeter {
    address owner;

    constructor() public { 
        owner = msg.sender; 
    }    
    function greet() public returns(string){
        return "OK Computer";
    }
}

person Hassaan    schedule 27.02.2019    source источник


Ответы (1)


Каждый вызов транзакции или метода смарт-контракта, который включает изменение состояния блокчейна, будет возвращать обещание. Итак, вам просто нужно обработать обещание соответственно:

mycontract.methods.greet.call().then(function(resp) {
   console.log(resp) // This will output "OK Computer"
}

Подробнее в веб-документах

person Gabriel G.    schedule 28.02.2019
comment
Спасибо за ответ; исходная точка также была связана с поведением API web3.js, который вместо ожидаемого объекта Promise возвращает объект в соответствии с исходным сообщением; все еще следуя вашему предложению, результат для оператора mycontract.methods.greet().call().then(function(res) { console.log(res) })is TypeError: mycontract.methods.myFunction (...). call (...). then is not a function - person Hassaan; 28.02.2019
comment
Следуя документации web3, я попробовал локально и следующий mycontract.methods.greet.call (). then (console.log); печатает Ok Computer - person Gabriel G.; 28.02.2019
comment
Адрес контракта должен быть строкой, которую я совершенно не заметил при чтении документации. После того, как он был заключен в кавычки, он работал согласно вашему предложению. - person Hassaan; 18.04.2019