<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>バイトコード</title>
	<atom:link href="https://techgrowup.net/tag/%e3%83%90%e3%82%a4%e3%83%88%e3%82%b3%e3%83%bc%e3%83%89/feed/" rel="self" type="application/rss+xml" />
	<link>https://techgrowup.net</link>
	<description>エンジニアを強くする</description>
	<lastBuildDate>Sat, 05 Apr 2025 09:00:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://techgrowup.net/wp-content/uploads/2021/05/hp-icon-150x150.png</url>
	<title>バイトコード</title>
	<link>https://techgrowup.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>イーサリアムのEVMを解説！仕組み・開発の流れからコントラクト実装までわかりやすく紹介</title>
		<link>https://techgrowup.net/blockchain-ethereum-evm/</link>
					<comments>https://techgrowup.net/blockchain-ethereum-evm/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sat, 05 Apr 2025 09:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[DApp]]></category>
		<category><![CDATA[DeFi]]></category>
		<category><![CDATA[Ethereum]]></category>
		<category><![CDATA[EVM]]></category>
		<category><![CDATA[Solidity]]></category>
		<category><![CDATA[ガス]]></category>
		<category><![CDATA[スマートコントラクト]]></category>
		<category><![CDATA[バイトコード]]></category>
		<category><![CDATA[バーチャルマシン]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2730</guid>

					<description><![CDATA[はじめに Ethereum は、ビットコインの送金機能を拡張した「スマートコントラクト」をブロックチェーン上で実行できるプラットフォームとして誕生しました。その中核となるエンジンがEVM (Ethereum Virtua [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">Ethereum は、ビットコインの送金機能を拡張した「スマートコントラクト」をブロックチェーン上で実行できるプラットフォームとして誕生しました。その中核となるエンジンが<strong>EVM (Ethereum Virtual Machine)</strong> です。EVM は、ブロックチェーン上で実行されるスマートコントラクトのバイトコードを解釈し、トランザクションのロジックを処理する仮想マシンとして機能します。<br><a rel="noopener" target="_blank" class="" href="https://ethereum.org/en/developers/docs/evm/">公式ドキュメント<span class="fa fa-external-link external-icon anchor-icon"></span></a>にもあるように、EVM は単なるスクリプト言語ではなく、<strong>分散合意</strong>のもとで動作する「状態機械」であり、手数料（ガス）など独特の仕組みによってセキュリティと効率を両立しています。そこで本記事では、EVM の仕組みや命令セット、ガスモデル、コントラクト開発フローなどを掘り下げ、コード例とともにわかりやすく解説していきます。初心者から中級者まで、Ethereum の技術的な中身を知るうえでの参考にしていただければ幸いです。</p>



<h2 class="wp-block-heading">EVMとはなにか？</h2>



<h3 class="wp-block-heading">バーチャルマシンとしての役割</h3>



<p class="wp-block-paragraph">イーサリアムは<strong>チューリング完全</strong>なスマートコントラクトをオンチェーンで実行できる点が特長で、EVM がその実行環境の役割を担っています。</p>



<ul class="wp-block-list">
<li><strong>バイトコード</strong>: Solidity など高級言語で書かれたコードが EVM 向けのバイトコードにコンパイルされる</li>



<li><strong>スタックベースのマシン</strong>: EVM はスタックマシンとして設計されており、命令（Opcode）はスタックを操作して計算やメモリアクセスを行う</li>



<li><strong>状態遷移</strong>: 各トランザクション実行でコントラクトやアカウントの状態を変更し、それがブロックに記録される</li>
</ul>



<p class="wp-block-paragraph">この「状態遷移を記録しながらバイトコードを実行する」仕組みが Ethereum のブロックチェーンを動かす基盤です。</p>



<h3 class="wp-block-heading">ブロックチェーンと緊密に連携</h3>



<p class="wp-block-paragraph">EVM はブロックチェーンの<strong>分散台帳</strong>と不可分に動作します。ノードは新たなトランザクションを受け取ると EVM でコードを実行し、結果が<strong>グローバルな状態</strong>を更新する形で合意を形成します。マイナー（またはバリデーター）だけでなく、すべてのフルノードがこのプロセスを検証し、正しい結果がブロックに取り込まれるという流れです。</p>



<h2 class="wp-block-heading">ガス (Gas) とコストモデル</h2>



<h3 class="wp-block-heading">ガスとは</h3>



<p class="wp-block-paragraph">Ethereum では、スマートコントラクトを実行する際に<strong>ガス</strong>という単位が用いられます。各命令（Opcode）や記憶領域の使用（ストレージ、メモリなど）に応じてガスコストがかかり、トランザクション送信者は<strong>gasPrice × gasUsed</strong> という形で手数料を支払う仕組みです。<br>これにより、複雑すぎる処理や無限ループをブロックチェーン上で行うことが実質不可能となり、<strong>ネットワーク全体を保護</strong>する役割を果たします。</p>



<h4 class="wp-block-heading">例：ガスコストの簡単な計算</h4>



<ul class="wp-block-list">
<li>PUSH1（スタックに1バイトの値をプッシュ）: 3 gas</li>



<li>SSTORE（ストレージ書き込み）: 20000 gas (初回書き込み), 5000 gas (上書き時)</li>



<li>CALL（別コントラクト呼び出し）: 基本700 gas + α</li>
</ul>



<p class="wp-block-paragraph">トランザクション送信時に<strong>gasLimit</strong>を設定しておけば、もし途中でガスが足りなくなったときに<strong>Out of gas</strong>エラーとなり、処理はロールバックされます。</p>



<h3 class="wp-block-heading">Gas Price と手数料</h3>



<p class="wp-block-paragraph">ガスには<strong>gasPrice</strong>という単価が乗じられ、最終的には<strong>gasUsed × gasPrice</strong>=手数料(Wei)となります。Ethereum がアップデートして<strong>EIP-1559</strong>が導入されたあとは、基本的に<strong>baseFee</strong> + <strong>priorityFee (tip)</strong> という2つの概念で手数料が決定され、ネットワークの混雑状況に応じて自動調整が行われます。</p>



<h2 class="wp-block-heading">EVMの仕組み：スタックマシンとデータ領域</h2>



<h3 class="wp-block-heading">スタックベースの命令セット</h3>



<p class="wp-block-paragraph">EVM はスタックマシンとして設計され、<strong>最大1024要素</strong>のスタックを使って演算や命令を実行します。たとえば、<code>PUSH1 0x60</code> というバイトコードで値をスタックに載せ、<code>ADD</code> や <code>MUL</code> のような算術命令はスタックトップの2つの値を取り、結果を再度スタックにプッシュする仕組みです。<br>イーサリアムのバイトコードには数十種類の Opcode があり、算術、比較、ハッシュ計算、制御フロー、ログ出力、環境情報取得（CALLVALUE、CALLERなど）など多岐にわたります。</p>



<h3 class="wp-block-heading">メモリとストレージ</h3>



<ul class="wp-block-list">
<li><strong>メモリ</strong>: 実行中のコントラクト関数で一時的に使われる可変サイズのバッファ。<code>MSTORE</code>, <code>MLOAD</code> などの命令で読み書きされる</li>



<li><strong>ストレージ</strong>: コントラクトが保持する永続的なデータ領域。SSTORE命令で書き込み、SLOAD命令で読み出すが、<strong>ガスコストが高い</strong>ので注意が必要</li>
</ul>



<p class="wp-block-paragraph">特にストレージはブロックチェーン全体に保存されるため、SSTOREがコスト高というのは設計上の必然です。</p>



<h3 class="wp-block-heading">コールコンテキストとMSG</h3>



<p class="wp-block-paragraph">EVMがコントラクトを呼び出すとき、<code>msg.sender</code> (呼び出し元アドレス) や <code>msg.value</code> (送金額) などの環境パラメータが設定されます。これにより、複数のコントラクト間で呼び出しがネストしても、<strong>現在の呼び出し元</strong>を追跡できる仕組みが成り立ちます。</p>



<h2 class="wp-block-heading">コード例：簡単なスマートコントラクト（Solidity）</h2>



<p class="wp-block-paragraph">以下はSolidityで書かれた最もシンプルなコントラクト例です。EVMにコンパイルされ、先ほどの命令セットなどを介して実行されるイメージです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Counter {
    uint256 public count;

    constructor(uint256 _initialCount) {
        count = _initialCount;
    }

    function increment() public {
        count += 1;
    }

    function reset() public {
        count = 0;
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// SPDX-License-Identifier: MIT</span></span>
<span class="line"><span style="color: #C586C0">pragma</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">solidity</span><span style="color: #D4D4D4"> ^0.8.0;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">contract</span><span style="color: #4EC9B0"> Counter</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">uint256</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> count;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">constructor</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">uint256</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_initialCount</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        count = _initialCount;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">increment</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        count += </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">reset</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        count = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<ul class="wp-block-list">
<li><code>count</code>というステート変数を持ち、EVM上の<strong>ストレージ</strong>に保存される</li>



<li><code>increment()</code> を呼び出すと <code>count += 1</code> という簡単な加算が行われる</li>



<li>デプロイ後は、各トランザクションごとに EVM がこのバイトコードを解釈し、ガスコストを計算しつつ状態を更新していく</li>
</ul>



<h2 class="wp-block-heading">開発フローとツールチェーン</h2>



<h3 class="wp-block-heading">Solidity, Vyper, Yul</h3>



<p class="wp-block-paragraph">EVMバイトコードを生成するための高級言語としては<strong>Solidity</strong>が最も広く使用されています。</p>



<ul class="wp-block-list">
<li><strong>Solidity</strong>: JavaScriptやC++の文法に似た言語で、DeFiやNFTなど無数のコントラクトが書かれている</li>



<li><strong>Vyper</strong>: Pythonに似た言語。安全性や可読性を重視した設計</li>



<li><strong>Yul</strong>や<strong>Yul+</strong>: EVM中間言語として、低レベル最適化を行いたい場合に活用</li>
</ul>



<h3 class="wp-block-heading">ビルドツールやフレームワーク</h3>



<ul class="wp-block-list">
<li><strong>Truffle</strong>: 古参のフレームワーク。コンパイル、デプロイ、テストなど一括管理</li>



<li><strong>Hardhat</strong>: 新世代の開発環境。JavaScript/TypeScriptと親和性が高く、プラグインも豊富</li>



<li><strong>Foundry</strong>: Rustに触発された高速ビルド・テストツール。近年人気が高まりつつある</li>
</ul>



<p class="wp-block-paragraph">いずれも<strong>EVM互換チェーン</strong>（BSC, Polygon, etc）にも対応しており、EthereumやL2、他のチェーンでの開発を容易にします。</p>



<h2 class="wp-block-heading">EVMのセキュリティと注意点</h2>



<h3 class="wp-block-heading">Re-Entrancy攻撃</h3>



<p class="wp-block-paragraph"><strong>Re-Entrancy</strong>はスマートコントラクト攻撃の代表例であり、外部コールした先のコントラクトが再度呼び戻してくることで、意図しない状態変更を引き起こすものです。<br>対策としては<strong>checks-effects-interactions</strong>のパターンやReEntrancyGuardなどがあり、EVMレベルで考慮するというよりは、高級言語やフレームワークでベストプラクティスを守る必要があります。</p>



<h3 class="wp-block-heading">Integer Overflow / Underflow</h3>



<p class="wp-block-paragraph">古いSolidityバージョンや手動での算術を行う場合、オーバーフロー・アンダーフローが起こる可能性があります。現在のSolidityでは安全検証が標準有効化されましたが、EVMが提供する算術命令はオーバーフローを検知しないため、<strong>SafeMath</strong>などのライブラリを使う手法が以前は一般的でした。</p>



<h3 class="wp-block-heading">ガス最適化</h3>



<p class="wp-block-paragraph">EVMのgasモデルにより、ストレージ操作や長いループが高コストになるため、<strong>オプティマイゼーション</strong>が重要です。配列の長さを減らす、ストレージ書き込み回数を最小化する、などの工夫がないと、ガスコストが肥大化してユーザー体験が悪化する場合があります。</p>



<h2 class="wp-block-heading">EVMの互換性とマルチチェーン</h2>



<h3 class="wp-block-heading">EVM互換チェーン</h3>



<p class="wp-block-paragraph">Ethereum以外にも、<strong>EVM互換チェーン</strong>が多く登場しています。例としては<strong>Binance Smart Chain(BSC)</strong>、<strong>Polygon</strong>、<strong>Fantom</strong>、<strong>Avalanche C-Chain</strong>などが挙げられ、いずれも<strong>EVMバイトコード</strong>をそのまま使えるためSolidityコードを移植できるメリットがあります。</p>



<h3 class="wp-block-heading">レイヤー2とEVM</h3>



<p class="wp-block-paragraph">スケーラビリティを追求する<strong>レイヤー2ソリューション</strong>（Optimistic Rollup, ZK Rollup等）でも、EVM互換を提供している例が増えています。<strong>Optimism</strong>や<strong>Arbitrum</strong>などは、EthereumのEVMを拡張・改良した環境を用意し、デベロッパーが既存のソースコードをほぼ変更せずに利用できるようにしています。</p>



<h2 class="wp-block-heading">将来の発展：EVMのアップグレード</h2>



<h3 class="wp-block-heading">eWASM構想</h3>



<p class="wp-block-paragraph">Ethereum 2.0 (実際にはThe MergeやShardingなどが段階的に導入)の中で、<strong>eWASM</strong>というWebAssemblyベースの実行環境を導入する案が検討されましたが、現時点ではEVMが主流のままです。<br>もし将来的にeWASMが実装されれば、<strong>C++やRust、AssemblyScript</strong>などWebAssembly対応言語が使いやすくなり、さらなる高速化やガス節約が期待されます。</p>



<h3 class="wp-block-heading">zkEVMやOptimistic VM</h3>



<p class="wp-block-paragraph">ゼロ知識技術（ZK）を活用した<strong>zkEVM</strong>が登場し、<strong>zkSync</strong>や<strong>Polygon zkEVM</strong>などがレイヤー2でEVM互換を実現する方向へ進んでいます。これにより、EVMバイトコードをZK-Proofと組み合わせて計算のオフチェーン化やセキュリティ強化を図る試みが進行中です。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">EVM (Ethereum Virtual Machine) は、イーサリアムが持つ<strong>スマートコントラクト実行エンジン</strong>として欠かせない存在です。ブロックチェーンの分散合意に支えられながら、バイトコードを解釈し、<strong>ガスコスト</strong>により計算量を制御し、<strong>オンチェーン状態</strong>を更新する仕組みを一貫して提供します。</p>



<ul class="wp-block-list">
<li><strong>特徴</strong>
<ul class="wp-block-list">
<li>スタックベースの命令セット</li>



<li>ガスモデルで無限ループや過度なリソース消費を抑制</li>



<li>メモリ・ストレージなどデータ領域を明確に分割</li>
</ul>
</li>



<li><strong>開発フロー</strong>
<ul class="wp-block-list">
<li>SolidityやVyperなど高級言語でコントラクトを記述</li>



<li>Truffle/Hardhatなどツールでコンパイル・デプロイ・テスト</li>



<li>デプロイされたバイトコードをEVMが解釈し、トランザクションごとに実行</li>
</ul>
</li>



<li><strong>課題</strong>
<ul class="wp-block-list">
<li>ガス費用やスケーラビリティの問題</li>



<li>セキュリティ（Re-Entrancy, Overflow等）への対策</li>



<li>ネットワークの混雑時の手数料高騰</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">EVM はEthereumだけでなく、多数のEVM互換チェーンやレイヤー2の基盤となり、DeFiやNFTといったブロックチェーンアプリケーションの繁栄を支えています。これからもZK技術やレイヤー2ソリューションなどにより形を変えながら、EVM の概念は多くの開発者に使われ続けるでしょう。<br>本記事を通じて EVM の仕組みと開発手法の大枠を理解したなら、ぜひ実際に Solidity コントラクトを書いてみたり、Hardhat のテストコードを動かしたりして、EVM の世界を体感してみてください。そこから生まれる新たなアイデアが、未来の分散型アプリケーションを支える原動力になるかもしれません。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-ethereum-evm/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: techgrowup.net @ 2026-07-04 08:55:11 by W3 Total Cache
-->