CryptoZombies 5

ERC20, ERC721

토큰 : 몇몇 공통 규약을 따르는 스마트 컨트랙트

ERC721 표준


contract ERC721 {
  event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
  event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function transfer(address _to, uint256 _tokenId) public;
  function approve(address _to, uint256 _tokenId) public;
  function takeOwnership(uint256 _tokenId) public;
}

토큰 컨트랙트

  • 컨트랙트는 다수의 컨트랙트를 상속할 수 있다.

contract SatoshiNakamoto is NickSzabo, HalFinney {
  // 오 이런, 이 세계의 비밀이 밝혀졌군!
}

balanceOf

function balanceOf(address _owner) public view returns (uint256 _balance);

address를 받아서 그 해당 값이 토큰을 얼마나 가지고 있는지 반환.
크립토 좀비에서는 좀비를 의미하고, 어떤 유저가 얼마나 많은 좀비를 소유하고 있는지를 의미한다.

ownerOf

토큰 ID(크립토 좀비에서는 좀비ID)를 받고, 이 ID를 소유하고 있는 사람의 address를 반환.

  function ownerOf(uint256 _tokenId) public view returns (address _owner);

리팩토링

기존에 우리의 코드에서 사용하던 modifier의 이름이 토큰 표준 함수의 이름과 같아서 바꿔줘야 함.

ERC721 토큰 표준을 사용하고 있다는 것은 다른 컨트랙트들도 우리의 컨트랙트가 정확한 이름으로 정의된 함수를 가지고 있고 그렇게 작동할 것을 기대한다는 것.
이를 통해서 다른 컨트랙트는 우리의 내부 구현 로직을 모르더라도 토큰 표준 함수들을 통해서 우리와도 통신할 수 있다.

  • 매핑: 솔리디티에서 구조화된 데이터를 저장하는 또다른 방법
    (key - value)

ERC721 전송로직

ERC721를 전송하는 방법에는 2가지 방식이 있다.

  1. transfer
    토큰의 소유자가 전송상대의 address 와 전송하고자 하는 _tokenId 와 함께 transfer 함수를 호출한다.
function transfer(address _to, uint256 _tokenId) public;
  1. approve
    위의 정보를 가지고 approve 함수를 호출하고나서 컨트랙트에 누가 해당 토큰을 가질 수 있도록 허가를 받았는지 저장. (2 단계로 구성)
function approve(address _to, uint256 _tokenId) public;
function takeOwnership(uint256 _tokenId) public;

approve 방식의 경우에 2번의 함수 호출이 발생하기 때문에 함수 호출 사이에 누가 무엇에 대해 승인이 허가났는지 저장할 데이터 구조가 필요하다.
takeOwnership 함수에서는 msg.sender가 토큰을 가질 수 있도록 승인되었는지 확인하고, 확인이 되면 _transfer 호출

라이브러리(Library)

솔리디티에서 특별한 종류의 컨트랙트
기본(native) 데이터 타입에 함수를 붙일 때 유용하게 사용됨.

  • using 키워드를 사용할 수 있게 해줌 : 라이브러리의 메소드들을 다른 데이터 타입에 적용할 수 있다.
  • using 키워드를 선언하면 우리가 함수를 적용할 때, 인수가 저절로 전달된다.

SafeMath

오버플로우와 언더플로우 같은 문제를 막아주는 라이브러리.

  • 일반적으로 기본 수학연산보다 SafeMath를 사용하는것이 안전성을 위하여 좋다.

assert

require과 비슷하게 조건을 만족시키지 않으면 에러를 발생시킴.
차이점: require 함수는 실패하면 남은 가스를 되돌려 줌.

  • assert는 그렇지 않다. (그래서 코드가 심각하게 잘못 실행될 때 사용하고 대부분은 require을 사용한다.)

좋은 웹페이지 즐겨찾기