接口是否仅用于在 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