令牌合约不会迁移,因为它是抽象的
Posted
技术标签:
【中文标题】令牌合约不会迁移,因为它是抽象的【英文标题】:Token contract won't migrate since it is abstract 【发布时间】:2019-11-20 13:50:13 【问题描述】:我正在研究荷兰式拍卖风格的 ICO 合同,目前我正在尝试迁移我的 ERC20 合同的早期阶段以测试基本功能(它是否具有正确的名称、符号和小数点)。合同可以编译,但我无法迁移它,因为它是一个“抽象合同”。我的代币合约继承自 ERC20Detailed,即 Open Zeppelin 合约,后者又继承自 IERC20 接口合约。我能做些什么来解决这个问题?我尝试让我的 Token 合约也从 ERC20 继承基础合约,但它说标识符已经声明。我看到了来自 Truffle 终端输出的可能响应,但我很好奇为什么我的实现不起作用,并且希望在理解 Solidity 接口和抽象合约方面获得更多帮助。
我能做些什么来解决这个问题?我尝试让我的 Token 合约也从 ERC20 继承基础合约,但它说标识符已经声明。
pragma solidity ^0.5.8;
import "node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
contract Token is ERC20Detailed
constructor(string memory _name, string memory _symbol, uint8 _decimals)
ERC20Detailed(_name, _symbol, _decimals)
public
来自 Bash 终端的输出
“Token”是抽象合约或接口,不能部署。 * 将抽象导入到使用它们的“.sol”文件中,而不是单独部署它们。 * 继承抽象的合约必须准确地实现它的所有方法签名。 * 只实现继承抽象的一部分的合约也被认为是抽象的。
【问题讨论】:
【参考方案1】:如果您仔细观察ERC20Detailed contract,您会注意到ERC20Detailed is IERC20
。用简单的英语,它说“这个 ERC20Detailed 继承了 IERC20 的所有功能”。
现在,看看IERC20 contract。您会注意到那里的所有功能都以;
终止,没有任何逻辑。这就是我们在 Solidity 中称为 Abstract Contracts 的内容。
你的前端合约(Token)想要使用来自:
的所有函数 ERC20Detailed - 在其文件中包含所有实现 IERC20(通过 ERC20Detailed)- 文件中没有实现这就是您收到 This contract does not implement all functions and thus cannot be created
错误的原因。
要解决这个问题,试试这个方法:
pragma solidity ^0.5.8;
import "path-to/ERC20/ERC20.sol";
import "path-to/ERC20/ERC20Detailed.sol";
contract Token is ERC20, ERC20Detailed
constructor(string memory name, string memory symbol, uint8 decimals)
ERC20Detailed(name,symbol,decimals)
public
// TODO
ERC20 contract 具有 IERC20 合约的所有实现。您可以在下面的Remix 先this code 尝试一下:
pragma solidity ^0.5.8;
import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
contract Token is ERC20, ERC20Detailed
constructor(string memory name, string memory symbol, uint8 decimals)
ERC20Detailed(name,symbol,decimals)
public
// TODO
【讨论】:
感谢您富有洞察力的回复。当我尝试上述方法时,VSCode 正在强调我的 ERC20Detailed 导入并告诉我“标识符已声明” 无论我做什么导入语句,第二行都是“标识符已经声明”。我在编译期间收到此错误消息“先前的声明在这里:接口 IERC20 ^(相关源代码部分从这里开始并跨越多行)。”当我尝试您在混音上发布的内容时,一切正常。是接口有问题,还是我的本地导入 Open Zeppelin 库的方法有问题? 找到了问题。当我编译我的合约时,我注意到 IERC20 被编译了两次。我让 ERC20 和 ERC20Detailed 导入合同,但我给出了两个不同的文件路径。通过将它们更改为相同的文件路径,IERC20 仅被导入一次,并且所有内容都可以干净地编译。 太棒了。如果您能投票并接受我的回答,我将不胜感激。 :)以上是关于令牌合约不会迁移,因为它是抽象的的主要内容,如果未能解决你的问题,请参考以下文章
Django 抽象模型 + DB 迁移:测试抛出“无法更改表,因为它有待处理的触发事件”
Truffle Migrations(迁移)- 多个合约一起部署 如何链接库