「遷移」在部署時遇到無效的操作碼。嘗試:
我的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, }, }, }, };
這可能是由於最近從
solc
版本 0.8.20 開始引入了新的操作碼PUSH0
。有關完整列表,請參閱「每個操作碼何時會新增到 EVM 中?」。 p>
本質上,您的 Solidity 編譯器版本「領先」您嘗試部署到的網路。換句話說,
solc
輸出包含操作碼的字節碼,但網路還沒有。您有 3 個潛在的解決方案:
127.0.0.1:8545
,這意味著您可以升級到本地運行的網路的最新版本(例如Ganache),也許這可以解決問題solc
的早期版本。solc
版本:pragma Solidity 0.8.19;
solc
版本:version: "0.8.19"
PUSH0
操作碼,這將解決您的問題,因為solc
版本 0.8.19 不會輸出此內容。solc
版本,但指定非最新的目標 EVM 版本solc
部分以新增屬性:settings: { evmVersion: 'london' }
evmVersion: 'shanghai'
,這表示它可以輸出PUSH0
evmVersion: 'london'
,這是第二個最新的目標EVM 版本(截至2023 年6 月),那麼您實際上是在告訴solc
避免輸出PUSH0
。PUSH0
操作碼,這將解決您的問題,因為solc
已被告知不要輸出此內容。參考文獻: