Blockchain Geth专用网络返回错误“;无效操作码:SELFBALANCE“;在执行简单合同时

Blockchain Geth专用网络返回错误“;无效操作码:SELFBALANCE“;在执行简单合同时,blockchain,ethereum,solidity,smartcontracts,geth,Blockchain,Ethereum,Solidity,Smartcontracts,Geth,我设置了一个简单的Geth(v1.10.2-stable-97d11b01)专用网络(genesis.jsonconfig)。我编译并部署了这个简单的测试契约(solidity版本:0.8.4+commit.c7e474f2.Emscripten.clang): 但是,在调用set方法时,我收到了以下错误: 未处理的PromisejectionWarning:错误:返回的错误:无效操作码:SELFBALANCE 请提供有关如何修复此问题的建议。是因为服务器没有支持该操作码的最新功能吗?我是否可以

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

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

未处理的PromisejectionWarning:错误:返回的错误:无效操作码:SELFBALANCE

请提供有关如何修复此问题的建议。是因为服务器没有支持该操作码的最新功能吗?我是否可以不用操作码编译代码

我在节点上使用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:

{
  "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" }
  }
}
操作码是在伊斯坦布尔链叉()中实现的

您需要在
genesis.json中允许fork

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

谢谢你,这很有效!还有一个问题,我现在有另一个无效的操作码
DUP
。简单地使用最新的链条叉好吗?你是如何获得这些信息的?我的谷歌没有提供任何有用的信息(例如,发布/版本路线图是什么,mainnet fork目前是什么)。对不起,如果我问了一些愚蠢的问题,我不确定你是指原始的
DUP
还是
DUP
。如果您指的是较新的
DUP
,则它已添加到Berlin hardfork中。原版我不确定。。。我是如何到达伊斯坦布尔岔路口的:我在谷歌上搜索了“自平衡以太坊操作码”,找到了EIP-1884。然后我搜索了“EIP-1884 hardfork”,因为我在早些时候的某个地方了解到新的操作码主要在hardfork中实现。。。但最好先包含所有的叉子(不仅仅是最新的叉子),然后再进行实验。fork定义了添加/删除功能的差异,而不是它们的总和,因此您需要包括所有fork。谢谢您的正确性,我刚刚对其进行了测试。我在《创世纪》中添加了柏林硬叉,但仍然存在问题,因此我可以确认这些叉不是它们的总和。我用它来确定现在有什么分叉。我的Solc编译器似乎有问题,因为即使在Ropsten testnet上我也有同样的问题。我认为没有
DUP
操作码,只有
DUP1
DUP16
{
  "config": {
    "istanbulBlock": 0,