recherche

Maison  >  Questions et réponses  >  le corps du texte

Comment corriger l'erreur « La migration a rencontré un opcode non valide lors du déploiement » dans Solidity ?

'migrate' a rencontré un opcode invalide lors du déploiement. Essayez :

Mon code 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;
      }
    }

Mon fichier config.js Truffle

    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粉523625080246 Il y a quelques jours383

répondre à tous(1)je répondrai

  • P粉924915787

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

    Cela peut être dû à des changements récents de solc 版本 0.8.20 开始引入了新的操作码 PUSH0.

    Pour une liste complète, voir "Quand chaque opcode sera-t-il ajouté à l'EVM ?" p> Essentiellement, votre version du compilateur Solidity est "en avance" sur le réseau sur lequel vous essayez de déployer. En d'autres termes,

    génère un bytecode qui contient l'opcode, mais le réseau ne l'a pas encore. solc

    Vous avez 3 solutions potentielles :

      Attendez que votre réseau cible prenne en charge le nouvel opcode ou utilisez un autre réseau.
      • Puisque votre configuration truffle indique que vous vous connectez à
      • , cela signifie que vous pouvez passer à la dernière version du réseau que vous utilisez localement (par exemple Ganache), peut-être que cela résoudra le problème 127.0.0.1:8545
      • Rétrograder vers une version antérieure de
      • . solc
      • Changez la version
      • dans vos fichiers Solidity : pragma Solidity 0.8.19;solc 版本:pragma Solidity 0.8.19;
    • Changez la version
    • dans le fichier de configuration de truffe : version : "0.8.19" solc 版本: version: "0.8.19"
        Si la cause première de l'erreur est effectivement l'opcode PUSH0, cela résoudra votre problème, car
      • la version 0.8.19 ne le produit pas. PUSH0 操作码,这将解决您的问题,因为 solc
    • Continuez à utiliser la dernière version
    • , mais spécifiez une version EVM cible qui n'est pas la dernière solc
        Mettez à jour la section
      • dans le fichier de configuration de Truffle pour ajouter la nouvelle propriété : settings : { evmVersion : 'london' }solc 部分以添加新属性:settings: { evmVersion: 'london' }
      • Remarque, cibles 0.8.20
      • evmVersion: 'shanghai',这意味着它可以输出PUSH0 par défaut
      • Cependant, si vous le remplacez pour cibler evmVersion : 'london', qui est la deuxième dernière version cible d'EVM (en juin 2023), alors vous dites en fait
      • < strong>ÉvitersortiePUSH0. evmVersion: 'london',这是第二个最新的目标 EVM 版本(截至 2023 年 6 月),那么您实际上是在告诉 solc 避免输出PUSH0
      • Si la cause première de l'erreur est effectivement l'opcode PUSH0, cela résoudra votre problème puisque
      • on vous a dit de ne pas afficher cela. PUSH0 操作码,这将解决您的问题,因为 solc

    Référence :

    • 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
    • répondre
      0
  • Annulerrépondre