如何修复'部署时迁移遇到无效操作码”问题Solidity 中的错误?
P粉523625080
P粉523625080 2024-03-27 00:03:27
0
1
337

“迁移”在部署时遇到无效的操作码。尝试:

  • 验证您的构造函数参数是否满足所有断言条件。
  • 验证您的构造函数代码不会越界访问数组。
  • 将原因字符串添加到您的断言语句中。出现此错误如何解决

我的migration.sol代码

// SPDX-License-Identifier: UNLICENSED

    //the version of solidity that is compatible

    pragma solidity ^0.8.0;
    contract Migrations {
      address public owner = msg.sender;
      uint public last_completed_migration;

      modifier restricted() {
        require(
          msg.sender == owner,
          "This function is restricted to the contract's owner"
        );
        _;
      }

      function setCompleted(uint completed) public restricted {
        last_completed_migration = completed;
      }
    }

我的松露 config.js 文件

    const path = require("path");

    module.exports = {
      // See <http://truffleframework.com/docs/advanced/configuration>
      // to customize your Truffle configuration!
      contracts_build_directory: path.join(__dirname, "/build"),
  
   
      networks: {
        development: {
        host: "127.0.0.1",
      port: 8545,
      network_id: "*" //Match any network id
     }
    },
    
    plugins: ["truffle-contract-size"],
    compilers: {
    solc: {
      version: "^0.8.0"
    }
    },
    solidity: {
    version: "0.8.3",
    settings: {
      optimizer: {
        enabled: true,
        runs: 1000,
      },
    },
  },
   };

P粉523625080
P粉523625080

全部回复(1)
P粉924915787

这可能是由于最近从 solc 版本 0.8.20 开始引入了新的操作码 PUSH0

有关完整列表,请参阅“每个操作码何时添加到 EVM 中?”。 p>

本质上,您的 Solidity 编译器版本“领先于”您尝试部署到的网络。换句话说,solc 输出包含操作码的字节码,但网络还没有。

您有 3 个潜在的解决方案:

  • 等待您的目标网络支持新操作码,或使用其他网络。
    • 由于您的 truffle 配置表明您正在连接到 127.0.0.1:8545,这意味着您可以升级到本地运行的网络的最新版本(例如 Ganache),也许这可以解决问题
    • 降级到 solc 的早期版本。
    • 更改您的 Solidity 文件中的 solc 版本:pragma Solidity 0.8.19;
  • 更改 truffle 配置文件中的 solc 版本: version: "0.8.19"
    • 如果错误的根本原因确实是 PUSH0 操作码,这将解决您的问题,因为 solc 版本 0.8.19 不会输出此内容。
  • 继续使用最新的 solc 版本,但指定非最新的目标 EVM 版本
    • 更新 truffle 配置文件中的 solc 部分以添加新属性:settings: { evmVersion: 'london' }
    • 注意,0.8.20默认针对evmVersion: 'shanghai',这意味着它可以输出PUSH0
    • 但是,如果您将其覆盖为目标 evmVersion: 'london',这是第二个最新的目标 EVM 版本(截至 2023 年 6 月),那么您实际上是在告诉 solc 避免输出PUSH0
    • 如果错误的根本原因确实是 PUSH0 操作码,这将解决您的问题,因为 solc 已被告知不要输出此内容。

参考文献:

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!