배포하는 동안 '마이그레이션'에서 잘못된 opcode가 발견되었습니다. 시도해 보세요:
내 migration.sol 코드
으아아아내 트러플 config.js 파일
// 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; } }
이는
solc
版本 0.8.20 开始引入了新的操作码PUSH0
의 최근 변경사항으로 인한 것일 수 있습니다.전체 목록은 "각 opcode는 언제 EVM에 추가되나요?"를 참조하세요. p> 기본적으로 귀하의 Solidity 컴파일러 버전은 배포하려는 네트워크보다 "앞에" 있습니다. 즉,
는 opcode가 포함된 바이트코드를 출력하지만 네트워크에는 아직 opcode가 없습니다.
3가지 잠재적인 솔루션이 있습니다:solc
대상 네트워크가 새 opcode를 지원할 때까지 기다리거나 다른 네트워크를 사용하세요.-
트러플 구성 파일에서 - 버전을 변경합니다:
최신 - 버전을 계속 사용하되 최신이 아닌 대상 EVM 버전을 지정하세요.
트러플 구성에- 에 연결 중이라고 표시되어 있으므로 이는 로컬에서 실행 중인 네트워크(예: Ganache)의 최신 버전으로 업그레이드할 수 있음을 의미합니다. 그렇게 하면 문제가 해결될 수도 있습니다
이전 버전의 - 로 다운그레이드하세요.
Solidity 파일의 - 버전을 변경하세요:
127.0.0.1:8545
solc
pragma Solidity 0.8.19;
solc
版本:pragma Solidity 0.8.19;
version: "0.8.19"
solc
版本:version: "0.8.19"
오류의 근본 원인이 실제로- 버전 0.8.19에서는 이를 출력하지 않으므로 문제가 해결됩니다.
PUSH0
opcode인 경우PUSH0
操作码,这将解决您的问题,因为solc
solc
트러플 구성 파일의- 섹션을 업데이트하여 새 속성을 추가하세요:
참고, 기본적으로 0.8.20 대상 -
그러나 두 번째 최신 대상 EVM 버전(2023년 6월 현재)인 - 피하십시오라고 말하는 것입니다. >
오류의 근본 원인이 실제로 - 안내받았으므로 이렇게 하면 문제가 해결됩니다.
settings: { evmVersion: 'london' }
solc
部分以添加新属性:settings: { evmVersion: 'london' }
evmVersion: 'shanghai'
,这意味着它可以输出PUSH0
evmVersion: 'london'
을 대상으로 재정의하면 실제로는PUSH0
을 출력합니다.evmVersion: 'london'
,这是第二个最新的目标 EVM 版本(截至 2023 年 6 月),那么您实际上是在告诉solc
避免输出PUSH0
PUSH0
opcode인 경우 이를 출력하지 말라고PUSH0
操作码,这将解决您的问题,因为solc
참조: