【Solidity】"Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view""エラーの解決方法

Solidityを書き始めて間もない頃は、'Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view"'というエラーによく出くわすと思います。

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

エラーの意味

まず、このエラーの意味ですが、'Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view"'とあるように、「純粋関数として定義されているのにも関わらず状態変数を読み込んでしまっている」ということです。

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

'Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view"'エラーが発生しているコード
'Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view"'エラーが発生しているコード

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

pure修飾子が付いている以上、関数内部で状態変数(関数外の変数)を読込/書込してはいけないにも関わらず、関数内でmultiplierという状態変数を読み込んでしまっています。

非純粋関数(関数内で状態変数を読込/書込している関数)については、pureではなくviewで修飾する必要があるため、エラーが発生していたという訳です。

エラーの解決方法

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

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

'Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view"'エラーを修正したコード
'Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view"'エラーを修正したコード

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

補足説明

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

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

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

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

一方、先ほどの関数について、viewではなくpureで修飾すると、エラーが発生します。

関数内で状態変数(関数外の変数)を読取/変更している = 非純粋関数である」ため、純粋関数(関数内で状態変数を読取/変更していない関数)に用いるpureは使えない、からですね。

最初の頃はpureかviewのどっちを使うんだっけな、と混乱すると思います。純粋関数(関数内で状態変数を使っていない)はpure、非純粋関数(関数内で状態変数を使っている)はviewで修飾すると覚えておきましょう。

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