[Solidity] 크립토좀비 - 챕터5-1


오늘은 쪼개는 것이 불가능하고 고유한 토큰(NFT)의 표준인 ERC721에 대해서 알아봅니다.


1. 이더리움의 토큰(ERC-20)
  • 이더리움에서 토큰은 기본적으로 몇몇 공통 규약을 따르는 스마트 컨트랙트입니다.
  • 즉 다른 모든 토큰 컨트랙트가 사용하는 표준 함수 집합을 구현하는 것입니다.
  • 예를 들면 transfer(address _to, uint256 _value)나 balanceOf(address _owner) 같은 함수같은 것들이 모든 ERC-20에 정의되어 있습니다.
  • 내부적으로 스마트 컨트랙트는 보통 mapping(address => uint256) balances와 같은 매핑을 가지고 있습니다.(주소마다 잔액기록)
  • 즉 토큰은 하나의 컨트랙트입니다. 그 안에서 누가 얼마나 많은 토큰을 가지고 있는지 기록하고, 몇몇 함수를 가지고 사용자들이 그들의 토큰을 다른 주소로 전송할 수 있게 해주는 표준 컨트랙트인 것이지요.
  • 그렇기 때문에 ERC-20으로 생성되는 토큰의 경우 다른 어떤 ERC20 토큰과도 상호작용이 가능합니다. 거래소에서도 마찬가지이지요.
2. 이더리움의 토큰(ERC-721)
  • ERC20 토큰은 화폐처럼 사용되는 토큰으로는 정말 적절합니다.
  • 하지만 게임에서 아이템이나 캐릭터를 표현하기에는 부족한 부분이 있습니다.
  • 이유 중 첫째로, ERC-721은 화폐처럼 분할을 할 수가 없습니다.
  • ERC-20은 0.237ETH를 보낼 수 있지만, 0.237개의 ERC-721을 보내는 것은 불가능합니다.
  • ERC-721은 유일하기 때문에 모든 토큰들을 구분할 수가 있습니다.
  • 각각의 토큰은 유일한 ID도 가지고 있습니다.
  • 참고: ERC721 표준은 현재 초안인 상태이고, 아직 공식으로 채택된 구현 버전이 없습니다. 여기서는 OpenZeppelin 라이브러리에서 쓰이는 현재 버전을 사용할 것이지만, 공식 릴리즈 이전에 언젠가 바뀔 가능성도 있습니다. 이것이 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;
}
3. 다중 상속
  • Solidity는 다중상속 기능을 지원합니다.
import "./erc721.sol";

contract ZombieOwnership is ZombieAttack, ERC721 {

}
4. balanceOf, ownerOf
  • balanceOf : address를 받아, 해당 address가 토큰을 얼마나 가지고 있는지 반환
   function balanceOf(address _owner) public view returns (uint256 _balance);
  • ownerOf : 토큰 ID를 받아, 이를 소유하고 있는 사람의 address를 반환
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
5. ERC-721 전송로직(transfer)
  • 토큰 전송에는 2가지 방법이 있습니다.
  • 첫 번째 방법은 토큰의 소유자가 전송 상대의 address, 전송하고자 하는 tokenId와 함께 transfer 함수로 전송하는 것입니다.(토큰을 보내는 사람이 함수를 호출)
  • 두 번째 방법은 토큰의 소유자가 먼저 위에서 본 정보들을 가지고 approve를 호출하는 것입니다. 그리고서 컨트랙트에 누가 해당 토큰을 가질 수 있도록 허가를 받았는지 저장합니다. 보통 mapping (uint256 => address)를 써서 사용합니다. 이후 누군가 takeOwnership을 호출하면, 해당 컨트랙트는 이 msg.sender가 소유자로부터 토큰을 받을 수 있게 허가를 받았는지 확인하고, 허가를 받았다면 해당 토큰을 그에게 전송합니다.(토큰을 받는 사람이 호출)
function transfer(address _to, uint256 _tokenId) public;
function approve(address _to, uint256 _tokenId) public;
function takeOwnership(uint256 _tokenId) public;
function _transfer(address _from, address _to, uint256 _tokenId) private {
    ownerZombieCount[_to]++;
    ownerZombieCount[_from]--;
    zombieToOwner[_tokenId] = _to;
    Transfer(_from, _to, _tokenId);
  }

Comments 9


[US$140.00](▼54%)샤오미 드리미 V10 무선 청소기 / 유럽버전! / 6개월무료A/S / 무료배송/

WWW.QOO10.COM
21.08.2020 00:13
0

@happyberrysboy transfered 23 KRWP to @krwp.burn. voting percent : 88.12%, voting power : 80.08%, steem power : 1887785.16, STU KRW : 1200.
@happyberrysboy staking status : 7450 KRWP
@happyberrysboy limit for KRWP voting service : 22.35 KRWP (rate : 0.003)
What you sent : 23 KRWP
Refund balance : 0.649 KRWP [46165682 - e224f771ee39bd4a5b356560955f1093958f84a2]

21.08.2020 00:28
0

내용은 패쓰~ 즐거운 불금 보내세요^^

21.08.2020 00:40
0

즐거운 불금 of 불금 되십시오!!! ㅎㅎㅎ

21.08.2020 00:53
0

사장님!!

이 형 일안하는데요!

ㅋㅋ

21.08.2020 00:43
0

어제 다 쓴거거든요!! ㅋㅋㅋㅋ

21.08.2020 00:53
0

다중상속 된다는게 무슨 말일까요...

21.08.2020 01:21
0

컨트랙트 여러개를 상속받을 수 있다는 것이지요.
상속해준 부모클래스 여러개(다중)의 특징을 다 가지게 될테고요.

contract ZombieOwnership is ZombieAttack, ERC721 {

}

ZombieOwnership 컨트랙트는 , ZombieAttack, ERC721 두 부모로부터 모든 특징을 가지게 되는 걸 말한것입니다.

21.08.2020 03:28
0

^^

22.08.2020 07:20
0