我一直在学习Solidity、区块链和智能合约课程-Python入门教程(https://www.youtube.com/watch?v=M576WGiDBdQ&t=28658s(。
在教程的某个时刻(大约9小时(,存在以下代码行:
weth=interface.IWeth(SomeAddress)
tx=weth.deposit({"from":account, "value": 0.01*10**18})
我的理解是,接口被编译到ABI中,供一些外部实体使用。
IWeth接口如下:
pragma solidity ^0.4.19;
/*this is the interface for the WETH contract */
interface IWeth {
function allowance(address owner, address spender)
external
view
returns (uint256 remaining);
function approve(address spender, uint256 value)
external
returns (bool success);
function balanceOf(address owner) external view returns (uint256 balance);
function decimals() external view returns (uint8 decimalPlaces);
function name() external view returns (string memory tokenName);
function symbol() external view returns (string memory tokenSymbol);
function totalSupply() external view returns (uint256 totalTokensIssued);
function transfer(address to, uint256 value)
external
returns (bool success);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool success);
function deposit() external;
function withdraw(uint256 wad) external;
}
上面的接口没有在项目中的任何地方实现,但项目编译和运行都很好。在我对OOP的有限理解中,接口不应该在某个地方实现吗?如果是,在哪里实施?如果没有,接口(在本例中为IWeth(的存在是否只是为了生成ABI?
此外,我对weth=interface.IWeth(SomeAddress)
中如何使用接口感到困惑。通常,当...InterfaceName(someArg)
甚至没有在接口文件中声明时,我们如何编写它?
提前感谢!
您可以使用合约中的接口来调用另一个合约中的函数。当您需要添加功能时,接口是最有用的,但您使用的不是应用程序的复杂性,而是另一个合同。它们减少了代码重复。
- brownie已经在加载接口。这是来自文档
InterfaceContainer对象(可用作接口(提供访问到项目的接口/文件夹中的接口。
interface.IWeth(SomeAddress)
这个命令告诉以太坊虚拟机使用接口的功能创建给定合同地址的合同实例。然后您的应用程序正在调用该合同实例的deposit