Mi

日常をさらさらと

EVMとは何か

EVMとは何か

Ethereum 上にのっているVirtual Machine

SmartContractを動かず場合には、基本的に EVMの上で実行する

特徴

  • チューリング完全
  • stack型のマシン
  • 256個のopcodeを持つ // opcode -> 機械語の1個の命令の部分で、実行する操作 (operation) の種類を指定する部分のこと
  • 32byteのsegment

Ethereumのstateは全て EVM を実行した結果だってよ!

Transaction

Ethereum は World State Of Machine と言われるが、Ethereumでは前のStateの状態に前のTransactionの値を受け取って、前のStateの状態と新しいTransactionをEVMにいれて、次の状態に変わるのが基本的な流れ

S -> State Tx -> Transaction

S[N+1] = EVM(S[N], Tx[n])

World State(Ethereum の データ)の構造

BitCoinと同じく、PREVHASHを持っていて、STATE_ROOTを持っている さらに、STATE_ROOTが State DBになっている Tree上になっているが、各ノードに細かいデータを保持している

STATE_ROOTの構造

中身は全てアカウント情報になっている

  • nonce -> Transactionを発光するたびに増加していくもの
  • balance -> 保有しているETH量
  • code -> Contract Address 本体が格納されている
  • storage root -> Contractの場合に、Contractの状態を格納する領域として使用される

Contract Creation

Contractを生成する時に何が行われているのか

  • Contract Address の生成 -> StateDB上に保存するAddressの生成
  • StateDBに新規Account領域を確保 -> Addressに対して、新規Accountの領域を確保
  • nonceを1にセット
  • ETHを送信
  • init codeを実行(storageとcodeの初期化)
  • code hash を記録

これで Contractの生成が完了する

Contract Addressの生成方法

決定論アルゴリズムで、Contract Creation Transactionを投げた address (sender address)とsender address が持っている nonceの値によって生成が行われる

nonce は インクリメントで増えていく + sender addressもユニークなので、Contract Address はユニークになるはず!

Storage と code の初期化方法

Contract Creationを投げたときにデータ部に長いopcodeが格納されいるのが、init 処理と本体コードを含む処理になる 上部にinit処理が書かれており、実行されることで本体コードだけ取り出される

本体コードの構成

大きく分けて、3 ~ 4

  • free memory 領域宣言のための定型処理(定型文!)
  • 送られてきたETHの量を検証している

-> 間違ってETHが送られてきた場合に弾く

-> payableをつけると、ここの処理を抜けれる

  • 本体のコードを残す処理.return値としては、本体codeをかえす