Ethereumはstorageにデータを登録する際に、ストレージ使用料がかかります。実はこの使用料はどうやら一定では無いらしく、データをセットする同じfunctionを実行しているのに最初だけ高かったりします。
すごく気になったので実際にどういう時にいくらのgas代がかかるのか調べてみました。
SSTOREのgas代を計算している部分のソース
go-ethereumでSSTORE(ストレージにデータを格納するためのopcode)のgas代を計算している箇所はここです。
github.com
SSTOREのガス代
以下の3つの場合でそれぞれgas代が違います。
- zero -> non zero: (NEW VALUE) cost 20000gas
- non zero -> zero: (DELETE) refund 15000gas、 cost 5000gas
- non zero -> non zero: (CHANge) cost 5000gas
初めて値を格納する時は20000gas消費されて、値を削除(0を入れる)場合は15000gasが戻ってきて、領域をクリアするコストとして5000gas取られるので実質10000gasが戻ってきます。最後に値を変更する場合は5000gas消費となります。
まとめ
初めて値を入れる時は高くて2回目以降は最初より安くて、ずっと一定のgas代になる。ぐらいのふんわりした認識だったので正確に把握できてすっきりしました。
値を消すと、初めて値を格納するgas代の1/2が帰ってくるので、新しく値を入れるたびに何か他の値を2つ消せば実質gas代0にできますね!!!(なんたる矛盾)
追記(2018/02/19
refundで割引されるgas代は最大50%までです!詳しくは以下の記事にまとめました。
Transactionの消費gasは最大50%offまで! - アルゴリズムとかオーダーとか