開発日報

窓際エンジニアの開発備忘。日報は嘘です。

【忘備】イーサリアム基礎 ~ イーサリアム仮想マシンとコード実行 ② -コントラクト実行詳細- ~

スマートコントラクト作成から利用まで

動作フロー

  1. (Solidityなどで)スマートコントラクトを書く
  2. スマートコントラクトをEVMバイトコードコンパイルする
  3. EVMバイトコードでネットワークにコントラクト作成トランザクションを送る

動作結果

コントラクト利用

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]