Lesson 5 capture 10 SafeMathパート2
SafeMathライブラリのコード
openzeppelin-solidity/contracts/math/SafeMath.sol
* @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.
*/
c = a + b;
assert(c >= a);
return c;
}
}
ライブラリ(library)はusingというキーワードを使えるようにするが、これで自動的にライブラリの全メソッドを別のデータ型に追加することができる。
// 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
mulとadd関数はそれぞれ2つの引数を必要とするが、using SafeMath for uintを宣言する際、関数上で呼び出すuint(test)は自動的に一つ目の引数として渡されることに気をつけたい。
コードの意味
オーバーフローチェック
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
assertはrequireと同じようなものだが、偽の場合はエラーを投げる。
a+bでuint256のとりえる値2^256をオーバーフローした場合は、cは0~(オーバーフロー)の値となり(c >= a)が成り立たずassertがエラーとする。
例
myUint++;をmyUint = myUint.add(1);に変更する。
prev
-
クリプトゾンビLesson 5 capture 9 オーバーフロー対策
Lesson 5 capture 9 オーバーフロー対策 コントラクトのセキュリティ強化 オーバーフローとアンダーフロー オーバーフロー 変数のとりうる値を超えた状態。 uint8の値は、最大2^8 ...
next
-
クリプトゾンビLesson 5 capture 11 12 SafeMathパート3,4
Lesson 5 capture 1 SafeMathパート3 winCountとlossCountはuint16で、levelはuint32の問題。 SafeMath32ライブラリの使用 using ...