我在本地使用安全帽并启动并运行了一个反应前端,但我无法毫无错误地调用这些方法。
我已经尝试过 ethers.js 和 web3。
这是我的代码和尝试。如果您发现我做错了什么,请告诉我。
我正在尝试通过 web3 与部署在本地安全帽环境中的合同进行交互
我无法从合同中取回数据,这是信息
我有:
var list = await contract.methods.getList();
console.log("list ", list );
这让我
list {arguments: Array(0), call: ƒ, send: ƒ, encodeABI: ƒ, estimateGas: ƒ, …}
当我做
var list = await contract.methods.getList().call();
console.log("list ", list );
我在浏览器中收到此错误:
返回值无效,它是否用尽了 Gas?如果您没有为从中检索数据的合约使用正确的 ABI、从不存在的块号请求数据或查询未完全同步的节点,您也可能会看到此错误。
我愿意:
在控制台中设置:
npx hardhat node
>Started HTTP and WebSocket JSON-RPC server at http://127.0.0.1:8545/
>Accounts
>========
>...
npx hardhat compile
> Nothing to compile
npx hardhat run scripts/deploy.js --network hardhat
注意:在 deploy.js 文件中,我做了一个
const list = await contract.getList();
console.log("list", list ); // correctly outputs ["string", "string"]
方法:
mapping(uint256 => address) internal list;
uint256 internal listCount;
function getList() public override view returns (address[] memory) {
address[] memory assets = new address[](listCount);
for (uint256 i = 0; i < listCount; i++) {
assets[i] = list[i];
}
return assets;
}
在反应 App.js 中:
import Contract_from './data/abi/Contract_.json'; // Contract_ is a placer
var contract = new web3.eth.Contract(Contract_, address_given_on_deploy);
var contractAddress = await contract .options.address; // correctly outputs
var list= await contract.methods.getList().call();
console.log("list", list);
如您所见,这不会从方法中返回值。我在这里做错了什么?
出于任何原因,可能是问题所在,这是我的配置:
require("@nomiclabs/hardhat-waffle");
// openzeppelin adds
require("@nomiclabs/hardhat-ethers");
require('@openzeppelin/hardhat-upgrades');
//abi
require('hardhat-abi-exporter');
// This is a sample Hardhat task. To learn how to create your own go to
// https://hardhat.org/guides/create-task.html
task("accounts", "Prints the list of accounts", async () => {
const accounts = await ethers.getSigners();
for (const account of accounts) {
console.log(account.address);
}
});
// You need to export an object to set up your config
// Go to https://hardhat.org/config/ to learn more
/**
* @type import('hardhat/config').HardhatUserConfig
*/
module.exports = {
networks: {
hardhat: {
gas: 12000000,
blockGasLimit: 0x1fffffffffffff,
allowUnlimitedContractSize: true,
timeout: 1800000,
chainId: 1337
}
},
solidity: {
compilers: [
{
version: "0.8.0",
settings: {
optimizer: {
enabled: true,
runs: 1000
}
}
},
{
version: "0.8.2",
settings: {
optimizer: {
enabled: true,
runs: 1000
}
}
},
],
},
abiExporter: {
path: './frontend/src/data/abi',
clear: true,
flat: true,
only: [],
spacing: 2
}
}
__
我想也许我会尝试 ethers.js,因为那是我在相同的问题上做的测试。
无论出于何种原因,我都可以“获取”合同,打印属于它们的方法,但我实际上不能调用这些方法。
这是我的 ethers.js 简洁:
provider = new ethers.providers.Web3Provider(window.ethereum);
if(provider != null){
const _contract = new ethers.Contract(address, _Contract, provider);
var list= await _contract.getList().call();
console.log("list", list);
}
我从中得到的错误是:
Error: call revert exception (method="getList()", errorArgs=null, errorName=null, errorSignature=null, reason=null, code=CALL_EXCEPTION, version=abi/5.4.0)
我已经在协议中尝试了许多合同,并且每个合同都相同