일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 러스트기초
- SBT표준
- 프록시배포구조
- 머신러닝기초
- rust 기초
- ethers
- 러스트 기초 학습
- 체인의정석
- 스마트컨트렉트 예약어 함수이름 중복
- ethers type
- ethers typescript
- chainlink 설명
- 깃허브명령어
- ambiguous function description
- 스마트컨트렉트프록시
- 컨트렉트 동일한 함수이름 호출
- ethers v6
- 컨트렉트 배포 자동화
- 스마트 컨트렉트 함수이름 중복
- ethers websocket
- Vue
- vue기초
- Vue.js
- git rebase
- nestjs 튜토리얼
- nest.js설명
- 스마트컨트렉트 함수이름 중복 호출
- 스마트컨트렉트테스트
- 러스트 기초
- multicall
Archives
- Today
- Total
체인의정석
ERC-165에 대하여 본문
728x90
반응형
구버전의 NFT의 구현 코드를 보다가 ERC165를 발견하게 되었다.
요약하자면 해당 내용은 함수의 selector를 빼와서 컨트렉트에서 표준을 잘 지켰는지를 확인해 주는 코드 이다.
/*
* bytes4(keccak256('balanceOf(address)')) == 0x70a08231
* bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
* bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
* bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
* bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
* bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c
* bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
* bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
* bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
*
* => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
* 0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
*/
bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
constructor () public {
// register the supported interfaces to conform to ERC721 via ERC165
_registerInterface(_INTERFACE_ID_ERC721);
}
ERC721에는 해당 부분을 이용하여 표준에 해당하는 함수를 모두 포함하고 있는지를 확인하고 있다.
이 함수에 대한 내용은 ERC165에서 확인이 가능하다.
처음 만들 때 인터페이스 아이디를 만들어서 변수형태로 박아두는 것이다.
/**
* @dev Registers the contract as an implementer of the interface defined by
* `interfaceId`. Support of the actual ERC165 interface is automatic and
* registering its interface id is not required.
*
* See {IERC165-supportsInterface}.
*
* Requirements:
*
* - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
*/
function _registerInterface(bytes4 interfaceId) internal {
require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
_supportedInterfaces[interfaceId] = true;
}
다음과 같이 일부러 인터페이스를 지켰음을 나타내는 증거물을 컨트렉트에서 넣어두고 확인하려고 만드는 모듈이다.
이러한 ERC165는 최신버전에도 사용중임을 확인할 수 있었다.
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
보면 인터페이스에서 아이디를 받아와서 맞는지를 확인해주고 있다.
따라서 표준을 맞추었는지 체크하기 위해서 오늘날까지 사용중인 중요한 규약임을 확인하였다.
728x90
반응형
'블록체인 > Solidity' 카테고리의 다른 글
Comments