본문 바로가기

기타

[블록체인] ERC-721이란?

이 글은 이더리움 공식문서를 번역한 글입니다. 잘못된 번역이 있을 수 있습니다.
링크 : https://ethereum.org/ko/developers/docs/standards/tokens/erc-721/
링크 : https://eips.ethereum.org/EIPS/eip-721


What is ERC-721?

ERC-721은 NFT를 위한 표준입니다. ERC-721 타입의 토큰은 유니크하며, 동일한 스마트 컨트랙트에서 생성된 다른 토큰들과 다른 값을 지닐 수 있습니다. 즉, 서로 대체 불가능한 고유한 토큰이라는 의미입니다. 이게 가능한 이유는 토큰의 나이, 희귀함, 눈에 보이는 것들이 다르기 때문입니다.

이때 '눈에 보이는 것들'은 tokenId라고 불리는 uint256형 변수입니다. ERC-721 타입의 모든 컨트랙트에서 생성된 NFT들은 contract address, uint256 tokenId를 통해 전역적으로 유니크한 값을 갖게 됩니다. DApp에서는 tokenId를 입력으로 받아 해당 NFT의 데이터를 출력하는 '컨버터'기능을 수행할 수 있습니다.

DApp이란?

  • 탈중앙화 분산 어플리케이션 : 서버-클라이언트 구조에서의 서버와 DB가 이더리움 네트워크상에 존재하는 형태로 변형된 것. 즉, 서버가 존재하지 않으며, 데이터는 이더리움 네트워크에 존재하는 각 노드들에 저장된다.
  • 데이터나 거래는 생성된 이후에 삭제가 불가능하다.
  • 정보는 모두 공개되고 공공 거래 장부에 모두 기록한다.
  • 기능을 이용하기 위해서 토큰/코인이 필요하다. 즉, 기능 이용에 따른 비용 존재.

BODY

ERC-721는 '하나의 account에서 다른 account로 토큰을 전송하기', 'account의 현재 토큰 잔액을 가져오기', '소유자의 특정 토큰을 가져오기', '네트워크에서 이코드를 입력하세요용가능한 모든 토큰들을 가져오기'와 같은 기능들을 제공합니다. 추가적으로, 어느 account에서 third party account로 토큰이 전송될 수 있는지에 대한 인증 기능을 제공합니다.

만약 스마트 컨트랙트가 아래의 메소드들과 이벤트들을 구현했다면, ERC-721 Contract라고 지칭할 수 있습니다. 또한, ERC-721 Contract에서 생성된 토큰은 이더리움에서 생성된 토큰에 대해 책임을 질 것입니다.

Methods

    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);
  • balanceOf(address _owner) external view returns (uint256);
    • 기능 : 소유자가 가지고 있는 NFT의 개수를 반환.
    • 입력받은 _owner의 address가 invalid한다면, throw를 날림.
  • ownerOf(uint256 _tokenId) external view returns (address);
    • 기능 : NFT의 소유자를 찾아, 소유자의 address를 반환.
    • NFT가 invalid한 zero address에 할당되있면, throw를 날림.
  • safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
    • 기능 : 소유권을 가지고 있는 NFT를 어느 address에서 다른 address로 전송.
    • 요구사항
      • msg.sender는 NFT 소유자
      • operator는 권한을 부여받은 상태 또는 NFT에 대해 인증 받은 address여야 함
      • _from은 현재 사용자
      • _tokenId는 valid한 상태
    • 전송이 완료된 이후,_to가 스마트 컨트랙트라면, _to에 대해서 onERC721Received를 호출한다.
  • transferFrom(address _from, address _to, uint256 _tokenId) external payable;
    • safeTransferFrom()과 유사하지만, 함수 호출자는 _to가 NFT를 전송받을 수 있는 address인지 직접 확인해야 한다.
    • 만약, _to가 NFT를 받을 수 없는 address라면, 전송된 NFT는 영구적으로 사라진다.
  • approve(address _approved, uint256 _tokenId) external payable;
    • 기능 : NFT에 대해 address가 approve하도록 변경하거나, 재확인한다.
    • 요구사항 : msg.sender는 NFT 소유자이거나 현재 owner로 부터 인가받은 operator
  • setApprovalForAll(address _operator, bool _approved) external;
    • 기능 : third party("operator")에게 msg.sender의 모든 자산에 대한 권한을 부여하거나 해제한다.
    • 함수 호출 시, ApprovalForAll 이벤트가 전송됨.
  • getApproved(uint256 _tokenId) external view returns (address);
    • 기능 : 단인 NFT에 대해, 권한을 받은 address를 가져옴.
  • isApprovedForAll(address _owner, address _operator) external view returns (bool);
    • 기능 : _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.


Events

    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);
  • Transfer()
    • NFT의 소유권이 변경되면 발생한다.
    • NFT가 생성되거나 삭제될 때도 발생한다.
    • Contract가 생성되는 동안에 NFT가 생성되거나 소유권이 이전된다면, 위 Event가 발생하지 않을 수 있다.
  • Approval()
    • NFT에 대한 approve된 address가 변경되거나 재확인 될 때 발생한다.
  • ApprovalForAll()
    • operator가 owner에 대해 권한을 부여받거나 해제될 때 발생한다.