CryptoZombies レッスン5
このレッスンでは
ERC721
いろんな人とのゾンビの
トレードを可能にする
ちなみに私のトークンは
ERC20です
チャプター1
ERC20トークン
通貨のような働きをするトークン
ERC721トークン
トークン1つ1つに特徴があり、
相互交換が不可能である
チャプター2
多重継承
「、」付けたら
多重に継承も可能
チャプター3
balanceOf関数
addressを受け取り、
そのaddressのトークン量を返す
ownerOf
トークンIDを受け取り、
そのトークン所有者のaddressを
返す
チャプター4
同じ関数名を作ってしまうと
良くないよ
チャプター5
注意してほしいが、ERC721規格は2つの異なるトークン移転法を持つ:
function transfer(address _to, uint256 _tokenId) public; function approve(address _to, uint256 _tokenId) public; function takeOwnership(uint256 _tokenId) public;
一番目の方法はトークン所有者が送り先の
address
、そして送りたいトークンの_tokenId
を送ってtransfer
関数を呼び出すものだ。
二番目の方法は、トークン所有者がまず
approve
関数を呼び出し、一番目と同じ情報を関数に送る。すると、コントラクトが誰がトークン受け取りを許可されたのかを、通常はmapping (uint256 => address)
にて記録する。さらに誰かがtakeOwnership
を呼び出すと、コントラクトはそのmsg.sender
がトークンを受け取ることを所有者から承認されているかをチェックし、承認済みの場合は彼にトークンを移転する。
transfer
とtakeOwnership
のどちらも同じ転送ロジックを含むことに気付くことになるだろうが、順序が逆になる。(ひとつはトークンの送り手が関数を呼び出すケース、もうひとつはトークンの受け手が関数を呼び出すケース)。
うーん、
とりあえずいろんな
移転方があるらしい
event忘れてるなー
logに表示してくれるやつかー
チャプター6
transfer関数が頑張ってます
チャプター7
approve関数が頑張り始める
mapping
チャプター8
takeOwnership関数が
頑張り始める
チャプター9
スマートコントラクトを
書くときに気をつけなければ
いけないこと
・オーバーフロー
・アンダーフロー
オーバーフロー
言葉の通りオーバーする
uint8は2の8乗で256の数字しか
(uint8: 0~255の数字が入る)
格納することが出来ない
uint8 i = 255;
i++;
これだと次の値が i =256
ではなく i = 0 となる
これがオーバーフロー
アンダーフロー
uint8 i = 0;
i--;
の時に、i = -1 になるのではなく
i = 255 となってしまう
これがアンダーフロー
チャプター10
SafeMathライブラリと
いうものがあるらしい
using SafeMath for uint;
// now we can use these methods on any uint
uint test = 2;
test = test.mul(3); // test now equals 6
test = test.add(5); // test now equals 11
詳しいことは
わかりませんが
とりあえず
SafeMathライブラリの
add関数、sub関数
mul関数、div関数
の四則演算をするための関数を
使うと
オーバーフロー、
アンダーフロー対策になるので
便利だよみたいな
チャプター11
safemath.solの中の
ライブラリに
SafeMath16と
SafeMath32もある
それぞれ
SafeMath16 = uint16
SafeMath32 = uint32
に対応
チャプター12
今まで
i ++;
と表現していたところを
i = i.add(1);
に変える
チャプター13
コメントの仕方
方法1
// コメントだよ
方法2
/*
コメントだよ
コメントだよ
コメントだよ
*/
solidityではnatspecという
フォーマット(表現方法)が
良く用いられるとのこと
使うメリットは
このソースコードは何を
意味しているかを
他の人に理解しやすくして
いること
/// @title A contract for basic math operations /// @author H4XF13LD MORRIS 💯💯😎💯💯 /// @notice For now, this contract just adds a multiply function contract Math { /// @notice Multiplies 2 numbers together /// @param x the first uint. /// @param y the second uint. /// @return z the product of (x * y) /// @dev This function does not currently check for overflows function multiply(uint x, uint y) returns (uint z) {
// This is just a normal comment,
// and won't get picked up by natspec z = x * y; } }
@で始まっているのがnatspec
@title: タイトル
@author: 作った人
@notice: このコントラクト、
関数が何をするのか
@param: 変数
@return: 返す値
@dev: 各関数の説明?
チャプター14
レッスンも終盤
おわりに
倉本が帰ってきました
【AbemaTIMES】横浜DeNAラミレス監督、連敗ストップへ1軍復帰のロペスを5番一塁で即スタメン「戻ってきてくれてうれしい」倉本も1軍昇格 https://t.co/fDc3nx92V5 #baystars
— ベイスターズ情報 (@bay_bot) 2018年6月29日