Meta mask 中会打开一个关于支付 Gas 费用的窗口。我可以点击“继续”,但我等不及一次交易的顺利完成 - 总是出错
发生{“blockHash”:“0x33e1cd0a7c540d9cb08319bfdeae2ab87bf7a81f1daec361298f9735260c4b93”, "区块编号":"9968588", "累计使用气体":"1339077", "有效汽油价格":"2500000010", “来自”:“0x****************”, "gasUsed":"21069", “日志”[], "logsBloom":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000",
“状态”:“0”, “至”:“0x4f37382283719cf4151e27412c60472303fd158f”, “交易哈希”:“0x375c55a6e8f29eddd454e3a7bbf0af4245d3c44cfccea87bade47441c1941857”, "transactionIndex":"1","type":"2"}"
我正在尝试使用 Next.js 为智能合约编写一个接口,如下所示:
contract CampaignFactory {
address payable[] public deployedCampaigns;
function createCampaign(uint minimum) public {
address newCampaign = address(new Campaign(minimum, msg.sender));
deployedCampaigns.push(payable(newCampaign));
}
function CreateNewIdenticalCampaign() public {
address newCampaign = address(new Campaign(100, msg.sender));
deployedCampaigns.push(payable(newCampaign));
}
function getDeployedCampaigns()
public
view
returns (address payable[] memory)
{
return deployedCampaigns;
}
}
get (getDeployedCampaigns) 方法在 Remix Ethereum IDE 和我的应用程序中运行良好。
但是post方法有一些麻烦。我可以立即充满信心地说,post 方法没有被破坏,因为其中的所有内容都可以完美运行,但仅限于 Remix。我假设我的应用程序中的代码在 **.js 文件中写得不正确:
const accounts = await web3.eth.getAccounts();
const minimumWei = web3.utils.toWei(
this.state.minimumContribution,
"ether"
);
const gas = await factory.methods
.createCampaign(minimumWei)
.estimateGas({ from: accounts[0] });
await factory.methods
.createCampaign(minimumWei)
.send({
from: accounts[0],
gas: 10000000, //web3.utils.toHex(gas),
gasPrice: web3.utils.toWei("0.0001", "gwei"),
})
.on("transactionHash", function (hash) {
console.log("Transaction send, хэш: " + hash);
})
.on("receipt", function (receipt) {
console.log("Done, блок: " + receipt.blockNumber);
})
.on("error", function (error) {
console.error("Error: " + error.message);
});
我尝试不指定天然气、天然气价格属性,但没有任何帮助。
太好了!我找到了问题的答案,事实证明,在 2023 年,您需要在 web3 中进行与 2019 年不同的编程 - 您还需要发送方法 ABI,这是代码的工作版本:
const accounts = await web3.eth.getAccounts();
const encode = await factory.methods.createCampaign(100).encodeABI();
await factory.methods
//.CreateNewIdenticalCampaign()
.createCampaign(this.state.minimumContribution)
.send({
from: accounts[0],
data: encode
});