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