Solidity合约编译报错(需标记abstract)及构造函数实现咨询
问题解答
1) 编译错误:合约需标记为abstract的原因
你继承了ERC20合约,但没有调用父类的构造函数。OpenZeppelin的ERC20合约构造函数需要接收name和symbol参数来初始化内置的_name和_symbol变量,你的合约未完成这个父类初始化步骤,Solidity会判定合约未完成必要实现,因此要求标记为abstract。
另外,你自行定义的_totalSupply、_name、_symbol属于重复声明——ERC20合约已经内置了这些状态变量,无需额外定义。
2) 构造函数实现的可行性及修正方案
当前的构造函数不可行,核心问题有两点:
- 未正确初始化
ERC20父合约的状态 - 手动维护
_totalSupply不符合ERC20标准逻辑(ERC20的totalSupply()函数读取的是内置_totalSupply,你手动赋值的变量不会被该函数识别)
正确实现方式如下:
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/ERC20.sol'; contract MyToken is ERC20 { constructor(string memory name_, string memory symbol_, uint256 totalSupply_) ERC20(name_, symbol_) { // 将初始供应量铸造给合约部署者 _mint(msg.sender, totalSupply_); } function foo() external returns (uint) { uint temp; temp = 1+1; return temp; } }
关键说明:
ERC20(name_, symbol_)是显式调用父类构造函数,完成name和symbol的标准初始化_mint函数会自动更新ERC20内置的_totalSupply变量,同时将对应代币转入目标地址,完全符合ERC20标准逻辑
内容的提问来源于stack exchange,提问作者DeFi
相关产品推荐
相关产品推荐

