从 ERC271 合约继承有啥意义?

Posted

技术标签:

【中文标题】从 ERC271 合约继承有啥意义?【英文标题】:What is the point of inheriting from ERC271 contract?从 ERC271 合约继承有什么意义? 【发布时间】:2021-11-13 14:18:42 【问题描述】:

我刚刚开始使用 Solidity。对于这个问题,我认为如果我首先陈述我对继承的理解会很有用:如果合同 B 继承自合同 A(即在 contractB.sol 中我们有

contract B is A ...

那么合约 B 将可以访问合约 A 的功能。

另外,据我了解,如果我想使用其他人的其他合同中的某些功能,我的代码中会包含以下内容:

contract someoneElsesInterface 
     function someFunction() returns(something) 

contract myContract 
     someoneElsesInterface someoneElsesContract = someonElsesInterface(address);
     value = someoneElsesContract.someFunction();


我在尝试实施 ERC721 标准时出现了困惑。首先,我必须将 erc721.sol 文件保存在我的目录中;该文件包含

contract ERC721 
  event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
  event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

  function balanceOf(address _owner) external view returns (uint256);
  function ownerOf(uint256 _tokenId) external view returns (address);
  function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
  function approve(address _approved, uint256 _tokenId) external payable;

然后在一个单独的文件中,我必须继承ERC721合约,然后定义balanceOf、ownerOf、transferFrom、approve这四个函数的内容;以及发出 Transfer 和 Approve 事件。所以如下:

contract myContract is ERC721 
     function balanceOf...
     function ownerOf...
     function transferrFrom...
     ...

这是我不明白的:为什么 ERC721 不是从 myContract 继承的,因为我们在 myContract 中定义函数,并且只在 ERC721 中声明函数名称和返回值,就像我上面的示例一样?当我们已经在 myContract 中定义了所有功能内容时,ERC721 合约和让 myContract 继承自 ERC721 的意义何在?在前端工作时,我是从 myContract 还是从 ERC721 调用函数?

我希望我的问题很清楚,如果不是,我可以在 cmets 中澄清。提前感谢您的回复。

【问题讨论】:

【参考方案1】:

首先,您不继承接口,而是实现它。在接口契约中,您不定义,而是声明。您声明功能、输入和输出。

接口不能从具体(实际)合同继承。只有接口可以相互继承。仔细想想,具体的契约比接口包含更多的信息,接口怎么能继承具体的契约呢?

一般来说,接口是用户和程序之间的契约,Solidity 也是如此。它们向用户保证一定的功能。通过实施 ERC721,您声明您的合约与 ERC721 兼容。因此,用户不需要知道你的合约的实现细节,而是可以使用 ERC721 接口调用你的合约。

考虑以下:

ContractA  ... 

ContractB is ERC721  ... 

假设两个合约都实现了 ERC721 功能。

为了能够调用 ContractA 进行 ERC721 交互,我必须导入它的 ABI 并验证它是否兼容。例如,我会这样称呼它:

ContractA(ADDRESS_OF_CONTRACT_A).safeTransferFrom(...)

另一方面调用ContractB,我只需要ERC721 ABI,我不需要知道ContractB。所以我可以这样做:

ERC721(ADDRESS_OF_CONTRACT_B).safeTransferFrom(...)

在我结束之前,我想强调一下,您的问题实际上并不是关于 Solidity 或智能合约,而是关于面向对象的编程、继承和接口。我建议您阅读更多内容以更好地理解该概念。

【讨论】:

以上是关于从 ERC271 合约继承有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章

ERC20 代币转移到智能合约

如何从智能合约中转移 ERC20 代币而不转移到基本账户

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

我可以使用 PHP 从 ERC20 合约中转移代币吗?

如何检测以太坊地址是不是为 ERC20 代币合约?

为部署在 RinkeBy 测试网上的智能合约执行 ERC20 代币“传输函数”的原始交易