diff --git a/FFFFourwood.md b/FFFFourwood.md index d587cd1f..6efb0807 100644 --- a/FFFFourwood.md +++ b/FFFFourwood.md @@ -335,20 +335,26 @@ Solidity的合约可以继承多个合约。规则: - 重写在多个父合约中都重名的函数时,`override`关键字后面要加上所有父合约名字。 ### 2024.09.29 +抽象合约 + +如果一个智能合约里至少有一个未实现的函数,即某个函数缺少主体 `{}` 中的内容,则必须将该合约标为 `abstract`,不然编译会报错。另外,未实现的函数需要加 `virtual`,以便子合约重写。拿之前的插入排序合约为例,如果还没想好具体怎么实现插入排序函数,可以把合约标为 `abstract`,之后让别人补写上。 + + 接口 + 接口类似于抽象合约,但它不实现任何功能。接口的规则: +- 不能包含状态变量 +- 不能包含构造函数 +- 不能继承除接口外的其他合约 +- 所有函数都必须是 `external` 且不能有函数体 +- 继承接口的非抽象合约必须实现接口定义的所有功能 + +虽然接口不实现任何功能,但它非常重要。接口是智能合约的骨架,定义了合约的功能以及如何触发它们:如果智能合约实现了某种接口(比如 ERC20 或 ERC721),其他 DApps 和智能合约就知道如何与它交互。因为接口提供了两个重要的信息: +- 合约里每个函数的 `bytes4` 选择器,以及函数签名函数名(每个参数类型)。 +- 接口 ID(更多信息见 EIP165)。 + +另外,接口与合约 ABI(Application Binary Interface)等价,可以相互转换:编译接口可以得到合约的 ABI,利用 `abi-to-sol` 工具,也可以将 ABI json 文件转换为接口 sol 文件。 -* 不能包含状态变量 -* 不能包含构造函数 -* 不能继承除接口外的其他合约 -* 所有函数都必须是 external 且不能有函数体 -* 继承接口的非抽象合约必须实现接口定义的所有功能 -* 虽然接口不实现任何功能,但它非常重要。接口是智能合约的骨架,定义了合约的功能以及如何触发它们。如果智能合约实现了某种接口(比如 ERC20 或 ERC721),其他 DApps 和智能合约就知道如何与它交互。因为接口提供了两个重要的信息: - - * 合约里每个函数的 bytes4 选择器,以及函数签名函数名(每个参数类型)。 - * 接口 ID(更多信息见 EIP165)。 - * -另外,接口与合约 ABI(Application Binary Interface)等价,可以相互转换:编译接口可以得到合约的 ABI,利用 abi-to-sol 工具,也可以将 ABI json 文件转换为接口 sol 文件。