You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Remix部署Solidity合约遇Invalid Opcode错误的解决求助

解决Remix部署Solidity合约时的Invalid Opcode错误

核心原因

你遇到的错误本质是编译器指定的EVM版本与部署环境的EVM版本不兼容,或者合约执行时触发了未捕获的异常。结合你的情况,合约编译正常但部署失败,版本不兼容是最主要的诱因——Solidity 0.8.20默认使用shanghai EVM版本,若部署环境(如Remix内置VM、测试网)采用更早的EVM版本,就会触发该错误。

分步修复方案

1. 统一EVM版本配置

  • 打开Remix左侧的Solidity编译器标签(第四个图标),找到EVM Version选项,选择与部署环境匹配的版本:
    • 若使用Remix内置JavaScript VM,直接选择shanghai(与0.8.20默认版本一致);
    • 若部署到测试网/主网,确认目标链的EVM版本(主流测试网如Sepolia、Goerli均支持shanghai)。
  • 重新编译合约,确保编译阶段的EVM版本与部署环境完全一致。

2. 优化合约代码(可选)

OpenZeppelin的Ownable合约在0.8.20版本已默认用msg.sender初始化owner,你的构造函数属于冗余代码,可简化为:

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol";

contract SharedWallet is Ownable {
    // 无需手动编写构造函数,Ownable会自动用msg.sender初始化owner

    function withdrawMoney(address payable _to, uint _amount) public onlyOwner { 
        _to.transfer(_amount); 
    }

    receive() external payable {} 
}

3. 检查部署环境设置

  • 在Remix左侧Deploy & Run Transactions标签页,确认Environment选择的是Remix VM (Shanghai),而非旧版本的VM(如London);
  • 若部署到外部节点(如Infura),需确保节点服务支持shanghai升级。

验证步骤

重新编译合约后,在匹配的环境中部署,测试以下操作确认正常:

  • 向合约转入ETH(触发receive函数);
  • 调用withdrawMoney转出ETH,验证仅owner账户可执行;
  • 调用owner()函数,确认返回地址为部署时的发起账户。

内容的提问来源于stack exchange,提问作者Assassin Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:39:54