'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, }, }, }, };
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.
Anda mempunyai 3 penyelesaian yang berpotensi:solc
Tunggu rangkaian sasaran anda menyokong opcode baharu, atau gunakan rangkaian lain.-
Tukar versi - dalam fail konfigurasi truffle:
Teruskan menggunakan versi - terbaharu, tetapi nyatakan versi EVM sasaran bukan terkini
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
Turun taraf kepada versi terdahulu - .
Tukar versi - dalam fail Solidity anda:
127.0.0.1:8545
solc
pragma Solidity 0.8.19;
solc
版本:pragma Solidity 0.8.19;
versi: "0.8.19"
solc
版本:version: "0.8.19"
Jika punca ralat sememangnya opcode- versi 0.8.19 tidak mengeluarkan ini.
PUSH0
, ini akan menyelesaikan masalah anda, keranaPUSH0
操作码,这将解决您的问题,因为solc
solc
Kemas kini bahagian- dalam fail konfigurasi truffle untuk menambah sifat baharu:
Nota, sasaran 0.8.20 -
Walau bagaimanapun, jika anda membatalkannya untuk menyasarkan - Elakkanoutput
Jika punca ralat sememangnya opcode - anda telah diberitahu untuk tidak mengeluarkan ini.
setting: { evmVersion: 'london' }
solc
部分以添加新属性:settings: { evmVersion: 'london' }
evmVersion: 'shanghai'
,这意味着它可以输出PUSH0
secara lalaievmVersion: 'london'
, iaitu versi EVM sasaran kedua terkini (sehingga Jun 2023), maka anda sebenarnya memberitahuPUSH0
.evmVersion: 'london'
,这是第二个最新的目标 EVM 版本(截至 2023 年 6 月),那么您实际上是在告诉solc
避免输出PUSH0
PUSH0
, ini akan menyelesaikan masalah anda keranaPUSH0
操作码,这将解决您的问题,因为solc
Rujukan: