---
title: "什么是 Solidity 合约接口?"
description: "关于 Solidity 智能合约接口你需要了解的一切"
---

# 什么是 Solidity 合约接口?

**[Solidity](https://www.alchemy.com/overviews/solidity)** 是一种面向对象的高级语言，用于实现智能合约。在[使用 Solidity 编写智能合约](https://www.alchemy.com/overviews/solidity-smart-contract)时，你可能需要使用接口来与其他智能合约交互。掌握接口的用法有助于加深你对 Solidity 语言的理解，也可能为你构建其他有趣的 Solidity 智能合约提供新思路。

本文将介绍什么是 Solidity 合约接口，并展示如何创建接口。我们提供了一些接口实现和声明的示例，供你在编写接口时参考。

## **什么是 Solidity 接口？**

**Solidity 合约接口是一份只包含函数定义、不包含实现的列表。** 换句话说，接口描述了一个对象要正常运行所必须具备的全部函数。接口对合约强制规定了一组既定的属性和函数。

Solidity 允许你在不掌握其他合约代码的情况下，通过接口与其交互。例如，如果你想从自己的合约中与另一个合约交互，可以为调用提供一个接口包装。通过声明接口，你可以与其他合约交互，并[调用另一个合约中的函数](https://www.alchemy.com/overviews/solidity-call-another-contract)。

接口通常位于 Solidity 合约的顶部，使用 “interface” 关键字标识。由于接口能减少代码重复和开销，因此在去中心化应用需要可扩展性、并希望避免复杂性时最为有用。

### **Solidity 接口的特性**

1. Solidity 接口可以从其他接口继承
1. 合约可以像继承其他合约一样继承接口
1. 你可以重写（override）接口函数
1. 接口内部定义的数据类型可以被其他合约访问

所有继承自接口的函数，在重写接口函数时都必须设置 override 修饰符，否则[Solidity 编译器](https://www.alchemy.com/overviews/solidity-compiler)会抛出错误。

### **抽象合约与接口的对比**

**抽象合约和接口是 web3 开发者构建更大型、更复杂的分布式应用的两种方式，因为它们都能在 Solidity 中提供可扩展性。**

抽象合约至少有一个函数缺少实现，因此无法被编译。但抽象合约可以作为基础合约，供其他合约继承。

接口与抽象合约类似，但接口中不能有任何已实现的函数。此外，接口的能力受限于合约的[应用二进制接口（Application Binary Interface，ABI）](https://www.alchemy.com/overviews/solidity-abi)所能表达的范围。ABI 与接口之间的转换不会造成任何信息丢失。

## **如何创建 Solidity 接口**

**接口通常位于程序顶部，用 “interface” 关键字声明。之后你可以用该接口与另一个合约通信，也可以实现该接口。**

假设你正在编写一个智能合约钱包，代码可能类似下面这样：

<ImageBlock
  src="https://media.alchemy.com/1703924327-how-to-create-a-solidity-interface.png"
  alt="如何创建 Solidity 接口"
  width={1346}
  height={894}
  caption="如何创建 Solidity 接口"
/>

请注意这里 “`is IWallet`” 的用法。在这个例子中，我们继承了 `IWallet` 接口，并在我们的合约 `Wallet` 中实现了它。

之后，如果有其他智能合约需要与钱包通信（这里以 `WalletFriendlyContract` 为例），就可以重复使用该接口：

<ImageBlock
  src="https://media.alchemy.com/1703924551-re-use-solidity-interface.png"
  alt="复用 Solidity 接口"
  width={1548}
  height={894}
  caption="复用 Solidity 接口"
/>

### Solidity 接口的要求

在 Solidity 中创建接口时存在一些限制，开发者应牢记以下主要的接口要求：

1. 接口中不能有任何已实现的函数
1. 接口的[函数](https://www.alchemy.com/overviews/solidity-functions)只能是 external 类型
1. 接口不能声明构造函数
1. 接口不能声明状态变量

## **Solidity 接口示例**

本节包含一些示例，帮助你编写 Solidity 接口代码。

以下[接口代码示例](https://docs.soliditylang.org/en/v0.8.17/contracts.html#interfaces)取自 **Solidity 官方文档**，创建了一个名为 “Token” 的接口，用于获取交易信息。它包含一个函数，用来访问其他合约中关于接收地址和转账金额的信息。

<ImageBlock
  src="https://media.alchemy.com/1703924819-example-interface-code.png"
  alt="接口代码示例"
  width={1318}
  height={550}
  caption="接口代码示例"
/>

下一个 [Solidity 接口示例](https://www.solidity-by-example.org/interface/)取自 **Solidity by Example**，展示了一份完整的合约，包含接口的声明和实现。

<ImageBlock
  src="https://media.alchemy.com/1703924953-full-contract-with-interface-declaration-and-implementation.jpg"
  alt="包含接口声明与实现的完整合约"
  width={1053}
  height={1600}
  caption="包含接口声明与实现的完整合约"
/>

## **开始使用 Alchemy 构建 Solidity 应用**

本文介绍了 Solidity 接口，并展示了开发者如何利用接口在用 Solidity 构建应用时节省时间、降低复杂性。若想[继续学习 Solidity](https://www.alchemy.com/overviews/learn-solidity)，可以了解 Alchemy University 的[免费 Ethereum 开发者训练营](https://university.alchemy.com/?a=d3f70d2955)，该课程用 7 周、自定进度的时间讲解 Solidity 开发的核心概念，其中包含大量编程挑战、视频课程，以及掌握 Solidity 的最佳资源。

如果开发者刚接触开发领域，Alchemy University 的**为期 3 周的 JavaScript 速成课程**是学习 Ethereum 训练营之前很好的预备课程。
