SafeMath.solを読んでみました

SafeMath概要

SafeMathは、コントラクト内で四則演算するとき、値がオーバーフロー、アンダーフローすることに対応してくれる四則演算ライブラリです。とはいってもコード量はとても少ないです^^;

とはいえ、2018年4月22日に悪用されたバッチオーバーフローのようなバグにもつながりますので、必ず演算する際には使用していきたいです。

コントラクトのフレームワーク集のopenzeppelin-solidityで簡単にインストールできます。

truffleプロジェクトでopenzeppelin-solidityを追加した場合、プロジェクトフォルダ内の

node_modules -> openzeppelin-solidity -> contracts -> math

の中に「SafeMath.sol」としてインストールされます。

pragma solidity ^0.4.21;

/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    assert(c / a == b);
    return c;
  }

/**
* @dev Integer division of two numbers, truncating the quotient.
*/
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

/**
* @dev Adds two numbers, throws on overflow.
*/
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

割り算のところ、最終的にはsolidityが自動で0の除算のエラーを出してくれるってところなどがいろいろ試行錯誤した感があってよいですね 笑

結局割り算は特にエラー処理をしているわけではないんですね。

ほかの演算は、それぞれassert関数で処理を止めるということをしています。

このSafeMathを使用すると、演算により、値がオーバーフローしたときなど、適切に処理を止めてくれますね。是非使うしかないですね。

SafeMathを使う

自分の作成するコントラクト内で使うには、

using SafeMath for uint256;

と使うよ宣言をしなくてはいけません。

aにbを加算するとき

a = a.add(b);

とします。

Solidityも始めたばかりで何も知らなく、引数2つあるのに引数1つでいいのみたいなことで1時間ほどつまづきました、なるほど、こういう書き方をするんですね。

20180611追記

CryptoZombiesやってます。Libraryという性質のものは、usingのforの後の型を自動的に第一引数にする、という動作をするみたいです。CryptoZombiesはsolidityのプログラミング習得にオススメです。SafeMathに関しては、レッスン5のチャプター10で触れていますね。

英語がわかる方は↓ethreumdev.ioも読んでみてくださいね^^

SafeMath to protect from overflows

◆オススメの書籍

ブロックチェーンの概要、スマートコントラクトの概要から、ビットコイン、イーサリアムの違い、イーサリアムのコントラクトを実装するための開発環境構築など、ブロックチェーンアプリケーションの入門にはもってこいの書籍です。