プログラム上達したいな blog

プログラム書けるようになりたいアウトプット用

CryptoZombies レッスン5

cryptozombies.io

 

このレッスンでは

ERC721

いろんな人とのゾンビの

トレードを可能にする

f:id:gjjjjcdssvgg:20180629153036p:plain

ちなみに私のトークンは

ERC20です

 

 

チャプター1

ERC20トーク

通貨のような働きをするトーク

 

ERC721トーク

トークン1つ1つに特徴があり、

相互交換が不可能である

 

 

チャプター2

多重継承

contract ZombieOwnership is ZombieAttack, ERC721 {

}

「、」付けたら

多重に継承も可能

 

 

チャプター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;
  1. 一番目の方法はトークン所有者が送り先のaddress、そして送りたいトークンの_tokenIdを送ってtransfer関数を呼び出すものだ。

     

  2. 二番目の方法は、トークン所有者がまずapprove関数を呼び出し、一番目と同じ情報を関数に送る。すると、コントラクトが誰がトークン受け取りを許可されたのかを、通常はmapping (uint256 => address)にて記録する。さらに誰かがtakeOwnershipを呼び出すと、コントラクトはそのmsg.senderトークンを受け取ることを所有者から承認されているかをチェックし、承認済みの場合は彼にトークンを移転する。

transfertakeOwnershipのどちらも同じ転送ロジックを含むことに気付くことになるだろうが、順序が逆になる。(ひとつはトークンの送り手が関数を呼び出すケース、もうひとつはトークンの受け手が関数を呼び出すケース)。

うーん、

とりあえずいろんな

移転方があるらしい

 

event忘れてるなー

qiita.com

  • イベントは、コントラクト上で発生したことをDAPPなどのクライアントに通知することができる
  • イベントが呼び出されると、実際渡された関数のパラメータをトランザクションのログに保持し、コントラクトのアドレスと関連を付けられる。
    • トランザクションがブロックに保持されるので、イベントも同じく、ブロックが存在している限り、イベントのログもずっと存在している
    • ただ、ログとイベントは、コントラクトから(コントラクトの作成者でも)直接にアクセスできない

logに表示してくれるやつかー

 

 

チャプター6

transfer関数が頑張ってます

 

 

チャプター7

approve関数が頑張り始める

mapping

qiita.com

 

 

チャプター8

takeOwnership関数が

頑張り始める

 

 

チャプター9

スマートコントラクトを

書くときに気をつけなければ

いけないこと

 

・オーバーフロー

・アンダーフロー

 

オーバーフロー

言葉の通りオーバーする

uint8は2の8乗で256の数字しか

(uint8: 0~255の数字が入る)

格納することが出来ない

uint8 i = 255;

i++;

これだと次の値が i =256

ではなく i = 0 となる

これがオーバーフロー

 

askjapan.me

 

アンダーフロー

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

レッスンも終盤

f:id:gjjjjcdssvgg:20180629182205p:plain

 

 

おわりに

倉本が帰ってきました