interface - 我很难理解 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时,实际上正在执行哪些代码?
解决方案
我相信我得到了令我困惑的主要问题。
因此,如果您来自 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 背景。
请随时指出我的回答中存在误导性的任何内容。
推荐阅读
- html - Chrome 或 iOS Safari 没有为 PWA 触发“beforeinstallprompt”
- swiftui - 如何在 SwiftUI 中更新单个子视图?
- ios - 上传游戏但没找到
- ios - 编译器抛出预期模式错误,同时尝试从元组中提取值
- node.js - 无法在 Mongoose 和 Express 中调用嵌套键(未定义)
- c++ - 二元运算符声明的“静态”关键字
- python-3.x - 在 jupyter 中安装 psi4 环境时出现问题
- android - 如何删除饼图中的底部空间?
- git - 詹金斯如何创建一些带有推送标签的容器,称为name_v0.01?
- machine-learning - 回到 XOR 问题的基础 - 从根本上混淆