Truffle 迁移错误:“<ContractName>”在部署时遇到无效的操作码

问题描述 投票:0回答:1

我正在尝试使用 Truffle 在本地 Ganache 区块链上部署名为

InfinityCanvas
的合约。但是,我在部署过程中遇到“无效操作码”错误。

问题:

运行

truffle migrate --reset
时,遇到以下错误:

*** Deployment Failed ***

"InfinityCanvas" hit an invalid opcode while deploying. Try:
   * Verifying that your constructor params satisfy all assert conditions.
   * Verifying your constructor code doesn't access an array out of bounds.
   * Adding reason strings to your assert statements.

代码详情:

  1. InfinityCanvas.sol:
// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";

contract InfinityCanvas is ERC721Enumerable {
    // tokenId counter
    uint256 private _currentTokenId = 0;

    struct Canvas {
        string description;
        // Add other metadata attributes if needed
    }

    mapping(uint256 => Canvas) public canvases;

    constructor() ERC721("InfinityCanvas", "ICNV") {}

    function _getNextTokenId() private returns (uint256) {
        _currentTokenId += 1;
        return _currentTokenId;
    }

    function mintCanvas(address owner, string memory description) public returns (uint256) {
        uint256 newCanvasId = _getNextTokenId();
        _mint(owner, newCanvasId);
        canvases[newCanvasId] = Canvas(description);
        return newCanvasId;
    }
    
    function setDescription(uint256 tokenId, string memory description) public {
        require(ownerOf(tokenId) == msg.sender, "Only the owner can set the description");
        canvases[tokenId].description = description;
    }
}
  1. 2_deploy_infinity_canvas.js
const InfinityCanvas = artifacts.require("InfinityCanvas");

module.exports = function (deployer) {
    deployer.deploy(InfinityCanvas, { gas: 5000000 });
};
  1. truffle-config.js:
module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*",
      gas: 5500000,
      gasPrice: 20000000000,
    },
  },

  mocha: {
    // timeout: 100000
  },

  compilers: {
    solc: {
      version: "0.8.21",
    }
  },

  db: {
    enabled: false
  }
};

环境:

  • 松露版本:v5.11.5
  • 节点版本:v18.18.1
  • 使用默认设置的 Ganache CLI

任何关于为什么会发生这种情况以及如何解决它的帮助或见解将不胜感激!

尝试过的修复:

  1. 检查构造函数:验证
    InfinityCanvas
    合约的构造函数中没有任何在迁移过程中可能未提供的参数。
  2. Gas Limit:调整了迁移脚本中的gas限制,并
    truffle-config.js
    确保合约在部署过程中不会耗尽gas。
  3. 检查依赖项:确保所有依赖项和导入的合约(例如来自 OpenZeppelin 的合约)都是兼容版本。
  4. 手动编译:尝试使用
    solc
    手动编译合约,看看是否存在Truffle未捕获的问题。
  5. 迁移脚本:确保迁移脚本
    2_deploy_infinity_canvas.js
    没有任何不一致或错误。
  6. 重新启动 Ganache:有时重置 Ganache 可以解决随机数或其他与区块链相关的不一致问题。
  7. 更新 Truffle:确保 Truffle 是最新的。有时使用最新版本的 Truffle 可以解决某些部署问题。
  8. 检查Solidity版本:验证
    truffle-config.js
    中指定的Solidity版本与合约文件中的版本是否匹配。
  9. 其他合约:检查
    contracts
    目录中是否有其他合约可能导致迁移过程中发生冲突。
  10. StackOverflow 上的以下问题“迁移”在部署时遇到无效的操作码

不幸的是,上述步骤都没有解决问题。不过,也有可能我在尝试上述修复时确实做错了什么。

javascript ethereum solidity truffle ganache
1个回答
0
投票

这可能是由于最近在 solc 版本 0.8.20 中引入了新的操作码 PUSH0。

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

最快的解决方案是更改您的 pragma 和 solc 版本

迁移.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

truffle-config.js

compilers: {
    solc: {
      version: "0.8.13"
}

更改版本解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.