인터페이스 지원 확인: ERC-165 는 컨트랙트가 특정한 interface 를 지원하는지 확인하기 위한 방법을 제공한다.
이를 통해 외부 애플리케이션은 특정한 기능을 지원하는 컨트랙트를 식별하고 해당 컨트랙트와 상호작용할 수 있다.
인터페이스 감지: ERC-165 는 컨트랙트가 어떤 interface 를 지원하는지 감지할 수 있는 기능을 제공한다. 이를 통해 다른 컨트랙트나 애플리케이션은 특정 컨트랙트가 지원하는 기능을 동적으로 확인하고 해당 기능을 활용할 수 있다.
상호 운용성 강화: ERC-165 는 다양한 컨트랙트와 애플리케이션 간의 상호 운용성을 강화하기 위해 표준화된 인터페이스를 제공한다.
이를 통해 다른 컨트랙트나 애플리케이션 간 통신과 데이터 교환을 원활하게 할 수 있고, 개발자는 표준 인터페이스를 준수함으로써 상호 운용성을 보장할 수 있다.
컨트랙트에서 어떤 함수를 호출할 수 있는지 검사하는 것을 다룬다.
이것을 보통 컨트랙트의 interface 라고 한다.
이더리움에서 애플리케이션은 일반적으로 잘못된 호출을 하지 않는다고 믿어야 한다.
이것은 신뢰할 수 있는 경우 문제가 되지 않지만, 알 수 없거나 신뢰할 수 없는 address 와 상호 작용해야 하는 경우가 많다.
예를 들어 ERC20 토큰을 외부로 전송할 방법이 없는 컨트랙트로 토큰을 전송하여 영원히 자산이 잠길 수 있다.
이런 경우 컨트랙트가 interface 를 선언하면 오류를 방지하는데 매우 유용하다.
이에 대한 접근 방식은 주로 두 가지가 있다.
Local : 컨트랙트가 IERC165 를 구현하고 interface 를 선언한 후, 다른 컨트랙트가 ERC165Checker 를 통해 직접 쿼리하는 방식이다. 이 방식은 로컬에서 interface 를 확인하는 방식으로 컨트랙트 간 직접적인 상호작용에 사용될 수 있다.
Global : 전역적인 고유 레지스트리 (IERC1820Registry) 를 사용하여 특정 인터페이스의 구현자 (IERC1820Implementer) 를 등록하는 경우이다.
이후 레지스트리를 쿼리하여 EOA에 대한 interface 를 구현하는 컨트랙트와 같이 더 복잡한 설정을 할 수 있다.
모든 경우에 계정들은 단순히 interface 를 선언할 뿐, 실제로 구현해야 하는 것은 아니다.
이 메커니즘은 오류 방지와 복잡한 상호작용을 허용하는데 사용할 수 있지만, 보안을 위해 이것에 의존해서는 안된다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
이 컨트랙트가 interfaceId 로 정의된 interface 를 구현하면 true 를 반환한다.
이 함수 호출은 30,000 미만의 가스를 사용해야 한다.
이 표준에서 interface 는 이더리움 ABI 에 정의된 function selectors 의 집합이다.
interface 식별자는 인터페이스에 있는 모든 function selectors 의 XOR 로 정의한다.
아래 코드는 interface identifier 를 계산하는 방법을 보여준다.