Skip to content

Instantly share code, notes, and snippets.

@hm0429
Created April 26, 2018 03:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hm0429/84e9910dd3d7c071e2726d6dc778141b to your computer and use it in GitHub Desktop.
Save hm0429/84e9910dd3d7c071e2726d6dc778141b to your computer and use it in GitHub Desktop.
batchOverflow with comments in Japanese
function batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool) {
uint cnt = _receivers.length;
// _value に大きな値を渡せば、オーバーフローさせることができる
// ここで SafeMath を使っていないのが問題(桁溢れの対処ができていない)
uint256 amount = uint256(cnt) * _value;
// cnt が 1以上 かつ 20以下 であれば通る
require(cnt > 0 && cnt <= 20);
// _value が 0 以上 かつ amount がこのトランザクションを実行した address の token 残高未満であれば通る
// amount の計算でバッファーオーバーフローがおきていると、
// amountを非常に小さい値にできてしまうので、_ value の値が token の残高以上でもここが素通りされてしまう。
require(_value > 0 && balances[msg.sender] >= amount);
// このトランザクションを実行した address の token 残高から、amount ぶんを差し引く
balances[msg.sender] = balances[msg.sender].sub(amount);
// 以下 _value の値を他の address(es) に送るコード
// 上の require を通ってしまえば、実際に所有していない量の token でも、
// _value に設定されたものが _receivers のアドレス残高に追加されてしまう。
for (uint i = 0; i < cnt; i++) {
balances[_receivers[i]] = balances[_receivers[i]].add(_value);
Transfer(msg.sender, _receivers[i], _value);
}
return true;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment