プログラミングのゴミ箱

日々の学習の中で知らなかったことについて、調べたことを解説します。

Crypto Zombieで始めるSolidity入門⑤

この記事は前回の続きです。
前回の記事はこちら↓
chanichiwasshoi.hateblo.jp


このシリーズではCrypto ZombieというSolidityの学習が出来るサイト(しかも無料で)の内容を自分なりにまとめます。
入門編はこれ一つで全部学べるみたいなので、みなさんもぜひやってみてください!
cryptozombies.io

トークンとは

 トークンとは、いくつかの共通ルールに従ったスマートコントラクトのことです。全てのトークンは同じ名前の同じ関数を共有しているため、同じ方法で相互に作用することが可能になっています。

トークンの種類

 トークンにはERC20トークンやERC721トークンのようにいくつかの種類があります。それぞれのトークンに特徴があり、例えばERC20トークンは通貨のような働きをし、ERC721トークンはNFTのような収集物に適しています。

コントラクトをトークンにする

 自分のスマートコントラクトをトークンにするには、ただトークンを定義したコントラクトを継承すれば良い。

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 Hoge is ERC721 {
  function balanceOf(address _owner) public view returns (uint256 _balance) {}
  function ownerOf(uint256 _tokenId) public view returns (address _owner) {}
...
}

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;
}

 ERC721トークンをよく見てみると、トークンを転送する方法が2つあることが分かる。
 一つが、「transfer」を使って単純に送る方法。
 もう一つが、「approve」によって受取先アドレスにトークンの受け取りを許可し、「takeOwnership」で実際に受け取り者が受け取るという2つの段階を踏む方法。
 2つ目の方法を使うことで正しく送り先アドレスにトークンを送ることが出来る(送り先を間違えるなどのミスが減る)。

多重継承

solidityは多重継承に対応している。

contract GreatestContract is Hoge, Fuga {}

SafeMath

 一般的なプログラミング言語では、変数の値がオーバーフローしてしまうと、数値が0に戻ってしまう。(例: ffff + 0001 = 0000)
 これは、Solidityでも例外ではなく実際にお金の動くことの多いブロックチェーンでは重大な問題に発展する可能性がある。
 そういったオーバーフロー、アンダーフローを防ぐためにあるのがSafeMathというライブラリだ。SafeMathでは、オーバーフローが起きたときにエラーを起こして処理を止めてくれる。

ライブラリの使い方

ライブラリを使うには以下のようにする。

import "safemath.sol";
using SafeMath for uint256;

uint256 a = 5;
uint256 b = a.add(3); // 5 + 3 = 8
uint256 c = a.sub(3); // 5 - 3 =2
uint256 d = a.mul(2); // 5 * 2 =10
uint256 e = a.div(5); // 5 / 2 = 1