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をかえす