Ethereumのお約束。Stack Too Deep問題のメモ
概要
- 大まかに16か17のローカル変数と返り値を書くと、コンパイル時にStack Too Deepと出る問題
- 最低16 or 17以上書くとダメだけど、それより少なくてもダメな場合もある (function内の挙動による)
対応方法
- 引数をまとめる
- ローカル変数を減らす
- 返り値を減らす
- functionを分ける
- stringは2つのスタック・スロット使うので、byte32にする
- structにまとめる?
その他、色々やり方があるかも知れません。
仕組み
- 2つのスタック・スロットを使う沢山のストレージ・リファレンスがある
- スロットの中にオフセットが必要
- EVMは、ある深さのスタックまでしかリーチできない
- ローカル変数は、スタックの中に保存されている
- この問題は、スタックの問題ではなく、ストレージの問題
- 変数は、スタックの中にぎゅうぎゅう詰めになっているわけではない
- 例えば、bool変数は、フルスタックの場所をとる
参考
- solidity – Error while compiling: Stack too deep – Ethereum Stack Exchange
- solidity – Stack too deep, try using less variables on creating contract – Stack Overflow
- Error: Stack too deep, try removing local variables — Ethereum Community Forum
- EVM(Ethereum Virtual Machine)が保存できる3つのデータ領域 | block-chain.jp
関連用語
- Ethereum, イーサリアム
- Solidity
- EVM, Ethereum Virtual Machine
- stack, スタック, stack slot, スタックスロット