在这一章节中,我们将介绍 Cairo 中的接口,并比较它与 Solidity 中接口的异同。
接口
在 Solidity 中,接口是一组没有函数体的函数的定义列表。接口给合约规定了一组必须实现的属性和函数,方便其他合约与它们进行交互,而无需掌握它们的代码。
让我们来看看 ERC20 代币标准的 IERC20
接口。这个接口概述了为遵循这个标准必须实现的函数。
你可以使用 IERC20
合约与遵循 ERC20 标准的合约进行交互,例如 USDC
,而无需了解其代码。
另外,接口与合约ABI(Application Binary Interface)等价,可以相互转换。
Cairo 中的接口
在 Cairo 中,接口是用 #[starknet::interface]
属性标记的 trait
,功能与 Solidity 中类似。规则如下:
- 必须明确声明函数的装饰器。
- 其中的函数不应被实现。
- 不应声明构造函数。
- 不应声明状态变量。
- 不应声明事件(与 Solidity 不同)。
- 所有
view
函数需要包含参数self: @TContractState
,external
函数需要包含参数ref self: TContractState
。
让我们用 Cairo 重写 Solidity 的 IERC20 合约:
总结
本章我们以 IERC20 为例,探讨了 Cairo 和 Solidity 中接口的异同。接口给合约规定了一组必须实现的属性和函数,方便其他合约与它们进行交互,而无需掌握它们的代码。