本日もSolidity開発時におけるエラーについてご紹介していきます。
スマートコントラクトの開発をしているときに以下のようなエラーが発生しました。
TypeError: Member “push” is not available in address[] memory outside of storage.
エラー発生時のソースコード
- 関数内で配列を memory で定義する
- 配列に対し、n個の要素をpush
- memory で定義された配列は可変長の配列として扱えないためエラーが発生する
原因
memory array で配列を定義した場合、最初に確保された領域のみしか使うことができず、可変長の配列として扱うことができないようです。
storage で配列を定義すれば可変長の配列として扱うことができるようになりますが、GASが発生するためあまり良い施策とは言えません。
解決策
配列を memory ではなく storage で定義すればこの問題は解決しますが、GASが発生してしまうことになります。
ブロックチェーンへの書き込みではなく、関数内の一時的な配列へ書き込むためにGASを使ってしまうのは非常にイケてないです。
今の所は「関数の中だけで使用する可変長の配列を作成することができない」ということを前提として、よく考えてソースコードを組んでいくしかなさそうです。
何かいい解決策があればぜひ教えてください。