スマートコントラクト作成から利用まで
動作フロー
動作結果
コントラクト利用
EVMのメモリ管理
EVMでは以下の3つの領域に適したメモリ管理を行っている
ストレージ
- Key/Value 型 (256bit)
- 列挙不可
- コントラクトの状態は「ストレージ」にある。(状態変数)
- ストレージはコントラクト作成時に設定され、変更不可。
- ただし、「sendTransaction」関数で変更可能
- ストレージはコントラクト作成時に設定され、変更不可。
- ストレージ読み書きコストが高い
- コントラクト自身が所有していないストレージはアクセス不可。
- SSTORとSLOADはよく使う命令。
メモリ(揮発性)
- 一時的な値を格納
- コントラクトで使ったメモリは実行完了後にクリアされる
- 実行中の出力はストレージにプッシュされるので利用可
- バイト配列
- 空から始まり、32バイト単位で領域が確保される
- 変数宣言時に「memory」キーワード使わないとストレージに変数の領域が確保される
- MSTORとMLOADはよく使う
- メモリはスマートコントラクトのレベルでは使用不可。メソッドでのみ利用できる。
- 関数の引数はほぼメモリをとる
スタック
- EVMはスタックベース
- MAX1024個の要素が入る。
- スタックエントリーも256ビットワード。
- スタック捜査のほとんどはスタックの最上部に限られる。
EVMバイトコード
EVM上のトランザクションのバイトコードは次のタプルに定義される
[block_state, transaction, message, code, memory, stack, pc, gas]