【Solidity】オーバーフローの忘備録

【Solidity】オーバーフローについて

おはようございます。おーみんです。

今日の夕方は仮想通貨「イーサリアム」の開発言語「Solidity」の勉強をしていました。参考文献は以下の本です。

堅牢なスマートコントラクト開発のためのブロックチェーン[技術]入門

堅牢なスマートコントラクト開発のためのブロックチェーン[技術]入門

 

『ブロックチェーン[技術]入門』 田篭照博

 

オーバーフローとは?

オーバーフローとは、実際に処理できる数よりも大きな数を入れた際にPCなどが「こんなの処理できないよ~」と怒っちゃう事象のことです。まあ、カバンに色々詰め込んで、もうこれ以上入らずに限界を超えたような状況をイメージしてもらえたら良いかと思います。

 

Solidityで数を入力(加える)するようなプログラムを書いてみましょう。例えば、僕の家で八百屋さんを営業しているとでもします。

りんごの在庫を増やしてみましょう(元々の在庫は100個とします)

 

↓以下プログラム↓

 

function addApple(uint8 _addedQuantity) public onlyOwner{

   AddApple(_addedQuantity);

   stockQuantity += _addedQuantity;

}

 

functionというのは、「これからこんな関数を定義していくよ~」というときに使うものです。ここではaddAppleという関数を定義したわけですな~。

onlyOwnerというのは、このプログラムのオーナーのみしか、この関数を利用できないよ~ということを表しています。この場合のオーナーはもちろん僕ですね。

{ }内も少し見ていきます。

_addedQuantityというのは、僕がいくつりんごを在庫に加えたかを表す引数と思ってください。例えばここに10個在庫を追加する場合はプログラムを実行する際に10と入力できるようになります。

そして、stockQuantity += _addedQuantityでは、既にある在庫に今回設定した追加のりんごを足した合計の在庫を表しています。

 

さあ、ということで基本的な文法はこんな感じでプログラムを実行した様子についてお話していきましょう。

オーバーフローがどんな時に起こるのか?

例えば在庫に新しくりんごを156個追加するとします。

普通は元々あった在庫(100個)と新しいりんご(156個)を足して256個となるはずです。

画面キャプチャがなくて申し訳ないのですが、上記のプログラムでりんごを156個追加すると実は256個にならないのです。なぜか?

これは_addedQuantityをuint8で定義しているからでした。uint8とは8ビットで表現できる符号なし整数のことです。

PCは2進数で数を受け取るため、8ビットだと最高でも11111111。つまり10進数に直すと255なので、256は受け取ることができないよ~となっちゃうんですなぁ。

この対策は簡単でuint8で引数を定義するのではなく、uintで定義しちゃえばいいのです。uintにすると256ビットまでの数を定義できるので。

 

直接的にSolidityに関係はない感じでしたが、うっかりこういうところでミスしてしまうと大変になっちゃうので注意が必要です。

スマートコントラクト完成したよ~といって、実際に八百屋などに導入した際に在庫数がメチャクチャになってるよ?なんてことが起きたらやばいですから(-_-;)

 

また色々勉強していきたいと思います。

では!

 

「読者になる」ボタンも押していただけると嬉しいです。