如何修復「部署時遷移遇到無效操作碼」問題Solidity 中的錯誤?
P粉523625080
P粉523625080 2024-03-27 00:03:27
0
1
338

「遷移」在部署時遇到無效的操作碼。嘗試:

  • 驗證您的建構子參數是否滿足所有斷言條件。
  • 驗證您的建構函式程式碼不會越界存取陣列。
  • 將原因字串加入到您的斷言語句中。出現此錯誤如何解決

我的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學習者快速成長!