接口是否仅用于在 Solidity 中生成 ABI?
Are Interfaces used for the sole purpose of generating ABI's in Solidity?
我一直在关注 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 已经在加载界面。这是来自 docs
The InterfaceContainer object (available as interface) provides access
to the interfaces within your project’s interfaces/ folder.
interface.IWeth(SomeAddress)
这告诉以太坊虚拟机创建具有接口功能的给定合约地址的合约实例。然后您的应用程序正在调用该合同实例的 deposit
我一直在关注 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 已经在加载界面。这是来自 docs
The InterfaceContainer object (available as interface) provides access to the interfaces within your project’s interfaces/ folder.
interface.IWeth(SomeAddress)
这告诉以太坊虚拟机创建具有接口功能的给定合约地址的合约实例。然后您的应用程序正在调用该合同实例的deposit