Bagaimana untuk membetulkan ralat "Migrasi menemui opcode yang tidak sah semasa menggunakan" dalam Solidity?
P粉523625080
P粉523625080 2024-03-27 00:03:27
0
1
377

'hijrah' menemui kod op yang tidak sah semasa digunakan. Cuba:

  • Sahkan bahawa parameter pembina anda memenuhi semua syarat penegasan.
  • Sahkan bahawa kod pembina anda tidak mengakses tatasusunan di luar had.
  • Tambah rentetan sebab pada pernyataan penegasan anda. Bagaimana untuk menyelesaikan ralat ini

Kod migrasi.sol saya

// 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;
      }
    }

Fail Truffle config.js saya

    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

membalas semua(1)
P粉924915787

Ini mungkin disebabkan oleh perubahan terkini daripada solc 版本 0.8.20 开始引入了新的操作码 PUSH0.

Untuk senarai lengkap, lihat "Bilakah setiap opcode akan ditambahkan pada EVM?" p> Pada asasnya, versi pengkompil Solidity anda "mendahului" rangkaian yang anda cuba gunakan. Dalam erti kata lain,

mengeluarkan bytecode yang mengandungi opcode, tetapi rangkaian belum memilikinya lagi. solc

Anda mempunyai 3 penyelesaian yang berpotensi:

    Tunggu rangkaian sasaran anda menyokong opcode baharu, atau gunakan rangkaian lain.
    • Memandangkan konfigurasi truffle anda menunjukkan bahawa anda sedang menyambung ke
    • , ini bermakna anda boleh menaik taraf kepada versi terkini rangkaian yang anda jalankan secara setempat (cth. Ganache), mungkin itu akan menyelesaikan masalah 127.0.0.1:8545
    • Turun taraf kepada versi terdahulu
    • . solc
    • Tukar versi
    • dalam fail Solidity anda: pragma Solidity 0.8.19;solc 版本:pragma Solidity 0.8.19;
  • Tukar versi
  • dalam fail konfigurasi truffle: versi: "0.8.19" solc 版本: version: "0.8.19"
      Jika punca ralat sememangnya opcode PUSH0, ini akan menyelesaikan masalah anda, kerana
    • versi 0.8.19 tidak mengeluarkan ini. PUSH0 操作码,这将解决您的问题,因为 solc
  • Teruskan menggunakan versi
  • terbaharu, tetapi nyatakan versi EVM sasaran bukan terkini solc
      Kemas kini bahagian
    • dalam fail konfigurasi truffle untuk menambah sifat baharu: setting: { evmVersion: 'london' }solc 部分以添加新属性:settings: { evmVersion: 'london' }
    • Nota, sasaran 0.8.20
    • evmVersion: 'shanghai',这意味着它可以输出PUSH0 secara lalai
    • Walau bagaimanapun, jika anda membatalkannya untuk menyasarkan evmVersion: 'london', iaitu versi EVM sasaran kedua terkini (sehingga Jun 2023), maka anda sebenarnya memberitahu
    • ElakkanoutputPUSH0. evmVersion: 'london',这是第二个最新的目标 EVM 版本(截至 2023 年 6 月),那么您实际上是在告诉 solc 避免输出PUSH0
    • Jika punca ralat sememangnya opcode PUSH0, ini akan menyelesaikan masalah anda kerana
    • anda telah diberitahu untuk tidak mengeluarkan ini. PUSH0 操作码,这将解决您的问题,因为 solc

Rujukan:

  • https://github.com/ethereum/solidity/releases/tag /v0.8.20
  • https://docs.soliditylang.org/en/v0.8.20/using-the-compiler.html#setting-the-evm-version-to-target
  • https://trufflesuite.com/docs/truffle/reference/configuration/ #solc
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan