什么是 Solidity 合约接口?
作者 Alchemy
Solidity 是一种面向对象的高级语言,用于实现智能合约。在使用 Solidity 编写智能合约时,你可能需要使用接口来与其他智能合约交互。掌握接口的用法有助于加深你对 Solidity 语言的理解,也可能为你构建其他有趣的 Solidity 智能合约提供新思路。
本文将介绍什么是 Solidity 合约接口,并展示如何创建接口。我们提供了一些接口实现和声明的示例,供你在编写接口时参考。
什么是 Solidity 接口?
Solidity 合约接口是一份只包含函数定义、不包含实现的列表。 换句话说,接口描述了一个对象要正常运行所必须具备的全部函数。接口对合约强制规定了一组既定的属性和函数。
Solidity 允许你在不掌握其他合约代码的情况下,通过接口与其交互。例如,如果你想从自己的合约中与另一个合约交互,可以为调用提供一个接口包装。通过声明接口,你可以与其他合约交互,并调用另一个合约中的函数。
接口通常位于 Solidity 合约的顶部,使用 “interface” 关键字标识。由于接口能减少代码重复和开销,因此在去中心化应用需要可扩展性、并希望避免复杂性时最为有用。
Solidity 接口的特性
- Solidity 接口可以从其他接口继承
- 合约可以像继承其他合约一样继承接口
- 你可以重写(override)接口函数
- 接口内部定义的数据类型可以被其他合约访问
所有继承自接口的函数,在重写接口函数时都必须设置 override 修饰符,否则Solidity 编译器会抛出错误。
抽象合约与接口的对比
抽象合约和接口是 web3 开发者构建更大型、更复杂的分布式应用的两种方式,因为它们都能在 Solidity 中提供可扩展性。
抽象合约至少有一个函数缺少实现,因此无法被编译。但抽象合约可以作为基础合约,供其他合约继承。
接口与抽象合约类似,但接口中不能有任何已实现的函数。此外,接口的能力受限于合约的应用二进制接口(Application Binary Interface,ABI)所能表达的范围。ABI 与接口之间的转换不会造成任何信息丢失。
如何创建 Solidity 接口
接口通常位于程序顶部,用 “interface” 关键字声明。之后你可以用该接口与另一个合约通信,也可以实现该接口。
假设你正在编写一个智能合约钱包,代码可能类似下面这样:

请注意这里 “is IWallet” 的用法。在这个例子中,我们继承了 IWallet 接口,并在我们的合约 Wallet 中实现了它。
之后,如果有其他智能合约需要与钱包通信(这里以 WalletFriendlyContract 为例),就可以重复使用该接口:

Solidity 接口的要求
在 Solidity 中创建接口时存在一些限制,开发者应牢记以下主要的接口要求:
- 接口中不能有任何已实现的函数
- 接口的函数只能是 external 类型
- 接口不能声明构造函数
- 接口不能声明状态变量
Solidity 接口示例
本节包含一些示例,帮助你编写 Solidity 接口代码。
以下接口代码示例取自 Solidity 官方文档,创建了一个名为 “Token” 的接口,用于获取交易信息。它包含一个函数,用来访问其他合约中关于接收地址和转账金额的信息。

下一个 Solidity 接口示例取自 Solidity by Example,展示了一份完整的合约,包含接口的声明和实现。

开始使用 Alchemy 构建 Solidity 应用
本文介绍了 Solidity 接口,并展示了开发者如何利用接口在用 Solidity 构建应用时节省时间、降低复杂性。若想继续学习 Solidity,可以了解 Alchemy University 的免费 Ethereum 开发者训练营,该课程用 7 周、自定进度的时间讲解 Solidity 开发的核心概念,其中包含大量编程挑战、视频课程,以及掌握 Solidity 的最佳资源。
如果开发者刚接触开发领域,Alchemy University 的为期 3 周的 JavaScript 速成课程是学习 Ethereum 训练营之前很好的预备课程。
相关概览

构建区块链应用
Alchemy 将最强大的 Web3 开发者产品和工具与资源、社区及专业支持结合在一起。


