使用 web3 (call) 读取方法时出现错误

I have an error when reading a method with web3 (call)

我正在尝试学习如何与 web3 集成,但我遇到了一些问题。 (正常我刚开始)

但是有个问题我解决不了

Uncaught TypeError: Cannot read property 'retrieve' of undefined

我尝试调用一个函数,但它不起作用,我不知道如何解决它。

代码如下:

const abi_c = [{"inputs": [],"name": "retrieve","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "uint256","name": "num","type": "uint256"}],"name": "store","outputs": [],"stateMutability": "nonpayable","type": "function"}];
const account = "0x644f1439DBfc743853031d79021890af54bCA8Ae";

const web3js = new Web3(window.ethereum);
ethereum.autoRefreshOnNetworkChange = false;

var contract = web3js.eth.contract(abi_c, account);
var result = contract.methods.retrieve().call();
console.log(result);

您需要使用 new 关键字实例化 web3js.eth.Contract class。

var contract = new web3js.eth.Contract(abi_c, account);

没有它,var contract 仅指向未实例化的定义和静态属性。

此外,请注意 Contract (docs) 中的大写字母 C


然后你将运行进入另一个问题。

.call()方法returns一个Promise,所以你需要使用await表达式(在async函数中)或回调函数。

// needs to be in an async function
async function getResult() {
    var result = await contract.methods.retrieve().call();
    console.log(result);
}
contract.methods.retrieve().call().then(function (result) {
    // callback function
    console.log(result);
});