首页 > 解决方案 > 我很难理解 Solidity 中的接口。我错过了什么?

问题描述

我来自 Java OOP 背景并了解接口。

目前正在开发一个简单的预算应用程序(https://github.com/compound-developers/compound-supply-examples),该应用程序采用 ETH 或稳定币并投入 Compound 并赚取利息。

我的困惑是如何使用 Solidity 接口。我来自 OOP (Java) 背景,对接口非常熟悉。

所以在这段代码(MyContracts.sol)中你可以看到接口中有一个mint()函数。但是,它没有实现,但是您可以看到它在此处使用uint mintResult = cToken.mint(_numTokensToSupply);而没有任何实现。

任何人都可以在没有实现的情况下如何使用接口函数吗?在这种情况下调用mint时,实际上正在执行哪些代码?

标签: interfaceethereumsolidity

解决方案


我相信我得到了令我困惑的主要问题。

因此,如果您来自 OOP 背景,我们对接口的了解如下:

interface IERC20 { 
   function totalSupply() external view returns (uint256);
}

contract XYZ is IERC20 {
// then implement totalSupply here 
function totalSupply() external view returns (uint256) {
// implementiation goes here. 
address public add='0x123...4'
}

所以此时你可以打电话给XYZ totalSupply(),你应该没问题。

但是,在 Solidity 中还有另一种使用接口的方法。我将以复合协议中的这段代码为例(https://github.com/compound-developers/compound-supply-examples

如果您看到MyContracts.sol,它具有以下界面:

interface CEth {
    function mint() external payable;

    function exchangeRateCurrent() external returns (uint256);

    function supplyRatePerBlock() external returns (uint256);

    function redeem(uint) external returns (uint);

    function redeemUnderlying(uint) external returns (uint);
}

但是,我们的合约中没有任何地方使用关键字IS并实现任何方法。所以你可能会问我们的界面是如何使用的?

现在让我们回到文件中的MyContract合约,MyContracts.sol并在函数下查看这段代码supplyEthToCompound

CEth cToken = CEth(_cEtherContract);

在这里,我们提供了带有 Compound 合约地址的 CEth 接口(即_cEtherContract,该地址的合约具有mint()函数。)

当你 cToken.exchangeRateCurrent();在下一行调用时,我们基本上是在 Compound Contract 上调用函数exchangeRateCurrent 。

起初, exchangeRateCurrent似乎在我们调用它的文件中没有实现,但实现位于_cEtherContract地址。

我希望这可以消除混淆,尤其是如果您来自传统的 OOP 背景。

请随时指出我的回答中存在误导性的任何内容。


推荐阅读