オーバーフロー、add-sub-mul-div、assert、SafeMath実装について書いております!SafeMathに関してはもう少し実装してみる必要があるので、次の記事でも引き続き書く事になりますので、一緒に学んでいただければ幸いです。
それでは午前第2部スタートしますか。
CryptoZombies | イーサリアムでのゲーム開発を学ぶ
それでは開演しまっしょい!!
ふむふむ、、これで完璧だと思うなよ!と釘をさしてくれてますね!組み込まれていない部分に関してはいろんな例を見て、実際に実装していかないといけないよと、、OpenZeppelinのERC721コントラクトにはその実装例があるとの事で見ておくとよいのでしょう。
オーバーフローに関しては過去記事👉レッスン4:BattleOfZombie④でも説明していますが、上記でもわかりやすく説明してくれてますね!時計でいうところの、23:59の次の時間は何時何分?って聞くと0に戻ることがオーバーフローなので、リセットしてしまう事により重大なエラーが出る事をさしてますね。
この数式は実行するとuint256の枠からはみ出してしまうため、オーバーフローしてしまう。
だいたい書いてましたねwバイナリとは2進数の事ですね。0と1の数字しかない、あれですよw
SafeMathとな、、、「安全な数学」という意味になりますなw
ちなみにaddは足し算、subは引き算(subtraction)、mulは掛け算(multiply)、divは割り算(division)ですな。
それではテストだ!!
今回も先に手を打ってゾンビさんがやってくれちゃってます。。ありがたや、、
1では、インポートせよ、との事なので、、
import “./safemath.sol”;
となります。
2では、宣言を加えよ、との事なので、コントラクトの宣言の中で、
using SafeMath for uint256;
と宣言するだけですねw
以上!
そのまま次いきます!!
まだ続きがありますが省略しますね。
続きにはadd(足し算)とsub(引き算)の関数の宣言の説明などが入っています。
なるほど、、using SafeMath for uint;と宣言する事で、これらのライブラリのメゾッドを追加できるようになったって事ですね。
上記の例では、testには2が代入されていて、mulは掛け算なので2*3の結果がtestに代入されるので6が入ると。6が入ったtestにadd(足し算)として5を加算するので、結果として11が新しく代入される、という事ですね。
assertステートメントを含んでいるとあるが、、assertとは「言い切る・言い放つ」という意味だ。
requireと同じような使い方で同じようなものだが、falseの場合はエラーを投げる。とある。
しかもassertの場合はrequireと違い、ガスの返却は無いとの事。
であればユーザー的にもrequireを使って判断してもらいたいところだが、重大な問題が起こった場合に一般的に使用されるとの事なので、逆をいうとエラーが出た瞬間、ありえない事態が発生した事になるという事ですね。エラーの出る理由のメインとしてはオーバーフローですけどね。
なるほどね〜
このSafeMathを使う事で、重大なエラーが起き得ないようにできるのであれば、取り入れない理由はないですな!!ってか使ってる箇所かなりあるぞw
という事で早速テストだ!!
コーディングスペースはこうなっているので、、
1では、++をSafeMathメソッド(add(1))で置き換えよなので、、
ownerZombieCount[_to] = ownerZombieCount[_to].add(1);
となります。
2では、–をSafeMathメソッド(sub(1))で置き換えよ。
なので、、
ownerZombieCount[_from] = ownerZombieCount[_from].sub(1);
と変更する形になりますな!
ふむふむ、若干複雑にはなってしまった感じはするが、リスクを回避できるのであれば全然いいですよね!
今後はデフォルト仕様となる可能性もあるが、今はまだなので、自分でやるべきことは自分でしっかり考え対策立てようね、ということすな!
という事で、今回はこれにて終了します!
昼からもかけそうなので、今日でレッスン5も完了しそうですな!!
頑張って理解していきましょうね!!
CryptoZombies | イーサリアムでのゲーム開発を学ぶ
それではまた後ほど!!