【Solidity】"Function state mutability can be restricted to pure"エラーの解決方法

Solidityを書き始めて間もない頃は、"Function state mutability can be restricted to pure"というエラーによく出くわすと思います。

本記事では、その解決方法について解説します。

エラーの意味

まず、このエラーの意味ですが、"Function state mutability can be restricted to pure"とあるように、「関数状態の変更可能性を純粋(pure)に制限できます」ということです。

そう言われても意味不明だと思うので、実際のコードを元に説明します。

"Function state mutability can be restricted to pure"エラーが発生しているコード
"Function state mutability can be restricted to pure"エラーが発生しているコード

上図は今回のエラーが発生しているコードです。

関数内の処理に着目すると、状態変数(関数外の変数)を使用していないことが見て取れます。

つまり、この関数は「状態変数(関数外の変数)を読取/変更をしない = 純粋関数」といえます。

純粋関数では、viewではなくpureで修飾する必要があり、エラーが発生していたという訳です。

エラーの解決方法

解決方法は簡単で、純粋関数の場合にはviewではなくpureで修飾します。

修正後のコードは以下になります。

"Function state mutability can be restricted to pure"エラーを修正したコード
"Function state mutability can be restricted to pure"エラーを修正したコード

見て分かるように、変更箇所は、viewをpureに書き換えただけとなります。

補足説明

純粋関数について念のため補足しておきます。

先述のように「状態変数(関数外の変数)を読取/変更をしない関数」を純粋関数と呼びます。

純粋関数の例
純粋関数の例

上図はすべて純粋関数のため、pureで修飾していますが、当然ながらエラーは発生していません。

純粋関数ではない例
純粋関数ではない例

一方、先ほどの関数について、変数を関数外に出す(状態変数にする)と、エラーが発生します。

関数内で状態変数(関数外の変数)を読取/変更している = 純粋関数ではない」ためですね。

最初の頃はpureかviewのどっちを使うんだっけな、と混乱すると思います。純粋関数(状態変数を使っていない)はpure、非純粋関数(状態変数を使っている)場合はviewと覚えておきましょう。関数内で状態変数を読込しているだけでもviewを使う必要があるので注意して下さい。

タイトルとURLをコピーしました