本文へスキップ
BecomeCoder

Solidityコース · 第1章 ブロックチェーンとスマートコントラクト · レッスン5

EVMとガス ― なぜ手数料を払うのか

ローカル実施

導入

スマートコントラクトは、世界中のノード上の共通の仮想マシン EVM で実行されます。そして実行には ガス(gas) という手数料がかかります。この2つは Solidity を書くうえで常について回る、最重要の前提です。

説明

EVM(Ethereum Virtual Machine) は、すべてのノードが持つ「共通の計算機」です。あなたが書いた Solidity は バイトコード にコンパイルされ、各ノードの EVM がまったく同じ手順で実行します。全員が同じ計算をして同じ結果になるからこそ、台帳が一致します。

flowchart LR
    S["Solidityコード<br/>contract { ... }"] -- コンパイル --> BC[EVMバイトコード]
    BC -- デプロイ --> E1[ノード1のEVM]
    BC -- デプロイ --> E2[ノード2のEVM]
    BC -- デプロイ --> E3[ノード3のEVM]
    E1 & E2 & E3 --> R[全ノードで同じ結果<br/>→ 台帳が一致]

ここで問題になるのが「誰かが無限ループのコードを流したらネットワーク全体が止まる」こと。これを防ぐのが ガス です。

  • 命令1つ1つにガスの単価が決まっている(足し算は安く、保存は高い、など)。
  • 処理を実行する人は、消費したガス量 ×(自分が提示した単価)を ETH で手数料として支払う
  • あらかじめ ガスリミット(上限)を設定でき、上限に達すると処理は途中で止まる(無限ループ対策)。
graph LR
    A[処理を依頼<br/>ガスリミットを指定] --> B[EVMが命令ごとに<br/>ガスを消費]
    B --> C{ガス切れ?}
    C -- はい --> D[revert<br/>処理は取り消し・手数料は消費]
    C -- いいえ --> E[最後まで実行<br/>台帳を更新]

だから Solidity では「いかに無駄な処理・無駄なデータ保存を減らすか(ガス最適化)」が常に意識されます。ふつうのプログラミングにはない、ブロックチェーンならではの視点です。

やってみよう

「データを1つ保存する」操作は、ガスの中でもとりわけ高価です。この後の章で mapping配列にデータを書き込むコードが出てきますが、「これは台帳に永久保存され、手数料がかかる書き込みだ」と意識しながら読むと、設計の勘所が身につきます。