ERC165 是 以太坊 及相关 EVM 兼容区块链上的一个标准,用于检测智能合约是否实现了某些接口(或函数)。它定义了一个标准的方法来查询合约是否实现了某个接口,从而提高了合约的互操作性和可扩展性。
ERC165 通过定义一个标准函数 supportsInterface
,允许智能合约声明它们支持的接口。其他合约或应用程序可以调用这个函数来检查合约是否支持特定的接口。
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
interfaceId
),返回一个布尔值,指示合约是否实现了该接口。以下是一个简单的 ERC165 合约实现示例:
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
contract ERC165Example is IERC165 {
// Mapping of interface id to whether or not it's supported.
mapping(bytes4 => bool) private _supportedInterfaces;
constructor() {
// Register the support of the ERC165 interface
_registerInterface(type(IERC165).interfaceId);
}
// Implementation of the supportsInterface method as per the ERC165 standard.
function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
return _supportedInterfaces[interfaceId];
}
// Internal method for registering interface support
function _registerInterface(bytes4 interfaceId) internal {
require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
_supportedInterfaces[interfaceId] = true;
}
}
在这个示例中,我们实现了 supportsInterface
函数,并使用一个内部函数 _registerInterface
来注册支持的接口。
假设有一个合约实现了 ERC165 接口,其他合约可以通过调用 supportsInterface
来检查它是否支持特定的接口。
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
contract InterfaceChecker {
function checkInterface(address contractAddress, bytes4 interfaceId) external view returns (bool) {
IERC165 erc165 = IERC165(contractAddress);
return erc165.supportsInterface(interfaceId);
}
}
在这个示例中,InterfaceChecker
合约包含一个 checkInterface
函数,用于检查给定合约地址是否支持特定的接口。
ERC165 标准通过定义一个标准的接口检测机制,使得智能合约能够声明它们实现了哪些接口,并允许其他合约和应用程序轻松查询这些信息。这提高了合约的互操作性和可扩展性,是构建复杂和可组合智能合约系统的重要工具。