Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk membetulkan ralat "Migrasi menemui opcode yang tidak sah semasa menggunakan" dalam Solidity?

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

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粉523625080P粉523625080206 hari yang lalu333

membalas semua(1)saya akan balas

  • P粉924915787

    P粉9249157872024-03-27 20:10:04

    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
      • < strong>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
    • balas
      0
  • Batalbalas