イーサリアム 仮想マシン(EVM)のデータストレージメカニズムの概要
イーサリアム 仮想マシン(EVM)はスマートコントラクトを実行するランタイム環境であり、その効率的かつ安全なデータ保存メカニズムは、イーサリアムエコシステム全体の安定した運用を支える基盤となっています。EVMがデータをどのように処理・保存するかを理解することは、スマートコントラクト開発者がコントラクトのパフォーマンスを最適化し、ガスコストを削減し、コントラクトの安全性を確保するために極めて重要です。EVMは主に5種類のデータ保存領域を提供しており、それぞれに独自の特性、ライフサイクル、およびガスコストモデルがあります。
Storage:スマートコントラクトの永続的ストレージ

Storageはスマートコントラクトの最も中核となるストレージ領域であり、コントラクトの永続的な状態データを保存するために使用されます。その主な特性は以下の通りです:
- 永続性:データはブロックチェーン上に永続的に保存され、異なる関数呼び出しやトランザクションの間でも継続的にアクセス可能です。
- 構造:各スマートコントラクトは独立したストレージ領域を持ち、巨大なキーバリューマップとして構成されています。合計2^256個のスロットがあり、各スロットのサイズは32バイト(256ビット)です。
- データ構造の保存方法:
- 基本型:固定サイズの変数(例:
uint256)は宣言順にスロットを順次占有し、スロット0から始まります。EVMは、スペースとガスを節約するために、32バイト未満の変数を同じスロットにまとめて格納しようとします。 - 静的配列:要素は順序通りに連続したスロットに格納されます。
- 動的配列:最初のスロットには配列の長さが格納され、実際の要素は
keccak256(slot)計算された位置から格納されます。 - マッピング(Mappings):ハッシュテーブルに似ており、キーと値のペアは連続して格納されません。各キーと値のペアの格納位置は、キーとマッピングがメモリ内の位置に対するハッシュ計算によって決定されます。
- 構造体(Structs):構造体内の変数は順序通りに格納され、EVMは複数の変数を単一の32バイトのスロットに詰め込むよう試みます。
- 基本型:固定サイズの変数(例:
- ガスコスト:Storageへのデータ書き込みにかかるガスコストが最も高い。1つのスロットの値を0から非ゼロ値に変更するには、約20,000ガスのコストがかかる。初回読み取り(cold SLOAD)のコストは約2,100ガス、その後の読み取り(warm SLOAD)のコストは約100ガスである。
2026年4月現在、ストレージの価格設定およびガス計算に関する設計は、EVMストレージの増加を最適に制御することを目的として、引き続き検討が進められています。その方法としては、リアルタイムのガス計算、遅延ガス計算、ストレージ費用の分離、ストレージ増加量の数量制御などが挙げられます。
Memory:関数実行中の一時メモリ
Memoryは一時的かつ可変的な記憶領域であり、そのデータはコントラクト関数の実行中にのみ存在します。関数の実行が終了すると、Memory内のデータは解放されます。

- 用途:中間計算、一時変数、および単一の関数呼び出し内でのデータ操作に適しています。
- ガスコスト:ストレージよりも安価ですが、メモリ使用量が増加するにつれて、ガスコストは2乗比例で増加します。
Calldata:外部関数呼び出しの読み取り専用パラメータ
Calldataは、読み取り専用かつ不変の特殊なデータ領域であり、主に外部関数呼び出しの引数を格納するために使用されます。これはバイト単位でアドレス指定可能な領域であり、Memoryよりも効率的であるため、動的なデータを渡す必要があり、かつ変更を必要としない場合に特に適しています。
- 用途:外部関数呼び出しの入力引数。
- ガスコスト:Memoryよりも安価です。Calldataの非ゼロバイト1バイトあたりのコストは16ガス、ゼロバイトの場合は4ガスです。
Stack:EVMの実行スタック

EVMはスタックベースの仮想マシンであり、Stackは後入れ先出し(LIFO)のデータ構造で、スマートコントラクトの実行過程における一時的な値を格納するために使用されます。EVMのオペコード(Opcode)は、スタック上のデータを直接操作します。
- 特性:スタックの各要素は32バイトで、最大深さは1024要素です。
- 制限:スタックには、配列、文字列、マップなどの複合型を直接格納することはできません。
- ガスコスト:操作にかかるガスコストは比較的低いが、スタックの深さには制限がある。
Transient Storage:単一トランザクションのライフサイクルにおける一時ストレージ
EIP-1153によって導入されたTransient Storageは、非永続的なストレージであり、そのデータは単一のトランザクションの存続期間中のみ存在し、トランザクション終了後に消去されます。これは、データをブロックチェーンに永続的に書き込むことなく、同一トランザクション内の異なる関数呼び出し間でデータを共有するための低コストな方法を提供します。
- 利用可能性:Solidity v0.8.30以降、値型(例:
uint256,bool)のトランジェントストレージがサポートされ、transientキーワードを介してアクセスします。参照型のサポートは、将来のバージョンで提供される予定です。 - ガスコスト:Storageへの永続的な書き込みと比較して、Transient Storageはオンチェーンの状態を永続的に変更しないため、コストが大幅に低減されます。
ガスコストの比較と最適化戦略

さまざまなストレージタイプのガスコストの違いを理解することは、スマートコントラクト開発者が最適化を行う上で重要です。Storageの書き込みコストは最も高いため、不要なオンチェーンストレージは極力削減すべきです。MemoryとCalldataは一時的なデータや関数引数の受け渡しに適しており、特にCalldataは読み取り専用であるため、大量の動的データを渡す際に通常、コスト効率に優れています。Transient Storageは、単一トランザクション内での関数間データ共有に、新たな低コストの選択肢を提供します。
スマートコントラクト開発者は、データの永続性、可変性、アクセス頻度、およびガスコストに基づいて、適切な保存場所を選択する必要があります。例えば、構造体変数の再配置によるスロット使用量の最小化、静的配列の可能な限り活用、マップの賢明な使用などは、ストレージレイアウトを最適化し、ガスコストを削減するための有効な手法です。同時に、監査担当者も、潜在的な脆弱性やガス最適化の機会を特定するために、EVMのメモリモデルとストレージメカニズムを深く理解する必要があります。









