크립토 키티 소스 코드 분석(4) ERC721

in kr •  7 years ago 

크립토 키티 소스 코드 분석 4번째 컨트랙트 ERC721
아마 이 게임때문에 ERC721이 뜨지 않았나 싶다. (게임이 나올때는 ERC721가 Draft버전이였다)

KittyCore <- KittyMinting <- KittyAuction <- KittyBreeding <- KittyOwnership <- KittyBase, ERC721

KittyBase <- KittyAccessControl

여기서 쓴 ERC721은 아직 github의 issue에 논의되고 있었던 상태이고 정식으로 채택되지 않은 상태였다. 그럼 크립토 키티에서 쓴 ERC721은 다음과 같다.

contract ERC721 {
    // Required methods
    function totalSupply() public view returns (uint256 total);
    function balanceOf(address _owner) public view returns (uint256 balance);
    function ownerOf(uint256 _tokenId) external view returns (address owner);
    function approve(address _to, uint256 _tokenId) external;
    function transfer(address _to, uint256 _tokenId) external;
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
    // Events
    event Transfer(address from, address to, uint256 tokenId);
    event Approval(address owner, address approved, uint256 tokenId);
    // Optional
    // function name() public view returns (string name);
    // function symbol() public view returns (string symbol);
    // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);
    // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);
    // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)
    function supportsInterface(bytes4 _interfaceID) external view returns (bool);
}

ERC20하고 유사한데 몇 가지 함수가 추가된 것을 볼 수 있다. 참고로 ERC20 토큰은 여기 EIP-20에서 인터페이스가 표준화 되어있다. 이하는 ERC20 인터페이스이다.

function balanceOf(address _owner) public view returns (uint256 balance);
function transfer(address _to, uint256 _value) public returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
function approve(address _spender, uint256 _value) public returns (bool success);
function allowance(address _owner, address _spender) public view returns (uint256 remaining);

event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);

먼저 ERC20에 대해서 간단히 보면

  1. balanceOf : _owner 지갑주소에 대해 잔고를 보여준다.
  2. transfer : _to에게 _value만큼 보낸다. 그리고 transfer함수내에서 꼭 Transfer event를 call해야한다. (대부분의 지갑, 서비스 들이 이러한 이벤트 callback을 기다려 그 값을 보여준다. transfer가 제대로 보내졌는지 알기위해서)
  3. transferFrom : transfer와 동일한데 _from이 추가된 것이다. 누군가 대신해서 transfer를 위해서 마련함.
  4. approve : _spender가 저 함수를 call한 지갑이 보유하고 있는 토큰을 _value만큼 빼갈 수 있도록 approve하기 위한 함수임. 사용처는 예를 들어 어떠한 서비스 컨트랙트(예, 게임)에게 내가 가지고 있는 토큰 혹은 그 서비스 컨트랙트가 발급한 토큰을 일정부분 알아서 실행해서 가져갈 수 있게(수수료처럼) 하기 위한 것임 , 성공적으로 함수가 실행되면 Approval event가 call 된다.
  5. allowance : 어느 _spender가 _owner가 보유하고 있는 토큰을 얼마만큼 아직 approve된 토큰이 있는지 확인하는 용도

여기에 optional한 것이 name, symbol, decimals이 있다. 꼭 필요한 건 아니다. (그런데 저것만 넣으면 알아서 ERC20에 규격의 토큰이 발행이 되는 컨트랙트 예제들이 널려있다..하지만..ERC20은 저런 인터페이스만 맞추면 되고 결국 알아서 내용은 채우면 된다.

이제 정말 본론이 ERC721으로 넘어가도록 하자. (크립토 키티의 ERC721은 draft임!!)

키티 컨트랙이 나왔을 때가 작년인데 올해 1월에 규격이 정해진 듯하다. 여기 EIP-721 참조

인터페이스를 보면 (자세한 설명은 다음 컨트랙트인 KittyOwnership에서 설명하기로함) event는 ApprovalForAll이 추가가 되었고, 함수(인터페이스)는
safeTransferFrom, setApprovalForAll, getApproved, isApprovedForAll 이렇게 4개가 추가가 되었다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:
https://stackoverflow.com/questions/47177627/warning-no-visibility-specified-defaulting-to-public