在 Web3.js 版本的智能合约中调用 public 方法:'1.0.0-beta.46'

Calling a public method in smart contract with Web3.js version: '1.0.0-beta.46'

我开始了在私有网络上使用奇偶校验的以太坊区块链的第一步。我能够通过 Parity UI 在我的私有网络上的开发模式链上配置奇偶校验并执行智能合约的部署,它也能够调用合约的方法。

我遇到的问题与使用 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()

它给了我以下输出,而不是通过智能合约 greet 函数中编写的承诺对象返回预期的字符串 "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";
    }
}

每个涉及区块链状态变化的交易或智能合约方法调用都将 return promise。所以你只需要相应地处理承诺:

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

web docs

中的更多内容