我正在尝试使用 Truffle 在本地 Ganache 区块链上部署名为
InfinityCanvas
的合约。但是,我在部署过程中遇到“无效操作码”错误。
运行
truffle migrate --reset
时,遇到以下错误:
*** Deployment Failed ***
"InfinityCanvas" hit an invalid opcode while deploying. Try:
* Verifying that your constructor params satisfy all assert conditions.
* Verifying your constructor code doesn't access an array out of bounds.
* Adding reason strings to your assert statements.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
contract InfinityCanvas is ERC721Enumerable {
// tokenId counter
uint256 private _currentTokenId = 0;
struct Canvas {
string description;
// Add other metadata attributes if needed
}
mapping(uint256 => Canvas) public canvases;
constructor() ERC721("InfinityCanvas", "ICNV") {}
function _getNextTokenId() private returns (uint256) {
_currentTokenId += 1;
return _currentTokenId;
}
function mintCanvas(address owner, string memory description) public returns (uint256) {
uint256 newCanvasId = _getNextTokenId();
_mint(owner, newCanvasId);
canvases[newCanvasId] = Canvas(description);
return newCanvasId;
}
function setDescription(uint256 tokenId, string memory description) public {
require(ownerOf(tokenId) == msg.sender, "Only the owner can set the description");
canvases[tokenId].description = description;
}
}
const InfinityCanvas = artifacts.require("InfinityCanvas");
module.exports = function (deployer) {
deployer.deploy(InfinityCanvas, { gas: 5000000 });
};
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 7545,
network_id: "*",
gas: 5500000,
gasPrice: 20000000000,
},
},
mocha: {
// timeout: 100000
},
compilers: {
solc: {
version: "0.8.21",
}
},
db: {
enabled: false
}
};
任何关于为什么会发生这种情况以及如何解决它的帮助或见解将不胜感激!
InfinityCanvas
合约的构造函数中没有任何在迁移过程中可能未提供的参数。truffle-config.js
确保合约在部署过程中不会耗尽gas。solc
手动编译合约,看看是否存在Truffle未捕获的问题。2_deploy_infinity_canvas.js
没有任何不一致或错误。truffle-config.js
中指定的Solidity版本与合约文件中的版本是否匹配。contracts
目录中是否有其他合约可能导致迁移过程中发生冲突。不幸的是,上述步骤都没有解决问题。不过,也有可能我在尝试上述修复时确实做错了什么。
这可能是由于最近在 solc 版本 0.8.20 中引入了新的操作码 PUSH0。
本质上,您的 Solidity 编译器版本“领先于”您尝试部署到的网络。换句话说,solc 输出包含操作码的字节码,但网络还没有。
最快的解决方案是更改您的 pragma 和 solc 版本
迁移.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
truffle-config.js
compilers: {
solc: {
version: "0.8.13"
}
更改版本解决了我的问题。