Tech/EIPs/#165
ERC 165카테고리 · ERC유형 · 표준 트랙상태 · 최종

Standard Interface Detection

쉬운 설명

스마트 컨트랙트가 어떤 인터페이스(기능 집합)를 지원하는지 외부에서 확인할 수 있게 해줘요. "이 컨트랙트가 ERC-20인가요?" 같은 질문에 답할 수 있어요.

EIP-165는 스마트 컨트랙트가 특정 인터페이스를 지원하는지 표준화된 방법으로 확인할 수 있는 메커니즘을 정의합니다. supportsInterface(bytes4 interfaceId) 단 하나의 함수로 "이 컨트랙트가 ERC-721인가?" 같은 질문에 온체인에서 동적으로 답할 수 있습니다.

supportsInterface 함수

EIP-165를 구현하는 컨트랙트는 function supportsInterface(bytes4 interfaceId) external view returns (bool)를 노출해야 합니다. 이 함수는 컨트랙트가 해당 인터페이스를 지원하면 true, 지원하지 않으면 false를 반환합니다. 단, 잘못된 쿼리에 대해서는 false를 반환해야 하고 가스를 30,000 이하로 소비해야 합니다.

interfaceId 계산: XOR of function selectors

interfaceId는 인터페이스를 구성하는 모든 함수 시그니처의 selector(keccak256 해시의 첫 4바이트)를 XOR한 값입니다. 예를 들어 ERC-721의 interfaceId는 ownerOf, balanceOf, transferFrom 등 9개 함수 selector의 XOR 결과인 0x80ac58cd입니다. EIP-165 자체의 interfaceId는 supportsInterface 하나의 selector = 0x01ffc9a7입니다.

표준 인터페이스 ID 테이블

자주 사용되는 interfaceId: EIP-165 자체 = 0x01ffc9a7, ERC-721 = 0x80ac58cd, ERC-721 Metadata = 0x5b5e139f, ERC-721 Enumerable = 0x780e9d63, ERC-1155 = 0xd9b67a26, ERC-1155 Metadata URI = 0x0e89341c, ERC-2981(로열티) = 0x2a55205a. 이 값들은 인터페이스가 정의되면 변하지 않으므로 하드코딩해서 사용할 수 있습니다.

실용적 사용 사례

NFT 마켓플레이스는 컨트랙트가 ERC-721인지 ERC-1155인지 모르는 상태에서 supportsInterface를 호출해 적절한 전송 함수를 선택합니다. OpenSea 같은 플랫폼은 새로운 NFT 컨트랙트가 등록될 때 EIP-165를 사용해 지원하는 기능을 자동으로 탐지합니다. 또한 컨트랙트 업그레이드 후 새 인터페이스 지원 여부를 확인하는 데도 사용됩니다.

OpenZeppelin 구현

OpenZeppelin의 ERC165 기본 컨트랙트를 상속하면 _registerInterface() 내부 함수로 지원 인터페이스를 등록할 수 있습니다. ERC721, ERC1155 등 모든 OpenZeppelin 토큰 표준은 EIP-165를 자동으로 구현하므로, 개발자는 별도 코드 없이 인터페이스 감지 기능을 얻게 됩니다. 단, supportsInterface의 가스 비용이 30,000을 초과하지 않도록 주의해야 합니다.

공식 ERC 문서open_in_new