Solidityを書き始めて間もない頃は、"Function state mutability can be restricted to pure"というエラーによく出くわすと思います。
本記事では、その解決方法について解説します。
エラーの意味
まず、このエラーの意味ですが、"Function state mutability can be restricted to pure"とあるように、「関数状態の変更可能性を純粋(pure)に制限できます」ということです。
そう言われても意味不明だと思うので、実際のコードを元に説明します。
上図は今回のエラーが発生しているコードです。
関数内の処理に着目すると、状態変数(関数外の変数)を使用していないことが見て取れます。
つまり、この関数は「状態変数(関数外の変数)を読取/変更をしない = 純粋関数」といえます。
純粋関数では、viewではなくpureで修飾する必要があり、エラーが発生していたという訳です。
エラーの解決方法
解決方法は簡単で、純粋関数の場合にはviewではなくpureで修飾します。
修正後のコードは以下になります。
見て分かるように、変更箇所は、viewをpureに書き換えただけとなります。
補足説明
純粋関数について念のため補足しておきます。
先述のように「状態変数(関数外の変数)を読取/変更をしない関数」を純粋関数と呼びます。
上図はすべて純粋関数のため、pureで修飾していますが、当然ながらエラーは発生していません。
一方、先ほどの関数について、変数を関数外に出す(状態変数にする)と、エラーが発生します。
「関数内で状態変数(関数外の変数)を読取/変更している = 純粋関数ではない」ためですね。
最初の頃はpureかviewのどっちを使うんだっけな、と混乱すると思います。純粋関数(状態変数を使っていない)はpure、非純粋関数(状態変数を使っている)場合はviewと覚えておきましょう。関数内で状態変数を読込しているだけでもviewを使う必要があるので注意して下さい。