初心者文系主婦がブロックチェーンを学ぶブログ

IT革命のビッグウェーブに乗り遅れた主婦が、ブロックチェーン革命の波にのるべく、ブロックチェーン技術を学ぶブログです。

【CryptZombies】レッスン5チャプター9:オーバーフローとアンダーフロー

オーバーフロー&アンダーフロー とは?

例として、uint8は8ビットのみを持ちますが、つまりここに格納できる最大数値はバイナリ(2進数)の11111111ということです。
(またはデシマル(10進数)だと 2^8 - 1 = 255となる※)。
※0を含むため、「-1」をしています。(256個の数字がある。)
次のコードを見てください。最後はnumberはどうなるでしょうか?

uint8 number = 255;
number++;

この場合、オーバーフローの原因となってしまいます。つまりnumberを増やしても、0になるという通常の感覚に反することが起きます。
(もしバイナリの11111111に1を足すと、00000000に戻ってしまいます。時計が23:59から00:00になってしまうような感じ)。

アンダーフローも同様に、0と等しいuint8から1を引くと、255となります(uintは符号なしであるので、マイナスとなれない)。

SafeMathの使用

これらの問題をデフォルトで回避するために、OpenZeppelinはSafeMathという ライブラリ を作成しています。

ライブラリとは

library とは、Solidityにおける特別なタイプのコントラクトです。便利なことの一つとして、ネイティブデータ型への関数アタッチができます。
例えば、SafeMathライブラリで、using SafeMath for uint256のシンタックス(構文)を使うとします。
SafeMathライブラリはadd、sub、mulさらにdivの4つの関数を持ちます。(足す、引く、掛ける、割るの4つ。)そして以下のように、uint256からこれらの関数にアクセス可能です:

using SafeMath for uint256;

uint256 a = 5;
uint256 b = a.add(3); // 5 + 3 = 8
uint256 c = a.mul(2); // 5 * 2 = 10


テストの実行

まずSafeMathを使うことを我らがコントラクトに伝えよう。非常に基礎的なコントラクトZombieFactoryの中でこれを行う。こうすることで、それを継承するどのサブコントラクト内でもライブラリを使えるようになるからな。

①safemath.solをzombiefactory.solへインポートせよ。

import "./safemath.sol";

②using SafeMath for uint256;という宣言を加えよ。

using SafeMath for uint256;


お疲れさまでした!


<参考>
CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network