이 글은 이더리움 공식문서를 번역한 글입니다. 잘못된 번역이 있을 수 있습니다.
링크 : https://ethereum.org/ko/developers/docs/standards/tokens/erc-721/
링크 : https://eips.ethereum.org/EIPS/eip-721
ERC-721은 NFT를 위한 표준입니다. ERC-721 타입의 토큰은 유니크하며, 동일한 스마트 컨트랙트에서 생성된 다른 토큰들과 다른 값을 지닐 수 있습니다. 즉, 서로 대체 불가능한 고유한 토큰이라는 의미입니다. 이게 가능한 이유는 토큰의 나이, 희귀함, 눈에 보이는 것들이 다르기 때문입니다.
이때 '눈에 보이는 것들'은 tokenId라고 불리는 uint256형 변수입니다. ERC-721 타입의 모든 컨트랙트에서 생성된 NFT들은 contract address, uint256 tokenId를 통해 전역적으로 유니크한 값을 갖게 됩니다. DApp에서는 tokenId를 입력으로 받아 해당 NFT의 데이터를 출력하는 '컨버터'기능을 수행할 수 있습니다.
DApp이란?
- 탈중앙화 분산 어플리케이션 : 서버-클라이언트 구조에서의 서버와 DB가 이더리움 네트워크상에 존재하는 형태로 변형된 것. 즉, 서버가 존재하지 않으며, 데이터는 이더리움 네트워크에 존재하는 각 노드들에 저장된다.
- 데이터나 거래는 생성된 이후에 삭제가 불가능하다.
- 정보는 모두 공개되고 공공 거래 장부에 모두 기록한다.
- 기능을 이용하기 위해서 토큰/코인이 필요하다. 즉, 기능 이용에 따른 비용 존재.
ERC-721는 '하나의 account에서 다른 account로 토큰을 전송하기', 'account의 현재 토큰 잔액을 가져오기', '소유자의 특정 토큰을 가져오기', '네트워크에서 이코드를 입력하세요용가능한 모든 토큰들을 가져오기'와 같은 기능들을 제공합니다. 추가적으로, 어느 account에서 third party account로 토큰이 전송될 수 있는지에 대한 인증 기능을 제공합니다.
만약 스마트 컨트랙트가 아래의 메소드들과 이벤트들을 구현했다면, ERC-721 Contract라고 지칭할 수 있습니다. 또한, ERC-721 Contract에서 생성된 토큰은 이더리움에서 생성된 토큰에 대해 책임을 질 것입니다.
function balanceOf(address _owner) external view returns (uint256);
function ownerOf(uint256 _tokenId) external view returns (address);
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
function approve(address _approved, uint256 _tokenId) external payable;
function setApprovalForAll(address _operator, bool _approved) external;
function getApproved(uint256 _tokenId) external view returns (address);
function isApprovedForAll(address _owner, address _operator) external view returns (bool);
msg.sender는 NFT 소유자_from은 현재 사용자_tokenId는 valid한 상태_to가 스마트 컨트랙트라면, _to에 대해서 onERC721Received를 호출한다.safeTransferFrom()과 유사하지만, 함수 호출자는 _to가 NFT를 전송받을 수 있는 address인지 직접 확인해야 한다._to가 NFT를 받을 수 없는 address라면, 전송된 NFT는 영구적으로 사라진다.msg.sender는 NFT 소유자이거나 현재 owner로 부터 인가받은 operatormsg.sender의 모든 자산에 대한 권한을 부여하거나 해제한다.ApprovalForAll 이벤트가 전송됨._operator가 _owner에 대해 권한을 받은 operator인지 확인.msg.sender : 솔리디티에서 현재 함수를 호출한 사람(혹은 컨트랙트)의 주소를 가리키는 키워드
approve()에 대한 추가설명Approves another address to transfer the given token ID. The zero address indicates there is no approved address. There can only be one approved address per token at a given time. Can only be called by the token owner or an approved operator.
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);