You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solidity中接口签名是什么?ERC1155相关代码疑问解析

Solidity接口签名与ERC-1155中supportsInterface函数解析

什么是Solidity接口签名?

Solidity中的接口签名(又称接口ID)是bytes4类型的固定值,用于唯一标识一个合约接口。它的计算规则是:将接口中所有函数的函数选择器(函数签名的Keccak-256哈希前4字节)进行异或(XOR)运算,最终得到的结果就是该接口的签名。

函数选择器的计算方式为:bytes4(keccak256("函数名(参数类型列表)")),比如supportsInterface(bytes4)的选择器就是bytes4(keccak256("supportsInterface(bytes4)"))。

supportsInterface函数的作用

这个函数是ERC-165标准定义的核心检测方法,作用是让外部调用者(或合约)快速验证当前合约是否实现了某个指定的接口。通过传入目标接口的bytes4签名,函数返回true或false,避免因调用未实现的函数导致交易失败或报错。

代码中INTERFACE_SIGNATURE常量的来源

  • INTERFACE_SIGNATURE_ERC165:对应ERC-165接口本身的签名。由于ERC-165接口只定义了supportsInterface(bytes4)这一个函数,所以它的接口ID就是该函数的选择器,计算结果为0x01ffc9a7。
  • INTERFACE_SIGNATURE_ERC1155:对应ERC-1155标准接口的签名。它是将ERC-1155定义的所有核心函数的选择器逐个异或后得到的结果,最终值为0xd9b67a26。这些核心函数包括:
    • safeTransferFrom(address,address,uint256,uint256,bytes)
    • safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)
    • balanceOf(address,uint256)
    • balanceOfBatch(address[],uint256[])
    • setApprovalForAll(address,bool)
    • isApprovedForAll(address,address)

代码块的逻辑说明

你贴出的这段代码是合约对ERC-165标准的实现:

bytes4 constant private INTERFACE_SIGNATURE_ERC165 = 0x01ffc9a7;
bytes4 constant private INTERFACE_SIGNATURE_ERC1155 = 0xd9b67a26;

function supportsInterface(bytes4 _interfaceID) override external view returns (bool) {
  if (_interfaceID == INTERFACE_SIGNATURE_ERC165 ||
      _interfaceID == INTERFACE_SIGNATURE_ERC1155) {
    return true;
  }
  return false;
}

当外部调用者传入0x01ffc9a7(ERC-165接口ID)或0xd9b67a26(ERC-1155接口ID)时,函数返回true,声明当前合约已实现这两个标准接口;传入其他值则返回false。

内容的提问来源于stack exchange,提问作者WHOATEMYNOODLES

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:40:29