web3调用智能合约读函数出现undefined

环境

  • Remix 上编译和部署智能合约函数
  • 本地Vscode编译js文件使用web3库调用智能合约读函数

源代码

  • 智能合约MyContract.sol内容:
// 需求:写一个可以获取值和设置值的智能合约

// 1.声明solidity版本
pragma solidity ^0.5.0;

contract MyContract {
    string value;
    
    constructor() public {
        value = "initial value.";
    }
    
    function get() public view returns(string memory) {
        return value;
    }
    
    function set(string memory _value) public {
        value = _value;
    }
}
  • 脚本文件app.js内容:
var Web3 = require('web3');
//连接测试环境
if (typeof web3 !== 'undefined') {
  web3 = new Web3(web3.currentProvider);
} else {
  web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));//这里是ganache-cli/ganache的监听地址
}

// 设置默认以太坊账户
web3.eth.defaultAccount = web3.eth.accounts[0];


var infoContractABI = ; //这里填写合约的ABI
var infoContractAddress = ''; //这里填写合约地址

var infoContract = new web3.eth.Contract(infoContractABI, infoContractAddress);

infoContract.methods.get().call((err, result) => {
  console.log(result);
  console.log(err);//这里因为想看具体报错的原因,所以把拦截到的错误也打印到了控制台上
})

问题截图

web3调用智能合约读函数出现undefined_第1张图片

原因(待补充…)

目前还没找到原因,等找到之后会补充进来

解决办法

修改了发起合约部署的地址和监听的节点。

  1. 在Remix中的Deploy&Run模块中把ENVIROMENT修改成Injected Web3连接你的MetaMask钱包;
  2. 我这里把钱包的测试网换成了Kovan,因为部署智能合约需要消耗gas费用,所以要确保钱包内有测试币,测试币获取地址:Kovan测试币获取渠道,注册一个账户之后把自己的MetaMask账户粘贴到对话框中,等到机器人艾特你的账户提示“sent”消息就可以了;
  3. 回到Remix将合约部署上去,把新部署合约的地址和ABI更新到代码中;
  4. 修改脚本文件app.js,把监听的节点换成Infura里的节点;
  5. 重新运行脚本就会返回默认值 “initial value”了。
var Web3 = require('web3');
//主要是在这里做了修改
const web3 = new Web3('https://kovan.infura.io/v3/88fedf6357dd448e8b4a6bbfaac0e914')

var infoContractABI = ;
var infoContractAddress = '';
var infoContract = new web3.eth.Contract(infoContractABI, infoContractAddress);
infoContract.methods.get().call((err, result) => {
  console.log(result);
})

你可能感兴趣的:(学习,智能合约,区块链,web3)