跳到主要内容

ERC-165: Standard Interface Detection

原文

通过 ERC165 标准,智能合约可以声明它支持的 ERC 标准的接口,供其他合约检查。IERC165 接口合约只声明了一个 supportsInterface 函数,输入要查询的 interfaceId,若合约实现了该接口 id,则返回 true:

interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface Id

interfaceId 是一个用于标识合约接口的 4 字节的值。它通常用于符合 ERC-165 标准的智能合约来描述其支持的接口。

对于接口 IUser:

interface IUser {
function getAge() external view returns (uint);
function setAge(uint _age) external;
}

计算 interfaceId:

function getInterfaceId() public view returns (bytes4) {
return IUser.getAge.selector ^ IUser.setAge.selector;
}

function getInterfaceId() public view returns (bytes4) {
return type(IUser).interfaceId;
}

Implement

在合约中实现 ERC165 接口, 判断当前合约是否实现了 IERC721

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/interfaces/IERC165.sol";
import "@openzeppelin/contracts/interfaces/IERC721.sol";

contract Test is IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool) {
return
interfaceId == type(IERC165).interfaceId ||
interfaceId == type(IERC721).interfaceId;
}
}