ERC721이란? (Openzepplin)

HyeongA·2023년 7월 27일
1

Blockchain

목록 보기
3/8
post-thumbnail

📝ERC-721이란?

  • 721번째로 등록된 EIP
  • 흔히 이야기하는 NFT(Non-Fungible Token)
  • A standard interface for non-fungible tokens.
  • ERC20의 경우 교환 및 대체 가능하지만, ERC721은 대체불가

🔎 NFT란?

대체 불가능한 토큰이라는 뜻이다. NFT는 tokenId를 가지기 때문에 모두 구분 가능하고 각 토큰마다 별도의 소유권을 추적할 수 있다. 따라서 NFT는 발행순서와 세부 데이터에 따라 상이한 가치를 가진다. 반면, 토큰은 발행 순서와 관계없이 전부 동일한 가치를 가진다.
포켓몬 카드는 NFT, 지폐는 토큰이라 생각하면 쉽다. 포켓몬 카드를 살펴보자. 카드의 규격과 구성 목록은 동일하지만, 카드의 내용(포켓몬의 종류, 속성 등)에 따라 가치가 달라진다. 그러나 천원짜리 지폐는 어떤가? 발행 순서와 무관하게 모두 동일한 가치를 가진다.


  • ERC-721은 코드가 공개되어 있어 누구나 쉽게 배포 가능함
  • 가장 표준적이고 안정적인 구현체 : Openzepplin, Consensys

💻 ERC-721 (Openzepplin)

🔎 Openzepplin ERC-721

ERC721_openzeppelin : openzeppelin의 ERC721 코드는 필수적인 요소 외에도 사용하기 편한 기능들이 많이 포함되어 있다.

CODE 구성

CODE 구성 항목요소
functionbalanceOf, ownerOf, transferFrom, safeTransferFrom, safeTransferFrom, approve, getApproved, setApprovalForAll, isApprovedForAll
eventTransfer, Approval, ApprovalForAll
mapping_balances, _owners, _tokenApprovals, _operatorApprovals

ERC721로 인식되기 위한 기본 스펙은 위의 표와 같다. name, symbol, tokenURI는 필수 요소는 아니지만 보통 포함시켜 구현하는 편이다.

🔎 Function / Event / Mapping

  • tokenURI : token에 대한 metadata를 포함한 UIR 반환
  • _balances : key-주소 / value-잔고인 mapping
  • balanceof : 해당 account의 잔고
  • ownerOf (_ownerOf) :해당 tokenId의 owner를 반환

  • approve
    - 내 자산을 특정 조건이되면 사용할 수 있도록 권한 부여하는 함수
    - 본인이거나, 모든 권한을 부여받았을 경우 사용가능
  • getApproved : 특정 토큰이 누구에게 허용되었는지 주소 반환
  • setApprovalForAll : 보유한 모든 토큰에 대한 권한 부여 or 회수
    mapping(address => mapping(address=> bool)) private _operatorApprovals;
    - 첫번째 address : 본인
    - 두번째 address : 권한을 넘길/회수할 CA
    - bool : true-권한부여, false-권한회수
  • isApprovedForAll : 보유한 모든 토큰의 권한을 부여 받았는지 확인
  • transferFrom : from에서 to로 전송
  • safeTransferFrom : transferFrom보다 안전한 거래를 위한 함수
    - transferFrom과 로직 거의 동일
    - 다른점은 _checkOnERC721Received여부
    - _checkOnERC721Received를 통해 받는 사람이 받을 수 있는 조건이 되는지 확인 (EOA인지, CA라면 Received가 잘 구현이 되어있는지...)

코드와 함께 살펴보기
transferFrom / approve 개념 자세히 알아보기 👉 ERC20

profile
Today I Learned

0개의 댓글