安装OpenZeppelin后Truffle部署出现Invalid OpCode错误的解决方法
解决Solidity 0.8.20 PUSH0 opcode与Ganache不兼容的问题
方案1:通过Truffle编译配置禁用PUSH0(推荐)
无需修改任何合约文件,直接在truffle-config.js中指定EVM版本为London(不支持PUSH0),编译器会自动生成兼容的字节码:
module.exports = { // 其他原有配置... compilers: { solc: { version: "0.8.20", // 保持原版本不变 settings: { evmVersion: "london", // 指定EVM版本,避免生成PUSH0 opcode optimizer: { enabled: true, runs: 200 } } } } };
修改后重新执行truffle migrate即可,该方案不依赖版本降级或文件修改,最省心。
方案2:批量修改OpenZeppelin合约的pragma版本
如果需要降级Solidity版本,可通过命令行批量替换node_modules中OpenZeppelin合约的pragma声明:
Linux/macOS 命令
find node_modules/@openzeppelin/contracts -name "*.sol" -exec sed -i '' 's/pragma solidity ^0.8.20/pragma solidity ^0.8.19/' {} \;
Windows PowerShell 命令
Get-ChildItem -Path node_modules/@openzeppelin/contracts -Filter *.sol -Recurse | ForEach-Object { (Get-Content $_.FullName) -replace 'pragma solidity ^0.8.20', 'pragma solidity ^0.8.19' | Set-Content $_.FullName }
为避免每次npm install后配置被覆盖,可在package.json中添加postinstall脚本自动执行替换:
"scripts": { "postinstall": "find node_modules/@openzeppelin/contracts -name '*.sol' -exec sed -i '' 's/pragma solidity ^0.8.20/pragma solidity ^0.8.19/' {} \\;" }
方案3:升级Ganache到支持PUSH0的版本
Ganache v7.8.0及以上版本已支持上海硬分叉(包含PUSH0 opcode),直接升级即可:
npm install -g ganache@latest
升级后重启Ganache,确保链配置启用上海硬分叉(最新版本默认已支持),再执行truffle migrate即可正常部署。
内容的提问来源于stack exchange,提问作者Minmin
相关产品推荐
相关产品推荐

