Ethereum(50) - オーバーフロー⑤(2回目の改善編)

前回は、在庫追加数としてuint8の範囲を超える数値を設定してしまったため、とオーバーフローが発生し257が1に変換されてしまいました。

今回はこの問題を解消していきます。

ソースコード(改善2)

改善策としまして、在庫数を追加する関数(AddStock関数)の引数を、データ型uint8からuintに変更してみます。

uint8の範囲は0~255ですが、uintの範囲は0~2の256乗までとかなりの大きな数字となります。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
pragma solidity ^0.4.11;
contract MarketPlaceOverflow {
address public owner;
uint public stockQuantity; // 在庫数 改善2 uint8 ⇒ uint

modifier onlyOwner() {
require(msg.sender == owner);
_;
}

/// 追加在庫数を表示するイベント
event AddStock(uint _addedQuantity); // 改善2 uint8 ⇒ uint

/// コンストラクタ
function MarketPlaceOverflow() {
owner = msg.sender;
stockQuantity = 100;
}

/// 在庫の追加処理
function addStock(uint _addedQuantity) public onlyOwner { // 改善2 uint8 ⇒ uint
// オーバーフローチェック
require(stockQuantity + _addedQuantity > stockQuantity); // 改善1

AddStock(_addedQuantity);
stockQuantity += _addedQuantity;
}
}

追加在庫数(_addedQuantity)の修正箇所は12行目と21行目で、uint8をuintに変更しています。

また追加在庫数と合わせて、現在の在庫数(stockQuantity)のデータ型もuintに変更しておきます。(4行目)


次回はこの改善でオーバーフローが解消しているかどうかの確認してみます。