环境
- 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);//这里因为想看具体报错的原因,所以把拦截到的错误也打印到了控制台上
})
问题截图
原因(待补充…)
目前还没找到原因,等找到之后会补充进来
解决办法
修改了发起合约部署的地址和监听的节点。
- 在Remix中的Deploy&Run模块中把ENVIROMENT修改成Injected Web3连接你的MetaMask钱包;
- 我这里把钱包的测试网换成了Kovan,因为部署智能合约需要消耗gas费用,所以要确保钱包内有测试币,测试币获取地址:Kovan测试币获取渠道,注册一个账户之后把自己的MetaMask账户粘贴到对话框中,等到机器人艾特你的账户提示“sent”消息就可以了;
- 回到Remix将合约部署上去,把新部署合约的地址和ABI更新到代码中;
- 修改脚本文件app.js,把监听的节点换成Infura里的节点;
- 重新运行脚本就会返回默认值 “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);
})
版权声明:本文为weixin_46353030原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。