gpt4 book ai didi

blockchain - Geth私网执行简单合约时返回错误 "invalid opcode: SELFBALANCE"

转载 作者:行者123 更新时间:2023-12-03 08:22:43 33 4
gpt4 key购买 nike

我设置了一个简单的 Geth (v1.10.2-stable-97d11b01) 专用网络(下面的 genesis.json 配置)。我编译并部署了这个简单的测试合约(solidity版本:0.8.4+commit.c7e474f2.Emscripten.clang):

// SPDX-License-Identifier: UNLICENSED;
pragma solidity >=0.8;

contract CoinA {

bytes32 public coinName = "FAKE";

mapping (address => uint) public balances;

function transfer(address receiver, uint amount) public {
require(balances[msg.sender] >= amount, "Not enough amount");

balances[msg.sender] -= amount;
balances[receiver] += amount;
}

function set(uint amount) public {
require(amount >= 0);
balances[msg.sender] = amount;
}

function get() view public returns (uint) {
return balances[msg.sender];
}

}

但是,在调用 set 方法时,我收到此错误:

UnhandledPromiseRejectionWarning: Error: Returned error: invalid opcode: SELFBALANCE

请建议如何解决此问题。是因为服务器没有支持该操作码的最新功能吗?无论如何,我可以在不使用该操作码的情况下编译代码吗?

如果相关的话,我在 Node 上使用 Web3JS 调用它:

    async function setCoin() {
const contract = new w3.eth.Contract(abi, coinAddr);
const query = contract.methods.set(1000);

const tx: TransactionConfig = {
data: query.encodeABI(),
from: accPublicKey,
};
const gas = await w3.eth.estimateGas(tx);
console.log("Estimate Gas: " + gas);
tx.gas = gas;

const signedTx = await w3.eth.accounts.signTransaction(tx, accPrivateKey);
const result = await w3.eth.sendSignedTransaction(signedTx.rawTransaction);

console.log("Done. Gas used: " + result.gasUsed);
}

genesis.json 配置:

{
"config": {
"chainId": 5777,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"clique": {
"period": 15,
"epoch": 30000
}
},
"difficulty": "1",
"gasLimit": "10000000",
"extradata": "0x00000000000000000000000000000000000000000000000000000000000000001ac7d6c5ecdd24067221a44ee839ba0b847058a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"alloc": {
"1ac7d6c5ecdd24067221a44ee839ba0b847058a3": { "balance": "300000000000000000000000" },
"485012dCc48219dbE955C39e1cee4b71F041d178": { "balance": "300000000000000000000000" },
"ea673022022Ea39a635C7336c6deA8BFa97778D9": { "balance": "300000000000000000000000" }
}
}

最佳答案

selfbalance操作码在 Istanbul 尔链 fork ( source ) 中实现。

您需要在 genesis.json 中允许 fork

{
"config": {
"istanbulBlock": 0,

关于blockchain - Geth私网执行简单合约时返回错误 "invalid opcode: SELFBALANCE",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67366053/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com