令牌合约不会迁移,因为它是抽象的

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 仅被导入一次,并且所有内容都可以干净地编译。 太棒了。如果您能投票并接受我的回答,我将不胜感激。 :)

以上是关于令牌合约不会迁移,因为它是抽象的的主要内容,如果未能解决你的问题,请参考以下文章

是否有推荐的方法来迁移 JWT 令牌?

从迁移签署交易到智能合约

Django 抽象模型 + DB 迁移:测试抛出“无法更改表,因为它有待处理的触发事件”

Truffle Migrations(迁移)- 多个合约一起部署 如何链接库

Binance Smart Chain - 将合约从测试网迁移到主网

Solidity 智能合约迁移错误的 Truffle 和 Ganache 教程