我收到这个错误:
错误:返回值无效,是不是没油了? 如果您没有为从中检索数据的合约使用正确的 ABI,从不存在的块号请求数据,或者查询未完全同步的节点,您也可能会看到此错误。
const Web3 = require("web3");
const MyContract = require("./build/contracts/MyContract.json");
const init = async () => {
const web3 = new Web3("http://127.0.0.1:9545");
const id = await web3.eth.net.getId();
const deployedNetwork = MyContract.networks[id];
const contract = new web3.eth.Contract(
MyContract.abi,
deployedNetwork.address
);
const addresses = await web3.eth.getAccounts();
await contract.methods.setData(10).send({
from: addresses[0]
});
const data = await contract.methods.getData().call();
console.log(data)
};
init();
可能有很多原因,但最常见的有两个原因。
原因可能是网络。如果你的 abi 属于主网上的合同,那么你的提供商必须是主网,如果它属于测试网之一,那么你必须使用相应的测试网提供商。
这就是我解决问题的方法。
我也遇到了这个错误。为了修复它,我使用了
truffle develop --log
,然后打开一个新的终端窗口并通过运行truffle develop
连接到当前会话。
你正在调用一个“发送”函数,它需要一个有足够余额的“发件人”地址。
所以,你应该确保:(我复制了你的代码)
const addresses = await web3.eth.getAccounts();
await contract.methods.setData(10).send({
// MAKE SURE this account has enough balance
from: addresses[0]
});
另外,您通过“call()”调用了“getData()”方法, 如果此操作是在您的 Hardhat 环境中执行的, 我建议你切换到一个真正的测试网络,例如林克比
const data = await contract.methods.getData().call();
console.log(data)
这个错误最有可能出现在两种情况下:-