크립토 키티 소스 코드 분석 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에 대해서 간단히 보면
여기에 optional한 것이 name, symbol, decimals이 있다. 꼭 필요한 건 아니다. (그런데 저것만 넣으면 알아서 ERC20에 규격의 토큰이 발행이 되는 컨트랙트 예제들이 널려있다..하지만..ERC20은 저런 인터페이스만 맞추면 되고 결국 알아서 내용은 채우면 된다.
이제 정말 본론이 ERC721으로 넘어가도록 하자. (크립토 키티의 ERC721은 draft임!!)
키티 컨트랙이 나왔을 때가 작년인데 올해 1월에 규격이 정해진 듯하다. 여기 EIP-721 참조
인터페이스를 보면 (자세한 설명은 다음 컨트랙트인 KittyOwnership에서 설명하기로함) event는 ApprovalForAll이 추가가 되었고, 함수(인터페이스)는
safeTransferFrom, setApprovalForAll, getApproved, isApprovedForAll 이렇게 4개가 추가가 되었다.