<?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/category/blockchain/feed/" rel="self" type="application/rss+xml" />
	<link>https://techgrowup.net</link>
	<description>エンジニアを強くする</description>
	<lastBuildDate>Mon, 21 Apr 2025 23: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>Solidity静的解析ツール「Slither」ガイド──インストールから独自ディテクタ実装・CI統合まで網羅</title>
		<link>https://techgrowup.net/blockchain-slither/</link>
					<comments>https://techgrowup.net/blockchain-slither/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Mon, 21 Apr 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[Crytic]]></category>
		<category><![CDATA[Python API]]></category>
		<category><![CDATA[SARIF]]></category>
		<category><![CDATA[Slither]]></category>
		<category><![CDATA[Solidity静的解析]]></category>
		<category><![CDATA[スマートコントラクト監査]]></category>
		<category><![CDATA[セキュリティツール]]></category>
		<category><![CDATA[ディテクタ]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2799</guid>

					<description><![CDATA[はじめに スマートコントラクトは不変性こそ最大の長所ですが、同時に「脆弱性を後から修正しづらい」という致命的な短所を抱えています。実際、多くのDeFiハッキング事件が再入可能性や整数オーバーフローといった基本的ミスに起因 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">スマートコントラクトは不変性こそ最大の長所ですが、同時に「脆弱性を後から修正しづらい」という致命的な短所を抱えています。実際、多くのDeFiハッキング事件が<strong>再入可能性</strong>や<strong>整数オーバーフロー</strong>といった基本的ミスに起因しています。こうした問題を早期に発見する手段として注目されるのが<strong>静的解析ツール</strong>です。中でも <strong>Slither</strong> はCrytic（Trail of Bits傘下）が開発し、GitHubスター数3k超を誇る事実上の標準フレームワークになっています。本記事ではリポジトリ <a rel="noopener" target="_blank" class="" href="https://github.com/crytic/slither">https://github.com/crytic/slither<span class="fa fa-external-link external-icon anchor-icon"></span></a> を参照しつつ、Slitherの導入から高度な活用法までを解説します。</p>



<h2 class="wp-block-heading">Slitherの概要</h2>



<h3 class="wp-block-heading">特徴</h3>



<ul class="wp-block-list">
<li><strong>80種類以上のディテクタ</strong>：再入可能性、写像初期化忘れ、tx.origin 誤用などを自動検出</li>



<li><strong>ゼロ依存インストール</strong>：<code>pip install slither-analyzer</code> のみ</li>



<li><strong>詳細メトリクス</strong>：関数サイクロマティック複雑度、ガスコスト推定</li>



<li><strong>Python API</strong>：AST/CFG/SSAを取得し、独自解析が可能</li>



<li><strong>SARIF出力</strong>：GitHub Advanced Securityでの可視化に対応</li>
</ul>



<h3 class="wp-block-heading">高速解析の仕組み</h3>



<p class="wp-block-paragraph">SlitherはSolidityコンパイラ<code>solc</code>の<strong>AST (Abstract Syntax Tree)をJSONで取得し、内部でStatic Single Assignment (SSA)</strong> へ変換します。制御フローグラフ (CFG) を生成し、パターンマッチ＋データフロー解析で脆弱性を判断。バイトコード解析型のMythrilに比べ高速で、CIでもタイムアウトしにくいのが利点です。</p>



<h2 class="wp-block-heading">インストールと基本コマンド</h2>



<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="# Python 3.8+
pip install slither-analyzer            # グローバル導入
cd my-contracts                         # Truffle/Hardhat プロジェクト直下
slither .                               # 全.sol解析" 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"># Python 3.8+</span></span>
<span class="line"><span style="color: #DCDCAA">pip</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">slither-analyzer</span><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># グローバル導入</span></span>
<span class="line"><span style="color: #DCDCAA">cd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">my-contracts</span><span style="color: #D4D4D4">                         </span><span style="color: #6A9955"># Truffle/Hardhat プロジェクト直下</span></span>
<span class="line"><span style="color: #DCDCAA">slither</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">.</span><span style="color: #D4D4D4">                               </span><span style="color: #6A9955"># 全.sol解析</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>solc-select</code>で特定バージョンを使う場合</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="solc-select install 0.8.23
solc-select use 0.8.23
slither . --solc-version 0.8.23" 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: #DCDCAA">solc-select</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0.8</span><span style="color: #CE9178">.23</span></span>
<span class="line"><span style="color: #DCDCAA">solc-select</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">use</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0.8</span><span style="color: #CE9178">.23</span></span>
<span class="line"><span style="color: #DCDCAA">slither</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">.</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--solc-version</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0.8</span><span style="color: #CE9178">.23</span></span></code></pre></div>



<p class="wp-block-paragraph">出力例（抜粋）</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="Reentrancy in MyVault.withdraw(uint256) [ReentrancyInFunctions] 
  External calls:
      - TransferHelper.safeTransfer(...)
  State variables written after the call(s):
      - balances[msg.sender] = 0

Low level call in …" 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: #D4D4D4">Reentrancy in MyVault.withdraw(uint256) [</span><span style="color: #9CDCFE">ReentrancyInFunctions</span><span style="color: #D4D4D4">] </span></span>
<span class="line"><span style="color: #D4D4D4">  External calls:</span></span>
<span class="line"><span style="color: #D4D4D4">      - TransferHelper.safeTransfer(...)</span></span>
<span class="line"><span style="color: #D4D4D4">  State variables written after the call(</span><span style="color: #D7BA7D">s</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">      - balances[msg.sender] = 0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">Low level call in …</span></span></code></pre></div>



<h2 class="wp-block-heading">代表的ディテクタと対策</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>カテゴリ</th><th>ディテクタ名</th><th>検出内容</th><th>典型的修正</th></tr></thead><tbody><tr><td>再入可能性</td><td><code>reentrancy-eth</code></td><td>外部呼び出し後に状態更新</td><td>Checks-Effects-Interactions パターン</td></tr><tr><td>アクセス制御</td><td><code>tx-origin</code></td><td><code>tx.origin</code> の誤用</td><td><code>msg.sender</code> に置換</td></tr><tr><td>数学的安全性</td><td><code>divide-before-multiply</code></td><td>乗算前の除算で精度損失</td><td>SafeMath or Solidity 0.8 での built‑in チェック</td></tr><tr><td>初期化</td><td><code>missing-zero-check</code></td><td>コンストラクタでmap[key]==0を前提</td><td>マッピング初期値の明示</td></tr><tr><td>ガス最適</td><td><code>costly-loop</code></td><td>ガス高いfor/while</td><td>ループ回数制限・イベント分割</td></tr></tbody></table></div></figure>



<p class="wp-block-paragraph">詳細は<code>slither --list-detectors</code>で確認すると自動出力されます。</p>



<h2 class="wp-block-heading">プリンタ（Printers）でコード理解を加速</h2>



<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="slither . --print contract-summary
slither . --print function-summary --filter &quot;MyToken&quot;
slither . --print cfg --export-graph cfg.png" 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: #DCDCAA">slither</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">.</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--print</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">contract-summary</span></span>
<span class="line"><span style="color: #DCDCAA">slither</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">.</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--print</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">function-summary</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--filter</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;MyToken&quot;</span></span>
<span class="line"><span style="color: #DCDCAA">slither</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">.</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--print</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">cfg</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--export-graph</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">cfg.png</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>contract-summary</strong>：継承関係・関数一覧</li>



<li><strong>function-summary</strong>：呼び出しグラフ、state変数読書一覧</li>



<li><strong>cfg</strong>：Control Flow GraphをGraphVizで可視化</li>
</ul>



<p class="wp-block-paragraph">これにより、外部監査前の内部レビューや新人教育が効率化します。</p>



<h2 class="wp-block-heading">Python APIで独自ディテクタを書く</h2>



<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="from slither.slither import Slither
from slither.detectors.abstract_detector import AbstractDetector, DETECTOR_INFO, DetectorClassification

class NoPayable(AbstractDetector):
    ARGUMENT = &quot;no-payable&quot;
    HELP = &quot;Detect missing payable in public functions&quot;
    IMPACT = DetectorClassification.HIGH
    CONFIDENCE = DetectorClassification.MEDIUM

    @classmethod
    def _detect(cls, slither: Slither):
        results = []
        for contract in slither.contracts:
            for func in contract.functions_declared:
                if func.visibility == &quot;public&quot; and func.payable:
                    continue
                if &quot;value&quot; in [c.name for c in func.state_variables_written]:
                    res = cls.generate_result(f&quot;{func.full_name} writes value but is not payable&quot;, func.source_mapping)
                    results.append(res)
        return results" 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: #C586C0">from</span><span style="color: #D4D4D4"> slither.slither </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> Slither</span></span>
<span class="line"><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> slither.detectors.abstract_detector </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> AbstractDetector, DETECTOR_INFO, DetectorClassification</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">NoPayable</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">AbstractDetector</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    ARGUMENT = </span><span style="color: #CE9178">&quot;no-payable&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    HELP = </span><span style="color: #CE9178">&quot;Detect missing payable in public functions&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    IMPACT = DetectorClassification.HIGH</span></span>
<span class="line"><span style="color: #D4D4D4">    CONFIDENCE = DetectorClassification.MEDIUM</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">@</span><span style="color: #4EC9B0">classmethod</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">_detect</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">cls</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">slither</span><span style="color: #D4D4D4">: Slither):</span></span>
<span class="line"><span style="color: #D4D4D4">        results = []</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> contract </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> slither.contracts:</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> func </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> contract.functions_declared:</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> func.visibility == </span><span style="color: #CE9178">&quot;public&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> func.payable:</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">continue</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;value&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> [c.name </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> c </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> func.state_variables_written]:</span></span>
<span class="line"><span style="color: #D4D4D4">                    res = </span><span style="color: #569CD6">cls</span><span style="color: #D4D4D4">.generate_result(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">func.full_name</span><span style="color: #569CD6">}</span><span style="color: #CE9178"> writes value but is not payable&quot;</span><span style="color: #D4D4D4">, func.source_mapping)</span></span>
<span class="line"><span style="color: #D4D4D4">                    results.append(res)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> results</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>python my_detector.py</code> 実行で独自ルールが適用され、社内標準ポリシーの自動チェックが可能になります。</p>



<h2 class="wp-block-heading">CI/CD統合（GitHub&nbsp;Actions例）</h2>



<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="name: Slither
on: [pull_request]
jobs:
  analyze:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup
        run: |
          pip install slither-analyzer
          solc-select install 0.8.23 &amp;&amp; solc-select use 0.8.23
      - name: Run Slither
        run: |
          slither . --sarif slither.sarif || true
      - name: Upload SARIF
        uses: github/codeql-action/upload-sarif@v2
        with:
          sarif_file: slither.sarif" 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: #569CD6">name</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">Slither</span></span>
<span class="line"><span style="color: #569CD6">on</span><span style="color: #D4D4D4">: [</span><span style="color: #CE9178">pull_request</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #569CD6">jobs</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">analyze</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">runs-on</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">ubuntu-latest</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">steps</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #569CD6">uses</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">actions/checkout@v3</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #569CD6">name</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">Setup</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">run</span><span style="color: #D4D4D4">: </span><span style="color: #C586C0">|</span></span>
<span class="line"><span style="color: #CE9178">          pip install slither-analyzer</span></span>
<span class="line"><span style="color: #CE9178">          solc-select install 0.8.23 &amp;&amp; solc-select use 0.8.23</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #569CD6">name</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">Run Slither</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">run</span><span style="color: #D4D4D4">: </span><span style="color: #C586C0">|</span></span>
<span class="line"><span style="color: #CE9178">          slither . --sarif slither.sarif || true</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #569CD6">name</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">Upload SARIF</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">uses</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">github/codeql-action/upload-sarif@v2</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">with</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #569CD6">sarif_file</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">slither.sarif</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>GitHub Advanced Security</strong> のUIで脆弱性がPRレビューにインライン表示され、修正フローが高速化します。</p>



<h2 class="wp-block-heading">高度な活用：Slither&nbsp;in&nbsp;Foundry &amp; Hardhat</h2>



<ul class="wp-block-list">
<li><strong>Foundry</strong>：<code>forge install crytic/slither</code> でビルトイン。一行で<code>forge slither</code>が実行可。</li>



<li><strong>Hardhat</strong>：<code>hardhat-slither-plugin</code> を導入し、コンパイル後フックで解析を自動化。</li>
</ul>



<p class="wp-block-paragraph">Gasレポートと合わせて実行し、セキュリティとコストの両面を同時にチェックできます。</p>



<h2 class="wp-block-heading">既知の制限と将来ロードマップ</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>現状</th><th>今後の改善</th></tr></thead><tbody><tr><td>Yul 支持</td><td>部分対応</td><td>Full&nbsp;YulとInline&nbsp;Assembly対応予定</td></tr><tr><td>多言語VM</td><td>Solidityのみ</td><td>Vyper ASTを進行中</td></tr><tr><td>実行時間</td><td>大型monorepoで数分</td><td>マルチプロセス化＆キャッシュ導入計画</td></tr></tbody></table></div></figure>



<p class="wp-block-paragraph">コミュニティIssueに「EIP‑7201 StorageLayout」チェック追加が提案されており、大規模アップグレードにも対応予定です。</p>



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



<p class="wp-block-paragraph">Slitherは<strong>高速・高精度</strong>かつ<strong>拡張性が高い</strong>Solidity静的解析フレームワークです。標準ディテクタで一般的な脆弱性を網羅しつつ、Python&nbsp;APIで独自ルールを組み込むことで、プロジェクト固有のセキュリティポリシーも自動で検証できます。</p>



<ul class="wp-block-list">
<li>まずは<code>pip install slither-analyzer</code>で導入し、<code>slither .</code>で現状のバグを洗い出す</li>



<li>GitHub ActionsやFoundry CIに組み込み、開発サイクルの初期段階で脆弱性を捕捉</li>



<li>重要ロジックにはカスタムディテクタ＋Echidna Fuzzで二重防御</li>
</ul>



<p class="wp-block-paragraph">これらの手順を踏むことで、スマートコントラクトの信頼性と運用コストを大幅に改善できます。Trail&nbsp;of&nbsp;Bitsの監査レベルの解析を日常的な開発フローへ──それがSlither活用の真価です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-slither/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ブロックチェーンテスト攻略──単体・統合・セキュリティ・性能を網羅する実践ガイド</title>
		<link>https://techgrowup.net/blockchain-test-guide/</link>
					<comments>https://techgrowup.net/blockchain-test-guide/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sun, 20 Apr 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[Foundry]]></category>
		<category><![CDATA[Hardhat]]></category>
		<category><![CDATA[Slither]]></category>
		<category><![CDATA[スマートコントラクト]]></category>
		<category><![CDATA[セキュリティテスト]]></category>
		<category><![CDATA[ブロックチェーンテスト]]></category>
		<category><![CDATA[単体テスト]]></category>
		<category><![CDATA[性能テスト]]></category>
		<category><![CDATA[統合テスト]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2795</guid>

					<description><![CDATA[はじめに ビットコインから続くブロックチェーンの10余年の歩みは「コード＝資産」という新しい常識を生みました。しかし一度デプロイしたスマートコントラクトは簡単に修正できず、1行のバグが数億円規模の損失になる事例が後を絶ち [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">ビットコインから続くブロックチェーンの10余年の歩みは「コード＝資産」という新しい常識を生みました。しかし一度デプロイしたスマートコントラクトは簡単に修正できず、<strong>1行のバグが数億円規模の損失</strong>になる事例が後を絶ちません。LogRocket の「Complete guide to blockchain testing」は、ブロックチェーン特有のテスト課題と解決策を体系的に整理しています 。本記事ではその内容を深掘りし、<strong>ブロックチェーンテストの全体像と実践方法</strong>を解説します。</p>



<h2 class="wp-block-heading">ブロックチェーンテストの全体設計</h2>



<h3 class="wp-block-heading">主要テストレイヤー</h3>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>レイヤー</th><th>目的</th><th>代表ツール</th></tr></thead><tbody><tr><td><strong>単体テスト</strong></td><td>関数単位のロジック検証</td><td>Hardhat/Chai, Foundry/Forge, Brownie/PyTest</td></tr><tr><td><strong>統合テスト</strong></td><td>複数コントラクト間の相互作用</td><td>Hardhat&nbsp;Network&nbsp;fork, Deployment&nbsp;scripts</td></tr><tr><td><strong>ノード/ネットワークテスト</strong></td><td>コンセンサス、フォークハンドリング</td><td>Ganache, Anvil, Geth&nbsp;dev&nbsp;net</td></tr><tr><td><strong>セキュリティテスト</strong></td><td>再入可能性・整数演算・権限漏れ</td><td>Slither, Mythril, Echidna, Manticore</td></tr><tr><td><strong>性能テスト</strong></td><td>TPS、Gas効率、スループット</td><td>Hardhat‑gas‑reporter, Hyperledger&nbsp;Caliper</td></tr></tbody></table></div></figure>



<h3 class="wp-block-heading">テストフェーズ</h3>



<ol class="wp-block-list">
<li><strong>テスト計画</strong>：脅威モデル作成、成功基準(KPI)を定義</li>



<li><strong>テストデザイン</strong>：シナリオ、エッジケース、ファズ入力を設計</li>



<li><strong>実装</strong>：テストコード＋モック＋スタブを作成</li>



<li><strong>実行</strong>：ローカル→テストネット→シミュレーション環境で段階的実行</li>



<li><strong>レポート</strong>：カバレッジ、Gas使用量、失敗ケースを可視化</li>
</ol>



<h2 class="wp-block-heading">単体テストを極める</h2>



<h3 class="wp-block-heading">Hardhat × Chai 基本例</h3>



<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.23;
contract Counter {
    uint256 public n;
    function inc() external { n += 1; }
}" 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.23;</span></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"> n;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">inc</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">external</span><span style="color: #D4D4D4"> { n += </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<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="// test/Counter.ts
import { expect } from &quot;chai&quot;;
import { ethers } from &quot;hardhat&quot;;
describe(&quot;Counter&quot;, () =&gt; {
  it(&quot;増分ロジック&quot;, async () =&gt; {
    const Counter = await ethers.getContractFactory(&quot;Counter&quot;);
    const c = await Counter.deploy();
    await c.inc();
    expect(await c.n()).to.equal(1);
  });
});" 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">// test/Counter.ts</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">expect</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;chai&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;hardhat&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #DCDCAA">describe</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Counter&quot;</span><span style="color: #D4D4D4">, () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">it</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;増分ロジック&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">Counter</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getContractFactory</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Counter&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">c</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Counter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">deploy</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">c</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">inc</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">expect</span><span style="color: #D4D4D4">(</span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">c</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">n</span><span style="color: #D4D4D4">()).</span><span style="color: #9CDCFE">to</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">equal</span><span style="color: #D4D4D4">(</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 style="color: #D4D4D4">});</span></span></code></pre></div>



<ul class="wp-block-list">
<li><code>npx hardhat test</code> で高速実行</li>



<li><code>evm_snapshot/evm_revert</code>で状態ロールバックしテスト独立性を確保</li>
</ul>



<h3 class="wp-block-heading">Foundry で Fuzz &amp; Invariant</h3>



<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="import &quot;forge-std/Test.sol&quot;;
contract CounterTest is Test {
    Counter c;
    function setUp() public { c = new Counter(); }
    function testFuzz(uint256 x) public {
        vm.assume(x &lt; 1000);
        uint256 before = c.n();
        c.inc();
        assertEq(c.n(), before + 1);
    }
}" 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: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;forge-std/Test.sol&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #9CDCFE">contract</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">CounterTest</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">is</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Test</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">Counter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">c</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setUp</span><span style="color: #D4D4D4">() </span><span style="color: #DCDCAA">public</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">c</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Counter</span><span style="color: #D4D4D4">(); }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">testFuzz</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">uint256</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">) </span><span style="color: #DCDCAA">public</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">vm</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">assume</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #B5CEA8">1000</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">uint256</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">before</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">c</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">n</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">c</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">inc</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">assertEq</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">c</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">n</span><span style="color: #D4D4D4">(), </span><span style="color: #9CDCFE">before</span><span style="color: #D4D4D4"> + </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 style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>forge test --fuzz-runs 500</code> で500ケース自動生成。異常系を自動発見しやすい。</p>



<h2 class="wp-block-heading">統合テストとフォークシミュレーション</h2>



<h3 class="wp-block-heading">Mainnet Fork</h3>



<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="module.exports = {
  networks: {
    fork: {
      url: &quot;https://eth-mainnet.g.alchemy.com/v2/&lt;API_KEY&gt;&quot;,
      forking: { blockNumber: 19000000 }
    }
  }
};" 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: #4EC9B0">module</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">exports</span><span style="color: #D4D4D4"> = {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">networks:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">fork:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">url:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;https://eth-mainnet.g.alchemy.com/v2/&lt;API_KEY&gt;&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">forking:</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">blockNumber:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">19000000</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>
<span class="line"><span style="color: #D4D4D4">};</span></span></code></pre></div>



<ul class="wp-block-list">
<li>実際のUniswap V3コントラクトと自作戦略コントラクトをローカル統合</li>



<li>価格オラクルの再入攻撃など<strong>実戦さながら</strong>の検証が可能</li>
</ul>



<h3 class="wp-block-heading">Mock &amp; Stub</h3>



<ul class="wp-block-list">
<li>Chainlink AggregatorV3Interface をダミー実装し価格を固定</li>



<li>ERC20 Permit をスタブして署名検証をスキップしガス測定に集中</li>
</ul>



<h2 class="wp-block-heading">セキュリティテストツールの活用</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>ツール</th><th>テスト種別</th><th>強み</th></tr></thead><tbody><tr><td>Slither</td><td>静的解析</td><td>20+ルール、CI統合容易</td></tr><tr><td>Mythril</td><td>バイトコードSWC検査</td><td>SMTベースで深いパス探索</td></tr><tr><td>Echidna</td><td>Fuzz &amp; Invariant</td><td>Solidityでプロパティ定義、見落とし低減</td></tr><tr><td>Manticore</td><td>代数的実行</td><td>低レイヤー応用、複雑パス発見</td></tr></tbody></table></div></figure>



<p class="wp-block-paragraph"><strong>例：Slither CI</strong></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="run-slither:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v3
    - name: Slither
      uses: crytic/slither-action@v0.2.0
      with:
        truffle-version: 5.9.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: #569CD6">run-slither</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">runs-on</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">ubuntu-latest</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">steps</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    - </span><span style="color: #569CD6">uses</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">actions/checkout@v3</span></span>
<span class="line"><span style="color: #D4D4D4">    - </span><span style="color: #569CD6">name</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">Slither</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">uses</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">crytic/slither-action@v0.2.0</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">with</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">truffle-version</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">5.9.0</span></span></code></pre></div>



<p class="wp-block-paragraph">PRごとにセキュリティ静的解析を自動実行し、リスクを早期検知。</p>



<h2 class="wp-block-heading">性能テストとガス最適化</h2>



<h3 class="wp-block-heading">Hardhat‑gas‑reporter</h3>



<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="npm i --save-dev hardhat-gas-reporter" 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: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--save-dev</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">hardhat-gas-reporter</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>hardhat.config.js</code></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="require(&quot;hardhat-gas-reporter&quot;);
module.exports = {
  gasReporter: { currency: &quot;USD&quot;, coinmarketcap: &quot;&lt;KEY&gt;&quot; }
};" 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: #DCDCAA">require</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;hardhat-gas-reporter&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #4EC9B0">module</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">exports</span><span style="color: #D4D4D4"> = {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">gasReporter:</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">currency:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;USD&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">coinmarketcap:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;&lt;KEY&gt;&quot;</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span></code></pre></div>



<ul class="wp-block-list">
<li>単体テストと同時にGasコスト一覧をMarkdown出力</li>



<li>コスト重い関数を把握→Unchecked Math・Constant Caching で最適化</li>
</ul>



<h3 class="wp-block-heading">Hyperledger&nbsp;Caliper でTPS測定</h3>



<ul class="wp-block-list">
<li>ノード数やBlockGasLimitを変化させ、Peak TPSとレイテンシを計測</li>



<li>結果をPrometheus + Grafanaで可視化し、Bottleneck分析</li>
</ul>



<h2 class="wp-block-heading">CI/CD パイプラインに組み込む</h2>



<ol class="wp-block-list">
<li><strong>Lint</strong>：Solhint / Prettier でスタイル統一</li>



<li><strong>Unit Test</strong>：Hardhat or Foundry with Coverage≥90%</li>



<li><strong>Security Scan</strong>：Slither &amp; Mythril</li>



<li><strong>Fuzz</strong>：Echidna 1k runs (nightly)</li>



<li><strong>Gas Report</strong>：PRコメントに自動投稿</li>



<li><strong>Testnet Deploy</strong>：成功時のみSepoliaへ自動デプロイ</li>



<li><strong>Etherscan Verify</strong>：APIで自動検証し透明性を担保</li>
</ol>



<h2 class="wp-block-heading">現実のトラブル事例と教訓</h2>



<ul class="wp-block-list">
<li><strong>DAO Hack</strong>：再帰呼び出しを想定した単体テスト不備</li>



<li><strong>bZx Protocol</strong>：価格フィードモックが単一Oracleで多重価格を見落とし</li>



<li><strong>Sushi MISO</strong>：ステート変数初期化未テスト→一括NFT購入バグ</li>
</ul>



<p class="wp-block-paragraph"><strong>教訓</strong>：テストは「想定どおり動くか」より「想定外で止まるか」を検証することが重要。</p>



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



<p class="wp-block-paragraph">ブロックチェーン・スマートコントラクトのテストは「単体→統合→セキュリティ→性能」という多層防御が欠かせません。HardhatやFoundryでの高速テスト、Slither/Echidnaでの自動脆弱性検査、Caliperでの性能測定を組み合わせることで、品質と開発速度を両立できます。LogRocketが指摘するように、テスト漏れは開発者の信頼を一瞬で失います 。本記事で紹介したツールと手法をCI/CDに組み込み、<strong>デプロイ前に壊れないことを証明する</strong>文化をチーム全体で育てましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-test-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>スマートコントラクト単体テストガイド──Hardhat・Foundry・Brownieで学ぶ堅牢なEthereum開発フロー</title>
		<link>https://techgrowup.net/blockchain-unit-test/</link>
					<comments>https://techgrowup.net/blockchain-unit-test/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sat, 19 Apr 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[Brownie]]></category>
		<category><![CDATA[Foundry]]></category>
		<category><![CDATA[Fuzzing]]></category>
		<category><![CDATA[Hardhat]]></category>
		<category><![CDATA[Solidity]]></category>
		<category><![CDATA[カバレッジ]]></category>
		<category><![CDATA[スマートコンタクト]]></category>
		<category><![CDATA[単体テスト]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2792</guid>

					<description><![CDATA[はじめに DeFiプロトコルやNFTプロジェクトが相次いでハッキング被害を受ける中、スマートコントラクトの単体テスト（Unit Testing）は「開発者の保険」ではなく必須条件になりました。オンチェーンにデプロイしたコ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">DeFiプロトコルやNFTプロジェクトが相次いでハッキング被害を受ける中、スマートコントラクトの<strong>単体テスト（Unit Testing）は「開発者の保険」ではなく必須条件</strong>になりました。オンチェーンにデプロイしたコードは基本的に変更不可能であり、1行のバグが数百万ドルを失わせる事例も珍しくありません。Ethereum.orgの公式ドキュメントは、Hardhat・Truffle・Foundry・Brownieなど主要フレームワークを用いたテスト戦略を紹介しています。本記事ではその内容を深掘りし、「何を・どうテストすればよいか」を体系的にまとめます。</p>



<h2 class="wp-block-heading">単体テストの目的と3つの分類</h2>



<h3 class="wp-block-heading">機能検証（Functional&nbsp;Tests）</h3>



<ul class="wp-block-list">
<li>関数の返値・状態変化が仕様どおりか</li>



<li>リバート条件が適切か（<code>require</code>／<code>revert</code>）</li>
</ul>



<h3 class="wp-block-heading">セキュリティ検証（Security&nbsp;Tests）</h3>



<ul class="wp-block-list">
<li>再入可能性・整数オーバーフロー・アクセス制御漏れ</li>



<li>想定外のキャッシュ汚染／ストレージ衝突</li>
</ul>



<h3 class="wp-block-heading">経済設計検証（Economic&nbsp;Tests）</h3>



<ul class="wp-block-list">
<li>金利計算・報酬分配・トークン供給が意図どおりか</li>



<li>oracle操作やフラッシュローン攻撃耐性</li>
</ul>



<h2 class="wp-block-heading">Hardhatで学ぶJavaScript/TypeScriptテスト基礎</h2>



<h3 class="wp-block-heading">セットアップ</h3>



<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="npm init -y
npm i --save-dev hardhat @nomiclabs/hardhat-ethers ethers chai
npx hardhat # 「JavaScriptプロジェクト」を選択" 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: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">init</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-y</span></span>
<span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--save-dev</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">hardhat</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">@nomiclabs/hardhat-ethers</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ethers</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">chai</span></span>
<span class="line"><span style="color: #DCDCAA">npx</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">hardhat</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955"># 「JavaScriptプロジェクト」を選択</span></span></code></pre></div>



<h3 class="wp-block-heading">コントラクト（Lock.sol）</h3>



<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="pragma solidity ^0.8.20;
contract Lock {
  uint public unlockTime;
  constructor(uint _unlockTime) payable {
    unlockTime = _unlockTime;
  }
  function withdraw() external {
    require(block.timestamp &gt;= unlockTime, &quot;locked&quot;);
    payable(msg.sender).transfer(address(this).balance);
  }
}" 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: #C586C0">pragma</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">solidity</span><span style="color: #D4D4D4"> ^0.8.20;</span></span>
<span class="line"><span style="color: #569CD6">contract</span><span style="color: #4EC9B0"> Lock</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">uint</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> unlockTime;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">constructor</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_unlockTime</span><span style="color: #D4D4D4">) payable {</span></span>
<span class="line"><span style="color: #D4D4D4">    unlockTime = _unlockTime;</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">withdraw</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">external</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">require</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">block</span><span style="color: #D4D4D4">.timestamp &gt;= unlockTime, </span><span style="color: #CE9178">&quot;locked&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">payable</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">msg.sender</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">transfer</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">address</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">).balance);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading">単体テスト（test/Lock.ts）</h3>



<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="import { expect } from &quot;chai&quot;;
import { ethers } from &quot;hardhat&quot;;

describe(&quot;Lock&quot;, () =&gt; {
  it(&quot;ロック解除前はrevert&quot;, async () =&gt; {
    const [alice] = await ethers.getSigners();
    const Lock = await ethers.getContractFactory(&quot;Lock&quot;);
    const lock = await Lock.deploy((await ethers.provider.getBlock(&quot;latest&quot;)).timestamp + 60, { value: 1 });
    await expect(lock.withdraw()).to.be.revertedWith(&quot;locked&quot;);
  });

  it(&quot;ロック解除後に送金&quot;, async () =&gt; {
    const [alice] = await ethers.getSigners();
    const Lock = await ethers.getContractFactory(&quot;Lock&quot;);
    const unlockAt = (await ethers.provider.getBlock(&quot;latest&quot;)).timestamp + 60;
    const lock = await Lock.deploy(unlockAt, { value: 1 });
    await ethers.provider.send(&quot;evm_setNextBlockTimestamp&quot;, [unlockAt + 1]);
    await lock.withdraw();
    expect(await ethers.provider.getBalance(lock.address)).to.eq(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: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">expect</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;chai&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;hardhat&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">describe</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Lock&quot;</span><span style="color: #D4D4D4">, () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">it</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;ロック解除前はrevert&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> [</span><span style="color: #4FC1FF">alice</span><span style="color: #D4D4D4">] = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getSigners</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">Lock</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getContractFactory</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Lock&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">lock</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Lock</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">deploy</span><span style="color: #D4D4D4">((</span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">provider</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getBlock</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;latest&quot;</span><span style="color: #D4D4D4">)).</span><span style="color: #9CDCFE">timestamp</span><span style="color: #D4D4D4"> + </span><span style="color: #B5CEA8">60</span><span style="color: #D4D4D4">, { </span><span style="color: #9CDCFE">value:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> });</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">expect</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">lock</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">withdraw</span><span style="color: #D4D4D4">()).</span><span style="color: #9CDCFE">to</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">be</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">revertedWith</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;locked&quot;</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: #DCDCAA">it</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;ロック解除後に送金&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> [</span><span style="color: #4FC1FF">alice</span><span style="color: #D4D4D4">] = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getSigners</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">Lock</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getContractFactory</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Lock&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">unlockAt</span><span style="color: #D4D4D4"> = (</span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">provider</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getBlock</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;latest&quot;</span><span style="color: #D4D4D4">)).</span><span style="color: #9CDCFE">timestamp</span><span style="color: #D4D4D4"> + </span><span style="color: #B5CEA8">60</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">lock</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Lock</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">deploy</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">unlockAt</span><span style="color: #D4D4D4">, { </span><span style="color: #9CDCFE">value:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> });</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">provider</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">send</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;evm_setNextBlockTimestamp&quot;</span><span style="color: #D4D4D4">, [</span><span style="color: #9CDCFE">unlockAt</span><span style="color: #D4D4D4"> + </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">]);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lock</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">withdraw</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">expect</span><span style="color: #D4D4D4">(</span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">provider</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getBalance</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">lock</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">address</span><span style="color: #D4D4D4">)).</span><span style="color: #9CDCFE">to</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">eq</span><span style="color: #D4D4D4">(</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>



<h3 class="wp-block-heading">ポイント</h3>



<ul class="wp-block-list">
<li><code>evm_setNextBlockTimestamp</code>でブロック時間を操作し時間依存ロジックをテスト</li>



<li><code>chai</code>の<code>expect().to.be.revertedWith()</code>でリバート理由まで検証</li>
</ul>



<h2 class="wp-block-heading">Foundryで高速Fuzz&amp;Invariantテスト</h2>



<h3 class="wp-block-heading">インストール</h3>



<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="curl -L https://foundry.paradigm.xyz | bash
foundryup
forge init foundry-demo &amp;&amp; cd foundry-demo" 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: #DCDCAA">curl</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-L</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">https://foundry.paradigm.xyz</span><span style="color: #D4D4D4"> | </span><span style="color: #DCDCAA">bash</span></span>
<span class="line"><span style="color: #DCDCAA">foundryup</span></span>
<span class="line"><span style="color: #DCDCAA">forge</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">init</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">foundry-demo</span><span style="color: #D4D4D4"> &amp;&amp; </span><span style="color: #DCDCAA">cd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">foundry-demo</span></span></code></pre></div>



<h3 class="wp-block-heading">Fuzzテスト例（Counter.t.sol）</h3>



<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="pragma solidity ^0.8.23;
import &quot;forge-std/Test.sol&quot;;

contract Counter {
  uint256 public num;
  function inc(uint256 x) external { num += x; }
}

contract CounterTest is Test {
  Counter c = new Counter();

  function testFuzz_Inc(uint256 x) public {
    vm.assume(x &lt; 1e18);
    uint256 before = c.num();
    c.inc(x);
    assertEq(c.num(), before + x);
  }
}" 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: #C586C0">pragma</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">solidity</span><span style="color: #D4D4D4"> ^0.8.23;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;forge-std/Test.sol&quot;</span><span style="color: #D4D4D4">;</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"> num;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">inc</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">uint256</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">external</span><span style="color: #D4D4D4"> { num += x; }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">contract</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CounterTest</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">is</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Test</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  Counter c = </span><span style="color: #C586C0">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Counter</span><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">testFuzz_Inc</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">uint256</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">x</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">    vm.</span><span style="color: #DCDCAA">assume</span><span style="color: #D4D4D4">(x &lt; </span><span style="color: #B5CEA8">1e18</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"> before = c.</span><span style="color: #DCDCAA">num</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    c.</span><span style="color: #DCDCAA">inc</span><span style="color: #D4D4D4">(x);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">assertEq</span><span style="color: #D4D4D4">(c.</span><span style="color: #DCDCAA">num</span><span style="color: #D4D4D4">(), before + x);</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>forge test -vvvv</code>は100件以上のランダム入力で検証</li>



<li><code>vm.assume</code>で現実的な入力に制限し不要なガス浪費を抑制</li>
</ul>



<h3 class="wp-block-heading">Invariantテスト</h3>



<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="contract Invariant is Test {
  Counter c = new Counter();

  function invariant_sumNotOverflow() public {
    assertLe(c.num(), type(uint256).max / 2);
  }
}" 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: #569CD6">contract</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Invariant</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">is</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Test</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  Counter c = </span><span style="color: #C586C0">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Counter</span><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">invariant_sumNotOverflow</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">    </span><span style="color: #DCDCAA">assertLe</span><span style="color: #D4D4D4">(c.</span><span style="color: #DCDCAA">num</span><span style="color: #D4D4D4">(), </span><span style="color: #569CD6">type</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">uint256</span><span style="color: #D4D4D4">).max / </span><span style="color: #B5CEA8">2</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>



<p class="wp-block-paragraph">Foundryは状態を保存しながら数千回ランダムシーケンスを実行、インバリアント破壊ケースを自動検出します。</p>



<h2 class="wp-block-heading">Brownie（Python）でのテスト&amp;カバレッジ</h2>



<h3 class="wp-block-heading">インストール</h3>



<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="pip install eth-brownie
brownie init" 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: #DCDCAA">pip</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">eth-brownie</span></span>
<span class="line"><span style="color: #DCDCAA">brownie</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">init</span></span></code></pre></div>



<h3 class="wp-block-heading">PyTest記法</h3>



<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="import pytest
def test_withdraw(accounts, Lock):
    alice = accounts[0]
    lock = Lock.deploy(0, {'from': alice, 'value': '1 ether'})
    with pytest.reverts(&quot;locked&quot;):
        lock.withdraw({'from': alice})" 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: #C586C0">import</span><span style="color: #D4D4D4"> pytest</span></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">test_withdraw</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">accounts</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">Lock</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    alice = accounts[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">    lock = Lock.deploy(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, {</span><span style="color: #CE9178">&#39;from&#39;</span><span style="color: #D4D4D4">: alice, </span><span style="color: #CE9178">&#39;value&#39;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;1 ether&#39;</span><span style="color: #D4D4D4">})</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">with</span><span style="color: #D4D4D4"> pytest.reverts(</span><span style="color: #CE9178">&quot;locked&quot;</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">        lock.withdraw({</span><span style="color: #CE9178">&#39;from&#39;</span><span style="color: #D4D4D4">: alice})</span></span></code></pre></div>



<h3 class="wp-block-heading">カバレッジ測定</h3>



<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="brownie test --coverage" 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: #DCDCAA">brownie</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">test</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--coverage</span></span></code></pre></div>



<p class="wp-block-paragraph">HTMLレポートで行単位の未テスト箇所を可視化。Solidityファイルが赤色ならテスト追加が必要です。</p>



<h2 class="wp-block-heading">モック &amp; スタブ技法</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>シナリオ</th><th>手法</th><th>フレームワーク</th></tr></thead><tbody><tr><td>Oracle価格を固定</td><td>MockAggregatorV3をデプロイ</td><td>Hardhat/Foundry</td></tr><tr><td>ERC20転送成功/失敗</td><td>FakeTokenで<code>transfer</code>を戻り値操作</td><td>Hardhat</td></tr><tr><td>Chainlink&nbsp;VRF</td><td><code>vm.roll</code>で乱数固定</td><td>Foundry</td></tr></tbody></table></div></figure>



<p class="wp-block-paragraph">外部コントラクトをモック化することで、単体テストは<strong>純粋関数的</strong>になり失敗箇所特定が迅速になります。</p>



<h2 class="wp-block-heading">CI/CD統合ベストプラクティス</h2>



<ol class="wp-block-list">
<li><strong>GitHub Actions</strong>で<code>forge test</code>や<code>npx hardhat test</code>を実行</li>



<li>カバレッジ閾値（例:90%）未満ならPRブロック</li>



<li><code>actions/cache</code>でFoundryキャッシュ・node_modulesを高速化</li>



<li>Solidity静的解析（Slither）・Lint（Solhint）を並列ジョブで追加</li>



<li>テスト通過後のみ<code>hardhat-deploy</code>または<code>forge script</code>でTestnetへ自動デプロイ</li>
</ol>



<h2 class="wp-block-heading">よくある落とし穴と対策</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>問題</th><th>症状</th><th>対策</th></tr></thead><tbody><tr><td>ForkテストのRPC制限</td><td>Alchemy/Etherscanエラー</td><td><code>ALCHEMY_MAX_CALL=30</code>に増枠プラン・<code>--fork-block-number</code>固定</td></tr><tr><td>フラッシュローン攻撃検出漏れ</td><td>テストが単一Tx</td><td>Hardhat&nbsp;Networkで<code>autoMine=false</code>にし複数呼び出し</td></tr><tr><td>時間依存テストの不安定</td><td>CIで偶発fail</td><td>ブロックタイムを固定＆<code>evm_increaseTime</code> instead of <code>sleep</code></td></tr></tbody></table></div></figure>



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



<p class="wp-block-paragraph">スマートコントラクトの単体テストは<strong>機能・セキュリティ・経済設計</strong>の3軸を網羅する必要があります。Remixで概念を掴み、HardhatやFoundryで高速なローカルテストを構築し、BrownieやPythonの資産を活かして統計解析を行う――この多段構成が2025年現在の“最強パターン”です。<br>CIにテストと静的解析を組み込み、カバレッジとFuzzingで抜け漏れを潰せば、メインネットデプロイ後に重大バグが見つかるリスクを大幅に下げられます。この記事を参考に、まずは<code>forge init</code>や<code>npx hardhat</code>を実行し、あなたのコントラクトを徹底的に叩き上げてみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-unit-test/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>イーサリアム開発IDE──RemixからFoundryまで比較し最適な環境を選ぶ</title>
		<link>https://techgrowup.net/blockchain-ethurium-ide/</link>
					<comments>https://techgrowup.net/blockchain-ethurium-ide/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Fri, 18 Apr 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[Brownie]]></category>
		<category><![CDATA[Foundry]]></category>
		<category><![CDATA[Hardhat]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Remix]]></category>
		<category><![CDATA[Solidity]]></category>
		<category><![CDATA[Truffle]]></category>
		<category><![CDATA[VS Code]]></category>
		<category><![CDATA[イーサリアム開発]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2788</guid>

					<description><![CDATA[はじめに イーサリアムのスマートコントラクト開発は数年前より格段に多様化しました。オンラインで学習できるRemixから、高度なCI/CDに対応したHardhat＋VS Code、超高速ビルドのFoundryまで、用途に応 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">イーサリアムのスマートコントラクト開発は数年前より格段に多様化しました。オンラインで学習できる<strong>Remix</strong>から、高度なCI/CDに対応した<strong>Hardhat＋VS Code</strong>、超高速ビルドの<strong>Foundry</strong>まで、用途に応じたIDE（Integrated Development Environment）が選択できます。本記事ではEthereum.orgの「IDEs」ドキュメントを基に、主要ツールの特徴・インストール手順・実践コード例を詳しく紹介し、5“自分に最適な開発環境”を選ぶヒントを提供します。</p>



<h2 class="wp-block-heading">Remix&nbsp;IDE ―― ブラウザだけで完結する学習とプロトタイプの王道</h2>



<h3 class="wp-block-heading">特徴</h3>



<ul class="wp-block-list">
<li><strong>インストール不要</strong>：ブラウザを開くだけでSolidityエディタ・コンパイラ・デプロイUIが揃う</li>



<li><strong>プラグインアーキテクチャ</strong>：Slither解析、Gas Profiler、Sol Hintなどボタン一つで拡張</li>



<li><strong>ネットワーク接続</strong>：MetaMask経由でテストネット／メインネットに直接デプロイ可能</li>
</ul>



<h3 class="wp-block-heading">使いどころ</h3>



<ul class="wp-block-list">
<li>スマートコントラクトの<strong>チュートリアル学習</strong></li>



<li>ハッカソンの短時間プロトタイプ</li>



<li>セキュリティ監査前の<strong>事前チェック</strong>（Slither &amp; MythX Plugin）</li>
</ul>



<h3 class="wp-block-heading">Tips</h3>



<p class="wp-block-paragraph">「Settings&nbsp;→&nbsp;Solidity&nbsp;Compiler」で自動コンパイルをOFFにすると、GasProfiler実行時のブラウザ負荷を抑えられます。</p>



<h2 class="wp-block-heading">Hardhat + VS&nbsp;Code ―― 拡張性と自動化に優れた“実務標準”</h2>



<h3 class="wp-block-heading">なぜHardhatが選ばれるか</h3>



<ol class="wp-block-list">
<li><strong>JS/TS API</strong> が充実し、ethers.jsと統合しやすい</li>



<li><strong>プラグイン豊富</strong>：Gas Reporter、Typechain、Tenderly Verify 等</li>



<li><strong>Hardhat Network</strong> によるフォーク機能でメインネット状態をローカル再現</li>
</ol>



<h3 class="wp-block-heading">環境構築</h3>



<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="mkdir myToken &amp;&amp; cd $_
npm init -y
npm i --save-dev hardhat @nomiclabs/hardhat-ethers ethers
npx hardhat                         # プロジェクト生成" 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: #DCDCAA">mkdir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">myToken</span><span style="color: #D4D4D4"> &amp;&amp; </span><span style="color: #DCDCAA">cd</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">$_</span></span>
<span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">init</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-y</span></span>
<span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--save-dev</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">hardhat</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">@nomiclabs/hardhat-ethers</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ethers</span></span>
<span class="line"><span style="color: #DCDCAA">npx</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">hardhat</span><span style="color: #D4D4D4">                         </span><span style="color: #6A9955"># プロジェクト生成</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>hardhat.config.ts</code></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="import { HardhatUserConfig } from &quot;hardhat/config&quot;;
import &quot;@nomiclabs/hardhat-ethers&quot;;
const config: HardhatUserConfig = {
  solidity: &quot;0.8.23&quot;,
  networks: {
    sepolia: {
      url: &quot;https://sepolia.infura.io/v3/&lt;API_KEY&gt;&quot;,
      accounts: [process.env.PRIVATE_KEY as string]
    }
  }
};
export default config;" 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: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">HardhatUserConfig</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;hardhat/config&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;@nomiclabs/hardhat-ethers&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">config</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">HardhatUserConfig</span><span style="color: #D4D4D4"> = {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">solidity:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;0.8.23&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">networks:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">sepolia:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">url:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;https://sepolia.infura.io/v3/&lt;API_KEY&gt;&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">accounts:</span><span style="color: #D4D4D4"> [</span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">PRIVATE_KEY</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">string</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>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<p class="wp-block-paragraph">デプロイスクリプト</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="async function main() {
  const Token = await ethers.getContractFactory(&quot;ERC20PresetMinterPauser&quot;);
  const token = await Token.deploy(&quot;Demo&quot;, &quot;DMT&quot;);
  await token.deployed();
  console.log(&quot;Token:&quot;, token.address);
}
main();" 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: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">Token</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getContractFactory</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;ERC20PresetMinterPauser&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">token</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Token</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">deploy</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Demo&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;DMT&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">token</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">deployed</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">log</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Token:&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">token</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">address</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">();</span></span></code></pre></div>



<h3 class="wp-block-heading">VS&nbsp;Code拡張</h3>



<ul class="wp-block-list">
<li><strong>solidity</strong>：シンタックスハイライト＋Lint</li>



<li><strong>Hardhat Runner</strong>：タスクをGUI実行</li>



<li><strong>Foundry for VS Code</strong>：後述環境と併用可能</li>
</ul>



<h2 class="wp-block-heading">Foundry ―― 超高速Rust実装で開発フローを刷新</h2>



<h3 class="wp-block-heading">コアツール</h3>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>コマンド</th><th>機能</th></tr></thead><tbody><tr><td><code>forge</code></td><td>ビルド・テスト・デプロイ（SolidityネイティブUnitTest）</td></tr><tr><td><code>cast</code></td><td>CLIでチェーンと対話</td></tr><tr><td><code>anvil</code></td><td>高速EVMローカルノード（フォーク/チェッカブル）</td></tr></tbody></table></div></figure>



<h3 class="wp-block-heading">インストール</h3>



<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="curl -L https://foundry.paradigm.xyz | bash
foundryup" 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: #DCDCAA">curl</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-L</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">https://foundry.paradigm.xyz</span><span style="color: #D4D4D4"> | </span><span style="color: #DCDCAA">bash</span></span>
<span class="line"><span style="color: #DCDCAA">foundryup</span></span></code></pre></div>



<h3 class="wp-block-heading">テスト例</h3>



<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="pragma solidity ^0.8.19;
import &quot;forge-std/Test.sol&quot;;
import &quot;../src/Counter.sol&quot;;

contract CounterTest is Test {
    Counter c;
    function setUp() public { c = new Counter(); }
    function testInc() public {
        c.inc();
        assertEq(c.number(), 1);
    }
}" 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: #C586C0">pragma</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">solidity</span><span style="color: #D4D4D4"> ^0.8.19;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;forge-std/Test.sol&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;../src/Counter.sol&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">contract</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CounterTest</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">is</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Test</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    Counter c;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setUp</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> { c = </span><span style="color: #C586C0">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Counter</span><span style="color: #D4D4D4">(); }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">testInc</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">        c.</span><span style="color: #DCDCAA">inc</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">assertEq</span><span style="color: #D4D4D4">(c.</span><span style="color: #DCDCAA">number</span><span style="color: #D4D4D4">(), </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 style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>forge test -vv</code> 実行で1000&nbsp;tx規模でも数秒で完走。CI時間を大幅圧縮できます。</p>



<h3 class="wp-block-heading">選定指針</h3>



<ul class="wp-block-list">
<li>大規模テスト／Fuzz／Property-Based Testing重視→Foundry</li>



<li>TypeScriptフロント統合やmigrations文化維持→Hardhat</li>
</ul>



<h2 class="wp-block-heading">Truffle &amp; Ganache ―― いまでも有効なクラシックスタック</h2>



<ul class="wp-block-list">
<li><strong>Truffle</strong> はmigrationスクリプト文化とチュートリアルの豊富さで学習者に人気</li>



<li><strong>Ganache</strong> はクリックだけでローカルチェーンを起動可能（GUI版は22年で開発終了、CLIは存続）</li>



<li>Hardhat/F oundry登場でメインストリームからは離れつつも、Legacy DAppの保守やOpenZeppelin Upgradesプラグインとの相性で根強い需要があります。</li>
</ul>



<h2 class="wp-block-heading">WebIDE &amp; SaaS型IDEの新潮流</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>プラットフォーム</th><th>特徴</th><th>料金モデル</th></tr></thead><tbody><tr><td>Ethereum&nbsp;Studio</td><td>Remixをクラウド保存＆チームコラボ対応</td><td>無料</td></tr><tr><td>StackBlitz&nbsp;Web3</td><td>TypeScript＋HardhatをブラウザVMで実行</td><td>Freemium</td></tr><tr><td>Gitpod Web3</td><td>devcontainerにFoundry/Hardhatをプリセット</td><td>従量課金</td></tr></tbody></table></div></figure>



<p class="wp-block-paragraph">企業チームは<strong>Gitpod＋Foundry＋Anvil</strong>でエフェメラル環境をCIに組み込むケースが増えています。</p>



<h2 class="wp-block-heading">IDE選定チャート</h2>



<ol class="wp-block-list">
<li><strong>学習フェーズ</strong>
<ul class="wp-block-list">
<li>ブラウザ完結 → Remix</li>



<li>Python好き → Brownie</li>
</ul>
</li>



<li><strong>PoC〜ハッカソン</strong>
<ul class="wp-block-list">
<li>迅速なUI：Remix or Hardhat local</li>
</ul>
</li>



<li><strong>商用開発</strong>
<ul class="wp-block-list">
<li>高速テスト・CI：Foundry</li>



<li>フロントJS統合：Hardhat</li>
</ul>
</li>



<li><strong>研究・監査</strong>
<ul class="wp-block-list">
<li>Fuzz／Invariant：Foundry</li>



<li>Formal Verification：Remix Slither Plugin＋MythX</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading">ベストプラクティスと実用Tips</h2>



<ul class="wp-block-list">
<li><strong>VS Code Remote Containers</strong>でHardhatとFoundryを両立</li>



<li><strong>Slither + Forge</strong>：<code>forge coverage</code>でカバレッジ生成→Slither解析を一気通貫</li>



<li><strong>Prettier-plugin-solidity</strong>でコードフォーマットを統一</li>



<li><strong>GitHub Actions</strong>：<code>actions/cache</code>に<code>.foundry/cache</code>を指定しCI高速化</li>



<li><strong>Tenderly</strong>でトランザクションシミュレーションを自動コメント（PRレビュー品質向上）</li>
</ul>



<h2 class="wp-block-heading">今後の展望</h2>



<ul class="wp-block-list">
<li><strong>Foundry v2</strong>：SwayやMoveなどEVM外VMへのクロスコンパイル計画</li>



<li><strong>Hardhat Profiler</strong>：AIベースGas最適提案機能をベータ搭載</li>



<li><strong>Remix Desktop</strong>：Electron版がRoadmapに追加、オフラインでも学習環境を維持</li>
</ul>



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



<p class="wp-block-paragraph">イーサリアム開発IDEは「学習特化のRemix」「TypeScriptエコシステムと親和性が高いHardhat」「超高速・高機能のFoundry」という3大トレンドを形成しつつ、Truffle/Brownie/クラウドIDEがニッチを補完しています。<br>自分の<strong>言語嗜好・チーム規模・CI要件</strong>を整理し、最適なIDEを選択することがプロダクト成功への第一歩です。本記事を参考に、ぜひローカルで<code>npx hardhat</code>や<code>forge init</code>を実行し、最適な開発体験を手に入れてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-ethurium-ide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ハイブリッド・スマートコントラクト完全ガイド──Chainlinkで実現するオンチェーン×オフチェーン連携の仕組みと実装法</title>
		<link>https://techgrowup.net/blockchain-hybrid-contract-2/</link>
					<comments>https://techgrowup.net/blockchain-hybrid-contract-2/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Thu, 17 Apr 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[CCIP]]></category>
		<category><![CDATA[Chainlink]]></category>
		<category><![CDATA[DeFi]]></category>
		<category><![CDATA[VRF]]></category>
		<category><![CDATA[オフチェーンコンピュート]]></category>
		<category><![CDATA[オラクル]]></category>
		<category><![CDATA[ハイブリッドスマートコンタクト]]></category>
		<category><![CDATA[保険]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2785</guid>

					<description><![CDATA[はじめに スマートコントラクトは「コードは法である」という概念を広めましたが、ブロックチェーン単体では外部データを取得できないという根源的な制約があります。価格フィード、天候情報、乱数、決済API――あらゆる現実世界の情 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">スマートコントラクトは「コードは法である」という概念を広めましたが、ブロックチェーン単体では<strong>外部データを取得できない</strong>という根源的な制約があります。価格フィード、天候情報、乱数、決済API――あらゆる現実世界の情報はオンチェーンから隔離されています。そこで登場したのが<strong>ハイブリッド・スマートコントラクト</strong>です。Chainlinkネットワークが提供する分散オラクルを介し、オンチェーンの確定性とオフチェーンの柔軟性を融合。DeFiやNFT、保険、ゲーム、サプライチェーンなど多彩なユースケースを実用段階へと押し上げています。</p>



<p class="wp-block-paragraph">本稿ではChainlink&nbsp;Education&nbsp;Hubの記事を参考に、ハイブリッド・スマートコントラクトの概念・技術スタック・開発フロー・ユースケースを深掘りし、最後に課題と将来展望を整理します。</p>



<h2 class="wp-block-heading">ハイブリッド・スマートコントラクトとは</h2>



<h3 class="wp-block-heading">オンチェーンとオフチェーンの役割分担</h3>



<ul class="wp-block-list">
<li><strong>オンチェーン層</strong>：不変性・検証可能性・自動執行（例：Solidity/EVM）</li>



<li><strong>オフチェーン層</strong>：データ取得・計算負荷の高い処理・API連携（例：Chainlink Oracle Network）<br>ハイブリッド化によって、ブロックチェーンは<strong>外部状態に反応するプログラム</strong>へ進化します。</li>
</ul>



<h3 class="wp-block-heading">Chainlinkの位置づけ</h3>



<p class="wp-block-paragraph">Chainlinkは**分散オラクルネットワーク（DON）**として、データ送信者（ノード）を複数立ててシグネチャを集約し、改ざん耐性を確保。さらにVRF（乱数）、Automation（定期実行）、CCIP（クロスチェーン通信）といった拡張モジュールを提供しています。</p>



<h2 class="wp-block-heading">ハイブリッド・アーキテクチャを図解</h2>



<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="graph TD
  A[ユーザー/フロントエンド] --&gt; B[スマートコントラクト&lt;br&gt;(オンチェーン)]
  B -- Request --&gt; C[Chainlink Oracle Node&lt;br&gt;(オフチェーン)]
  C -- Fetch --&gt; D[外部API/データソース]
  C -- Response --&gt; B
  B --&gt; E[状態更新・決済]" 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: #C586C0">graph</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">TD</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">A</span><span style="color: #C586C0">[</span><span style="color: #CE9178">ユーザー/フロントエンド</span><span style="color: #C586C0">]</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">--&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">B</span><span style="color: #C586C0">[</span><span style="color: #CE9178">スマートコントラクト&lt;br&gt;</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">オンチェーン</span><span style="color: #C586C0">)]</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">B </span><span style="color: #C586C0">--</span><span style="color: #CE9178"> Request </span><span style="color: #C586C0">--&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">C</span><span style="color: #C586C0">[</span><span style="color: #CE9178">Chainlink Oracle Node&lt;br&gt;</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">オフチェーン</span><span style="color: #C586C0">)]</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">C </span><span style="color: #C586C0">--</span><span style="color: #CE9178"> Fetch </span><span style="color: #C586C0">--&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">D</span><span style="color: #C586C0">[</span><span style="color: #CE9178">外部API/データソース</span><span style="color: #C586C0">]</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">C </span><span style="color: #C586C0">--</span><span style="color: #CE9178"> Response </span><span style="color: #C586C0">--&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">B</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">B </span><span style="color: #C586C0">--&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">E</span><span style="color: #C586C0">[</span><span style="color: #CE9178">状態更新</span><span style="color: #D4D4D4">・</span><span style="color: #CE9178">決済</span><span style="color: #C586C0">]</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>Request</strong>：コントラクトがOracle Requestを発火</li>



<li><strong>Fetch</strong>：ノードがHTTP/IoT/企業DBからデータ取得</li>



<li><strong>Response</strong>：検証後にアグリゲート値をオンチェーンへ返却</li>



<li><strong>状態更新</strong>：自動的に資金移動・NFT発行などを実行</li>
</ul>



<h2 class="wp-block-heading">コーディング実践：価格フィード&amp;自動決済</h2>



<h3 class="wp-block-heading">Solidityサンプル</h3>



<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.19;
import &quot;@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol&quot;;

contract AutoPay {
    AggregatorV3Interface internal priceFeed;
    address public owner;
    uint256 public usdThreshold = 100 * 1e8; // $100

    constructor(address _feed) {
        priceFeed = AggregatorV3Interface(_feed);
        owner = msg.sender;
    }

    // Chainlink Automation 対応 keepers-compatible
    function checkUpkeep(bytes calldata)
        external
        view
        returns (bool upkeepNeeded, bytes memory)
    {
        (,int price,,,) = priceFeed.latestRoundData();
        upkeepNeeded = uint256(price) &gt;= usdThreshold;
    }

    function performUpkeep(bytes calldata) external {
        (bool ok,) = owner.call{value: address(this).balance}(&quot;&quot;);
        require(ok, &quot;transfer failed&quot;);
    }

    receive() external payable {}
}" 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.19;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">contract</span><span style="color: #4EC9B0"> AutoPay</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    AggregatorV3Interface </span><span style="color: #569CD6">internal</span><span style="color: #D4D4D4"> priceFeed;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">address</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> owner;</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"> usdThreshold = </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">1e8</span><span style="color: #D4D4D4">; </span><span style="color: #6A9955">// $100</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">address</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_feed</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        priceFeed = </span><span style="color: #DCDCAA">AggregatorV3Interface</span><span style="color: #D4D4D4">(_feed);</span></span>
<span class="line"><span style="color: #D4D4D4">        owner = </span><span style="color: #569CD6">msg.sender</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: #6A9955">// Chainlink Automation 対応 keepers-compatible</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">checkUpkeep</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">bytes</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">calldata</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">external</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">view</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">returns</span><span style="color: #D4D4D4"> (</span><span style="color: #4EC9B0">bool</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">upkeepNeeded</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">bytes</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">memory</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 style="color: #4EC9B0">int</span><span style="color: #D4D4D4"> price,,,) = priceFeed.</span><span style="color: #DCDCAA">latestRoundData</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        upkeepNeeded = </span><span style="color: #4EC9B0">uint256</span><span style="color: #D4D4D4">(price) &gt;= usdThreshold;</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">performUpkeep</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">bytes</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">calldata</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">external</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        (</span><span style="color: #4EC9B0">bool</span><span style="color: #D4D4D4"> ok,) = owner.call{value: </span><span style="color: #4EC9B0">address</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">).balance}(</span><span style="color: #CE9178">&quot;&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">require</span><span style="color: #D4D4D4">(ok, </span><span style="color: #CE9178">&quot;transfer failed&quot;</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: #DCDCAA">receive</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">external</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">payable</span><span style="color: #D4D4D4"> {}</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>AggregatorV3Interface</strong>でETH/USD価格を取得</li>



<li>価格が$100以上なら<code>performUpkeep</code>で自動送金</li>



<li><strong>Chainlink Automation</strong>が一定間隔で<code>checkUpkeep</code>を呼び出し、条件成立時のみ実行</li>
</ul>



<h2 class="wp-block-heading">ユースケース深掘り</h2>



<h3 class="wp-block-heading">DeFi：動的金利・担保評価</h3>



<p class="wp-block-paragraph">MakerDAOはChainlink価格フィードで担保価値をリアルタイム評価し、自動清算を実装。Aave&nbsp;V3ではクロスチェーンポータルにChainlink&nbsp;CCIPを組み込み、流動性を迅速に移動。</p>



<h3 class="wp-block-heading">保険：天候デリバティブ</h3>



<p class="wp-block-paragraph">ArbolやEtheriscは降水量APIをChainlink経由で取得し、農家にパラメトリック保険金を自動支払い。書類確認不要で災害後数分で補償が完了。</p>



<h3 class="wp-block-heading">ゲーム &amp; NFT</h3>



<p class="wp-block-paragraph">Randomnessが不可欠なオンチェーンゲームは<strong>Chainlink&nbsp;VRF</strong>で偏りのない乱数を生成。例：PoolTogether、Axie&nbsp;Infinity&nbsp;Origin（ガチャ確率検証）。</p>



<h3 class="wp-block-heading">サプライチェーン &amp; RWA</h3>



<p class="wp-block-paragraph">IoTセンサー値をオラクル経由で投下し、輸送温度逸脱時に自動決済。金・不動産トークン化では公証役場APIを用い所有権移転をスマートコントラクトで実行。</p>



<h2 class="wp-block-heading">セキュリティ設計とベストプラクティス</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>リスク</th><th>対策</th></tr></thead><tbody><tr><td>シングルポイントOracle</td><td>DONで多数ノードを使用し閾値署名</td></tr><tr><td>フラッシュローン攻撃</td><td>priceFeedのlatestRoundDataだけでなく<code>answeredInRound</code>を検証</td></tr><tr><td>Gas上限オーバー</td><td>Automationの<code>gasLimit</code>設定、再エントラント対策</td></tr><tr><td>メッセージ偽装</td><td>CCIPのVerifiedChannelsをホワイトリスト管理</td></tr></tbody></table></div></figure>



<p class="wp-block-paragraph">テストネット（Sepolia + Chainlink&nbsp;Testnet）でシナリオテストを行い、<code>chainlink-automation/compatible</code>ライブラリで標準実装を活用すると安全性が向上します。</p>



<h2 class="wp-block-heading">クロスチェーン時代のキーテクノロジー：CCIP</h2>



<p class="wp-block-paragraph">Chainlink&nbsp;CCIPは「ブロックチェーン間のTCP/IP」を標榜。送信側コントラクトが<code>sendMessage</code>でデータをPOSTし、受信側がcallbackでハンドリング。ルーティングはDONが担うため、開発者はエンドポイントだけ意識すればOKです。既にAave、Synthetix、GMXが統合を表明しています。</p>



<h2 class="wp-block-heading">実装フローまとめ</h2>



<ol class="wp-block-list">
<li><strong>Oracle選定</strong>：価格フィード、VRF、Automation、CCIPを必要に応じ組み合わせ</li>



<li><strong>テストネット検証</strong>：Sepolia＋Chainlink Sepolia feeds</li>



<li><strong>ガス最適化</strong>：View関数で軽量化、Automation頻度を調整</li>



<li><strong>監査 &amp; バグバウンティ</strong>：Chainlink BUILDプログラム加入で監査助成を受ける</li>



<li><strong>メインネットデプロイ</strong>：ETH、Polygon、BNB Chainなど複数同時展開</li>



<li><strong>運用モニタリング</strong>：Keepersログ、DON稼働状況、イベントアラートをGrafanaで可視化</li>
</ol>



<h2 class="wp-block-heading">課題と今後の展望</h2>



<ul class="wp-block-list">
<li><strong>オフチェーン計算コスト</strong>：大型AIモデル実行には別途「Chainlink Functions」やDecentralized Cloudが不可欠</li>



<li><strong>データ可用性</strong>：観測国やAPI停止リスクをマルチソース化で緩和</li>



<li><strong>法規制</strong>：RWAトークンではKYC/AMLレイヤー統合が必須</li>



<li><strong>量子耐性</strong>：長期的にはポスト量子暗号をDON署名に導入予定</li>
</ul>



<p class="wp-block-paragraph">Chainlinkは**DECO（プライバシーオラクル）<strong>や</strong>FSS（Fair&nbsp;Sequencing）**によりメフメカを拡張し、Web2データの信頼橋渡しを強化していく計画です。</p>



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



<p class="wp-block-paragraph">ハイブリッド・スマートコントラクトはオンチェーン自動執行とオフチェーン情報を結び付け、ブロックチェーンのユースケースを“金融の枠”を超えて現実世界へ広げました。Chainlinkが提供する分散オラクルやVRF、Automation、CCIPを組み合わせれば、<strong>価格連動型DeFi、乱数駆動NFT、保険自動払出、クロスチェーン流動性移転</strong>といった高度なアプリが実用レベルで構築できます。</p>



<p class="wp-block-paragraph">開発者はまずテストネットでオラクル呼び出しを試し、AutomationやCCIPで機能を広げてみてください。ハイブリッド・スマートコントラクトは「ブロックチェーンがリアルワールドとシームレスにつながる未来」への第一歩です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-hybrid-contract-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Moonbeamが切り開くクロスチェーン時代──ユースケース・技術解説・開発手順まとめ</title>
		<link>https://techgrowup.net/blockchain-moonbeam-usecase/</link>
					<comments>https://techgrowup.net/blockchain-moonbeam-usecase/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Thu, 17 Apr 2025 11:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[Axelar]]></category>
		<category><![CDATA[DeFi]]></category>
		<category><![CDATA[EVM互換]]></category>
		<category><![CDATA[LayerZero]]></category>
		<category><![CDATA[Moonbeam]]></category>
		<category><![CDATA[Polkadot]]></category>
		<category><![CDATA[RWA]]></category>
		<category><![CDATA[Wormhole]]></category>
		<category><![CDATA[クロスチェーン]]></category>
		<category><![CDATA[ゲーム]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2781</guid>

					<description><![CDATA[はじめに ブロックチェーンは“鎖”という言葉どおり本来は独立したネットワークとして設計されています。しかし2024年以降、ユーザーはイーサリアム・BSC・Solana・Polkadotなど複数チェーンを同時に利用するのが [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">ブロックチェーンは“鎖”という言葉どおり本来は独立したネットワークとして設計されています。しかし2024年以降、ユーザーはイーサリアム・BSC・Solana・Polkadotなど複数チェーンを同時に利用するのが当たり前となり、「チェーンの壁」はUXの大きな障害になっています。<strong>Moonbeam</strong>はPolkadot上でEVM互換を保ちながら、<strong>クロスチェーン接続</strong>をネイティブ機能として提供し、マルチチェーン時代のハブ的存在を狙うレイヤー1です。<br>公式のユースケースページによると、Moonbeamは<strong>Cross‑Chain Connectivity・DeFi・Gaming・Real‑World Assets（RWA）・Emerging Markets</strong>の5分野に注力し、多数の実運用例が誕生しています。この記事では各ユースケースを深堀りしつつ、開発者がMoonbeam上で“チェーン横断DApp”を構築する方法を解説します。</p>



<h2 class="wp-block-heading">Moonbeamの特徴とアーキテクチャ</h2>



<h3 class="wp-block-heading">完全EVM互換とPolkadotリレーセキュリティ</h3>



<p class="wp-block-paragraph">MoonbeamはSubstrateで構築された<strong>パラチェーン</strong>でありながら、Solidityバイトコードをそのまま実行できます。イーサリアムで慣れ親しんだHardhat/Truffleツールを変更なく使えるため、開発者の学習コストは最小限です。また最終的なセキュリティはPolkadotリレーチェーンが担保し、スロットリース方式で資金をロックする必要がない点もプロジェクトに好まれています。</p>



<h3 class="wp-block-heading">クロスチェーン・メッセージングの集約ハブ</h3>



<p class="wp-block-paragraph">Moonbeamは<strong>Axelar・Wormhole・LayerZero・Hyperlane・XCM・Glacis</strong>など主要ブリッジ／GMP（General&nbsp;Message&nbsp;Passing）を公式にサポートし、統合的APIを提供しています。これによりアプリ側からは「Moonbeamで送受信すれば他チェーンへ伝播」という単一フローで実装できるのが大きな利点です。&nbsp;</p>



<h2 class="wp-block-heading">ユースケース1：クロスチェーン接続アプリ</h2>



<h3 class="wp-block-heading">仕組み</h3>



<p class="wp-block-paragraph">“Connected Contracts”とは、ムーンビーム上のコントラクトが裏側で他チェーンの資産や状態を読み書きし、ユーザーには単一UIとして見せる仕組みです。Axelar/LayerZeroのGMPを使い、メッセージとトークンを同時ルーティングできます。</p>



<h3 class="wp-block-heading">具体例</h3>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>プロジェクト</th><th>概要</th><th>他チェーン連携</th></tr></thead><tbody><tr><td><strong>Prime Protocol</strong></td><td>クロスチェーン貸借</td><td>ETH/BSC/Polygon 資産をMoonbeamで担保参照</td></tr><tr><td><strong>Beamswap&nbsp;Warp</strong></td><td>DEX＋カスタムブリッジ</td><td>Arb, OP, BSC へ即時USDC転送</td></tr><tr><td><strong>Polynomial&nbsp;Connect</strong></td><td>オプションAMM</td><td>ETHの建玉とDOTの清算を一括管理</td></tr></tbody></table></div></figure>



<h3 class="wp-block-heading">コードサンプル（LayerZero）</h3>



<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="// LZEndpoint on Moonbeam
ILayerZeroEndpoint endpoint = 
   ILayerZeroEndpoint(0x000...);

// 他チェーンへメッセージ送信
function xTransfer(address to, uint256 amount, uint16 dstChainId) external {
    bytes memory payload = abi.encode(to, amount);
    endpoint.send{value:msg.value}(
        dstChainId,
        abi.encodePacked(dstApp), // 宛先
        payload,
        payable(msg.sender),
        address(0x0),
        bytes(&quot;&quot;)                 // adapter params
    );
}" 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">// LZEndpoint on Moonbeam</span></span>
<span class="line"><span style="color: #D4D4D4">ILayerZeroEndpoint endpoint = </span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #DCDCAA">ILayerZeroEndpoint</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0x000</span><span style="color: #D4D4D4">...);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// 他チェーンへメッセージ送信</span></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">xTransfer</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">address</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">to</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">uint256</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">amount</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">uint16</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dstChainId</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">external</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">bytes</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">memory</span><span style="color: #D4D4D4"> payload = </span><span style="color: #569CD6">abi</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">encode</span><span style="color: #D4D4D4">(to, amount);</span></span>
<span class="line"><span style="color: #D4D4D4">    endpoint.send{value:</span><span style="color: #569CD6">msg</span><span style="color: #D4D4D4">.value}(</span></span>
<span class="line"><span style="color: #D4D4D4">        dstChainId,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">abi</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">encodePacked</span><span style="color: #D4D4D4">(dstApp), </span><span style="color: #6A9955">// 宛先</span></span>
<span class="line"><span style="color: #D4D4D4">        payload,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">payable</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">msg.sender</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #4EC9B0">address</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0x0</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #4EC9B0">bytes</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;&quot;</span><span style="color: #D4D4D4">)                 </span><span style="color: #6A9955">// adapter params</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">LayerZeroのおかげで送り先はチェーンIDだけ指定すればよく、ブリッジロジックを個別実装する必要がありません。</p>



<h2 class="wp-block-heading">ユースケース2：DeFiハブ</h2>



<p class="wp-block-paragraph">Moonbeamは早期からDEX・レンディング・リキッドステーキングを揃え、TVLは22年比で約3倍に伸長しました。 </p>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>分類</th><th>代表DApp</th><th>特徴</th></tr></thead><tbody><tr><td>DEX</td><td><strong>StellaSwap</strong></td><td>クロスチェーンスワップAPI、dBridge統合でETH&#x2194;DOT即時交換</td></tr><tr><td>レンディング</td><td><strong>Moonwell</strong></td><td>ネイティブGLMR担保＋USDC借入、Etherscan互換UI</td></tr><tr><td>LSD</td><td><strong>BeamStake</strong></td><td>stDOTとstGLMRを発行し、RWA担保プロトコルと接続</td></tr></tbody></table></div></figure>



<p class="wp-block-paragraph">流入元はPolkadotエコシステムだけでなく、EVMチェーン→Axelar→Moonbeamというルートも増えており、ガス代がイーサより廉価な点も採用理由になっています。</p>



<h2 class="wp-block-heading">ユースケース3：ゲーム &amp; メタバース</h2>



<p class="wp-block-paragraph">Moonbeam&nbsp;Nova（テストネット）上では<strong>Unity SDK</strong>が公開され、スマートコントラクトを意識しないゲーム資産発行が可能になりました。具体例として、<strong>MoonSama</strong>はポリゴンカードNFTをLayerZero経由でインポートし、ゲーム内アバターに転用する機能を実装しています。アイテム転送は数秒で完了し、プレイヤーは“チェーンを越えたインベントリ”を体感できます。</p>



<h2 class="wp-block-heading">ユースケース4：Real‑World&nbsp;Assets（RWA）</h2>



<p class="wp-block-paragraph">公式ケーススタディには<strong>Carbify</strong>というカーボンクレジットNFTや、富裕層向け投資商品をトークン化した<strong>Colb&nbsp;Finance</strong>が掲載されています。これらはMoonbeam上でERC‑3643準拠の譲渡制限トークンを発行し、KYC済ウォレットのみ売買可能とすることで規制要求をクリアしています。</p>



<h2 class="wp-block-heading">ユースケース5：新興国市場</h2>



<p class="wp-block-paragraph">ブラジル・ナイジェリアなど銀行口座普及率が低い地域では、<strong>USDCブリッジ＋携帯SMS認証ウォレット</strong>の組み合わせが導入されつつあります。MoonbeamはPolkadot共同リレーチェーンを介しローカルステーブルコインをトークン化、クロスボーダー送金の手数料を1/50に削減しました。現地のフィンテックがOrbitチェーンを採用しガスを自社トークン建てにする事例も出ています。</p>



<h2 class="wp-block-heading">Orbitで独自パラチェーンを構築する手順（概要）</h2>



<ol class="wp-block-list">
<li><strong>Moonbeam FoundationへOrbitスロット申請</strong></li>



<li><code>cargo contract new mychain</code> でSubstrateテンプレ生成</li>



<li><strong>Moonbeam SDK</strong>でEVMパレット／XCMパレットを追加</li>



<li>クロスチェーンメッセージングにAxelarかLayerZeroを選択し、Relayerキーを設定</li>



<li>スロット接続後、独自ガス通貨を登録（例：GAME）</li>



<li>MetaMaskで<code>chainId: 1284xx</code>を追加しβテスターをオンボード</li>
</ol>



<p class="wp-block-paragraph">開発と運用コストは通常パラチェーンの1/10以下とされ、ゲームスタジオやRWA企業がPoCを進めています。</p>



<h2 class="wp-block-heading">トークン経済とガバナンス</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>指標</th><th>値（2025/04時点）</th></tr></thead><tbody><tr><td>ネイティブ</td><td>GLMR（Moonbeam） / MOVR（Moonriver）</td></tr><tr><td>総供給</td><td>1&nbsp;B GLMR（インフレ年5%）</td></tr><tr><td>ステーキング</td><td>年率 10〜14%（バリデータ数 120）</td></tr><tr><td>ガバナンス</td><td>OpenGov に移行、XCM手数料やCore時間割当をオンチェーン投票</td></tr></tbody></table></div></figure>



<p class="wp-block-paragraph">クロスチェーン手数料（XCM・Axelarガス）の支払いにはGLMRが使われるため、ネットワーク利用が増えるほど需要が高まる設計です。</p>



<h2 class="wp-block-heading">最新ロードマップ（2025上期）</h2>



<ul class="wp-block-list">
<li><strong>Connected Contracts v2</strong>：WASM+EVMハイブリッドコントラクト対応</li>



<li><strong>Unified Liquidity Router</strong>：StellaSwapが複数ブリッジを抽象化したAPIを公開</li>



<li><strong>Decentralized Sequencer</strong>：Orbitチェーンのブロック生成を委任PoS化し、検閲耐性を強化</li>



<li><strong>zk‑XCM</strong>：Polkadot XCMにzkSNARKを組み合わせ、プライバシー付きクロスチェーン転送を試験導入</li>
</ul>



<h2 class="wp-block-heading">Moonbeamで開発を始める3ステップ</h2>



<ol class="wp-block-list">
<li><strong>環境構築</strong> </li>
</ol>



<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="npm i -g hardhat
npm i @moonbeam-network/hardhat-moonbeam" 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: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-g</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">hardhat</span></span>
<span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">@moonbeam-network/hardhat-moonbeam</span></span></code></pre></div>



<ol start="2" class="wp-block-list">
<li><strong>ネットワーク設定</strong>（<code>hardhat.config.js</code>）</li>
</ol>



<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="networks: {
  moonbeam: {
    url: &quot;https://rpc.api.moonbeam.network&quot;,
    chainId: 1284,
    accounts: [process.env.PRIVATE_KEY]
  }
}" 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: #C8C8C8">networks</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C8C8C8">moonbeam</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C8C8C8">url</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;https://rpc.api.moonbeam.network&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C8C8C8">chainId</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">1284</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C8C8C8">accounts</span><span style="color: #D4D4D4">: [</span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">PRIVATE_KEY</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>



<ol start="3" class="wp-block-list">
<li><strong>Axelar送金を統合</strong> </li>
</ol>



<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="npm i @axelar-network/axelarjs-sdk" 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: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">@axelar-network/axelarjs-sdk</span></span></code></pre></div>



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



<p class="wp-block-paragraph">Moonbeamは「<strong>クロスチェーン接続を前提にしたEVMチェーン</strong>」という独自ポジションで、DeFi・ゲーム・RWAなど多彩なユースケースを加速度的に拡大しています。AxelarやLayerZeroを統合することで、開発者は複数チェーン上の資産とロジックを<strong>1つのDApp</strong>にまとめられ、ユーザーはブリッジを意識せずシームレスにWeb3を利用できます。<br>今後Orbitチェーンやzk‑XCMが本格化すれば、MoonbeamはPolkadotのみならずEthereum・Cosmosを横断する“クロスチェーンハブ”の中心となるでしょう。Web3のユーザー体験を一変させる可能性を秘めたMoonbeamを、ぜひこの機会に触ってみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-moonbeam-usecase/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Arbitrumガイド──仕組み・特徴・開発手順・エコシステムまで網羅するレイヤー2解説</title>
		<link>https://techgrowup.net/blockchain-arbitrum/</link>
					<comments>https://techgrowup.net/blockchain-arbitrum/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Thu, 17 Apr 2025 00:21:59 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[ARB]]></category>
		<category><![CDATA[Arbitrum]]></category>
		<category><![CDATA[DeFi]]></category>
		<category><![CDATA[L2]]></category>
		<category><![CDATA[Nitro]]></category>
		<category><![CDATA[Orbit]]></category>
		<category><![CDATA[イーサリアム]]></category>
		<category><![CDATA[オプティミスティックロールアップ]]></category>
		<category><![CDATA[レイヤー2]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2777</guid>

					<description><![CDATA[はじめに イーサリアムは分散性とセキュリティを両立したスマートコントラクト基盤として幅広く支持されています。しかしユーザー急増に伴い、ガス代高騰やネットワーク混雑といったスケーラビリティの壁に直面しているのも事実です。そ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">はじめに</h1>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">イーサリアムは分散性とセキュリティを両立したスマートコントラクト基盤として幅広く支持されています。しかしユーザー急増に伴い、ガス代高騰やネットワーク混雑といったスケーラビリティの壁に直面しているのも事実です。そこで誕生したのが<strong>レイヤー2（L2）という拡張層。中でもArbitrum</strong>は総TVL（ロック資産額）で首位を走り、DeFi・NFT・ゲームアプリの受け皿として急速に成長しています。<br>本記事では公式サイト&nbsp;<a rel="noopener" target="_blank" class="" href="https://arbitrum.io/">https://arbitrum.io/<span class="fa fa-external-link external-icon anchor-icon"></span></a>&nbsp;の情報をもとに、Arbitrumの技術設計、ユースケース、開発者向けフロー、エコシステム、トークン経済、将来展望をできる限り詳細に解説します。</p>



<h2 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">Arbitrumとは</h2>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">オプティミスティックロールアップの代表格</h3>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">Arbitrumは<strong>Optimistic Rollup</strong>方式を採用するレイヤー2プラットフォームです。取引はL2上で高速処理され、まとめて圧縮（バッチ化）したデータのみをイーサリアムL1へ投稿します。投稿後、一定期間（現在は約7日間）“不正証明”がなければ最終確定となる仕組みです。</p>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">Nitroアーキテクチャ</h3>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">2022年導入の<strong>Nitro</strong>アップグレードで、Arbitrumは完全なEVMバイトコード互換を実現。Gethベースのウォームアップ済みWebAssembly（WASM）環境を採用し、旧アーキテクチャよりガスコストを平均90％削減しました。さらに<strong>Batch Poster</strong>と<strong>Sequencer</strong>の処理が分離され、ダウンタイム時の障害範囲が限定的になっています。</p>



<h2 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">Arbitrumのラインナップ</h2>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">Arbitrum One</h3>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">メインストリーム向けロールアップ。多くのDeFiプロトコル（Uniswap、Aave、GMX等）が稼働し、TVLは130億USD規模。</p>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">Arbitrum Nova</h3>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph"><strong>AnyTrust</strong>データ可用性モデルを採用し、ガスを更に低減。ソーシャルアプリやゲーム、マイクロトランザクション向けに設計されています。Redditのポイントシステム「Community Points」が採用。</p>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">Arbitrum Orbit</h3>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">開発者が独自ロールアップを簡単に立ち上げられるフレームワーク。セキュリティをArbitrum OneもしくはNovaに委ねつつ、独自トークンやカスタムガス通貨を設定可能です。アプリ固有チェーン（App‑specific Rollup）の需要に応えます。</p>



<h2 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">仕組みを深掘り</h2>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">Sequencerの役割</h3>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">SequencerはL2取引を受け取り、即座にユーザーへ“軟確定”を返します。ここで得た高速UXがArbitrumの体験に直結。後段でBatch Posterが圧縮データをL1へ送ることでファイナリティを確保します。</p>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">証明・チャレンジメカニズム</h3>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">チャレンジ期間中に不正を検証するのが<strong>Arbitrator</strong>。対話的フォールト証明を用い、Binary Search式にステップを切り出し最小証明を行うため、L1手数料を抑えつつ不正ブロックを無効化できます。</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="sequenceDiagram
  participant User
  participant Sequencer
  participant L1
  participant Challenger
  User-&gt;&gt;Sequencer: Tx送信
  Sequencer--&gt;&gt;User: 即時応答
  Sequencer-&gt;&gt;L1: Batch投稿
  Challenger-&gt;&gt;L1: 不正チャレンジ
  alt 不正あり
      L1--&gt;&gt;Sequencer: Rollback
  else 不正なし
      L1--&gt;&gt;Chain: 確定
  end" 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: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">L1ToL2MessageWriter</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;@arbitrum/sdk&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">writer</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">L1ToL2MessageWriter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">fromTxHash</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">l1Provider</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">txHash</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">writer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">waitForStatus</span><span style="color: #D4D4D4">(); </span><span style="color: #6A9955">// チャレンジ解決を監視</span></span></code></pre></div>



<h2 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">開発者向けハンズオン</h2>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">Hardhat設定例</h3>



<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="npm i --save-dev hardhat @nomiclabs/hardhat-ethers ethers" 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: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">L1ToL2MessageWriter</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;@arbitrum/sdk&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">writer</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">L1ToL2MessageWriter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">fromTxHash</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">l1Provider</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">txHash</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">writer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">waitForStatus</span><span style="color: #D4D4D4">(); </span><span style="color: #6A9955">// チャレンジ解決を監視</span></span></code></pre></div>



<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="// hardhat.config.js
require(&quot;@nomiclabs/hardhat-ethers&quot;);
module.exports = {
  solidity: &quot;0.8.20&quot;,
  networks: {
    arbitrum: {
      url: &quot;https://arb1.arbitrum.io/rpc&quot;,
      chainId: 42161,
      accounts: [process.env.PRIVATE_KEY]
    },
    nova: {
      url: &quot;https://nova.arbitrum.io/rpc&quot;,
      chainId: 42170,
      accounts: [process.env.PRIVATE_KEY]
    }
  }
};" 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: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">L1ToL2MessageWriter</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;@arbitrum/sdk&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">writer</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">L1ToL2MessageWriter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">fromTxHash</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">l1Provider</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">txHash</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">writer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">waitForStatus</span><span style="color: #D4D4D4">(); </span><span style="color: #6A9955">// チャレンジ解決を監視</span></span></code></pre></div>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">簡易コントラクト（Counter.sol）</h3>



<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.20;
contract Counter {
    uint256 private _count;
    function inc() external { _count += 1; }
    function get() external view returns (uint256) { return _count; }
}" 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: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">L1ToL2MessageWriter</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;@arbitrum/sdk&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">writer</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">L1ToL2MessageWriter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">fromTxHash</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">l1Provider</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">txHash</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">writer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">waitForStatus</span><span style="color: #D4D4D4">(); </span><span style="color: #6A9955">// チャレンジ解決を監視</span></span></code></pre></div>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">デプロイ</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="npx hardhat run scripts/deploy.js --network arbitrum" 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: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">L1ToL2MessageWriter</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;@arbitrum/sdk&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">writer</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">L1ToL2MessageWriter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">fromTxHash</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">l1Provider</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">txHash</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">writer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">waitForStatus</span><span style="color: #D4D4D4">(); </span><span style="color: #6A9955">// チャレンジ解決を監視</span></span></code></pre></div>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">ブリッジSDK例（ethers.js + Arbitrum SDK）</h3>



<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="import { L1ToL2MessageWriter } from &quot;@arbitrum/sdk&quot;;
const writer = await L1ToL2MessageWriter.fromTxHash(l1Provider, txHash);
await writer.waitForStatus(); // チャレンジ解決を監視" 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: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">L1ToL2MessageWriter</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;@arbitrum/sdk&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">writer</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">L1ToL2MessageWriter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">fromTxHash</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">l1Provider</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">txHash</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">writer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">waitForStatus</span><span style="color: #D4D4D4">(); </span><span style="color: #6A9955">// チャレンジ解決を監視</span></span></code></pre></div>



<h2 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">エコシステムの広がり</h2>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">DeFi</h3>



<ul class="wp-block-list has-d-4-d-4-d-4-color has-text-color">
<li><strong>GMX</strong>：パーペチュアル取引所、手数料収入でETHを分配</li>



<li><strong>Radiant</strong>：クロスチェーンレンディング、ARB報酬でTVL急拡大</li>



<li><strong>Camelot</strong>：DEX＋Launchpad、ロックトークンxGRAILでインセンティブ調整</li>
</ul>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">NFT・ゲーム</h3>



<ul class="wp-block-list has-d-4-d-4-d-4-color has-text-color">
<li><strong>TreasureDAO</strong>：ゲーム資産マーケット、MAGICトークン経済圏</li>



<li><strong>Smolverse</strong>：PFP＋メタバース</li>



<li><strong>Pixels</strong>：Novaへ移行し、1日数十万Txを処理</li>
</ul>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">インフラ</h3>



<ul class="wp-block-list has-d-4-d-4-d-4-color has-text-color">
<li><strong>Chainlink CCIP</strong>：Arbitrum対応、クロスチェーンメッセージング</li>



<li><strong>The Graph</strong>：サブグラフがメインネットと同等に利用可能</li>



<li><strong>EigenLayer</strong>：再ステーキングによるデータ可用性サービスを準備中</li>
</ul>



<h2 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">トークン経済（ARB）</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-d-4-d-4-d-4-color has-text-color has-fixed-layout"><thead><tr><th>指標</th><th>値（2025/04時点）</th></tr></thead><tbody><tr><td>総供給</td><td>10&nbsp;B ARB</td></tr><tr><td>流通量</td><td>3.5&nbsp;B ARB</td></tr><tr><td>配分</td><td>エアドロ 12.75％／DAO 42.78％／財団 27％／チーム 17.5％</td></tr><tr><td>ガバナンス</td><td>オンチェーン投票（Snapshot＋Tally）</td></tr></tbody></table></div></figure>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">ARBは手数料支払いには使われず、<strong>ガバナンストークン</strong>として機能します。提案が可決されると、Smart Treasury から流動性激励や開発者助成金が拠出されます。</p>



<h2 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">セキュリティと課題</h2>



<ul class="wp-block-list has-d-4-d-4-d-4-color has-text-color">
<li><strong>ブリッジリスク</strong>：WETH連動のスマートコントラクトに依存、Auditとバグバウンティを継続</li>



<li><strong>集中Sequencer問題</strong>：現在はOffchain Labs運営の単一Sequencer。2024年後半に<strong>Permissionless Sequencer</strong>ロードマップが進行</li>



<li><strong>出金遅延UX</strong>：7日待機はCEXやリライヤー（Hop, Across）により短縮可能だが完全解決は要検討</li>
</ul>



<h2 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">最新動向と将来展望</h2>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">EIP‑4844（Proto‑Danksharding）効果</h3>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">データブロブ導入でArbitrumのL1投稿コストがさらに80％以上削減見込み。ARBガバナンスで投稿頻度と手数料モデルの最適化が議論中。</p>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">Orbitチェーンの拡大</h3>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">ゲーム会社やAIスタートアップがOrbitで独自ロールアップを構築。ガス通貨を独自トークンに設定しつつ、Arbitrum一括証明でセキュリティを確保。</p>



<h3 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">提案「ARB‑Stake‑to‑Earn」</h3>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">ARB保有者がステークしSequencer Feeの一部を受け取る案が提起。実現すればARBの経済的ユーティリティが向上。</p>



<h2 class="wp-block-heading has-d-4-d-4-d-4-color has-text-color">まとめ</h2>



<p class="has-d-4-d-4-d-4-color has-text-color wp-block-paragraph">Arbitrumは<strong>Optimistic Rollup + Nitro</strong>という堅牢かつ高速なアーキテクチャで、イーサリアムのセキュリティを保ちながらガス代を劇的に削減します。メインネットArbitrum&nbsp;Oneとマイクロトランザクション特化のArbitrum&nbsp;Nova、独自ロールアップ構築キットArbitrum&nbsp;Orbitという三本柱で、多様なユースケースを取り込む体制が整いました。<br>開発者はHardhatやFoundryをほぼそのまま流用でき、ユーザーはMetaMaskでL1同様の体験を得られます。EIP‑4844やPermissionless Sequencerの導入により、手数料低減と分散性向上がさらに進む見込みです。今こそArbitrum上でDAppを試作し、成長著しいL2エコシステムに参入する絶好のタイミングと言えるでしょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-arbitrum/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ブロックチェーンの「レイヤー1」と「レイヤー2」を解説──仕組み・代表例・課題・将来展望</title>
		<link>https://techgrowup.net/blockchain-layer/</link>
					<comments>https://techgrowup.net/blockchain-layer/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Mon, 14 Apr 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[L1]]></category>
		<category><![CDATA[L2]]></category>
		<category><![CDATA[ZKロールアップ]]></category>
		<category><![CDATA[オプティミスティック]]></category>
		<category><![CDATA[サイドチェーン]]></category>
		<category><![CDATA[スケーラビリティ]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[レイヤー1]]></category>
		<category><![CDATA[レイヤー2]]></category>
		<category><![CDATA[ロールアップ]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2770</guid>

					<description><![CDATA[はじめに ビットコインが誕生してから10年以上、ブロックチェーンは「分散性」と「セキュリティ」を強みとして進化してきました。しかしユーザー数と取引量が増えるにつれ、ネットワーク混雑や高額なガス代という“スケーラビリティの [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">ビットコインが誕生してから10年以上、ブロックチェーンは「分散性」と「セキュリティ」を強みとして進化してきました。しかしユーザー数と取引量が増えるにつれ、ネットワーク混雑や高額なガス代という“スケーラビリティの壁”が顕在化します。そこで注目されているのが**レイヤー1（L1）<strong>と</strong>レイヤー2（L2）**という二層構造のアプローチです。<br>L1は“土台”となるメインチェーン、L2はその外側に構築される“拡張レイヤー”を指します。本記事ではGemini Cryptopediaの解説をベースに、L1/L2の仕組み・メリット・課題を体系的に整理し、主要プロジェクトや最新動向まで詳しく紹介します。開発者向けに簡易コード例も挿入しながら、8,000文字超でじっくり深掘りしていきましょう。</p>



<h2 class="wp-block-heading">レイヤー1とは何か</h2>



<h3 class="wp-block-heading">基本概念</h3>



<p class="wp-block-paragraph">レイヤー1はブロックチェーンネットワークの“ネイティブ”な層で、コンセンサスアルゴリズム（PoW、PoSなど）やネイティブトークン、スマートコントラクト環境を直接提供します。ビットコイン、イーサリアム、Solana、Avalanche などが代表例です。</p>



<h3 class="wp-block-heading">スケーラビリティの制約</h3>



<ul class="wp-block-list">
<li><strong>トリレンマ</strong>：分散性・セキュリティ・スケーラビリティの3要素を同時に最大化できない</li>



<li><strong>ガス代高騰</strong>：需要が供給を上回ると手数料が上昇し、マイクロトランザクションが困難</li>



<li><strong>ブロックサイズの限界</strong>：大きくするとノード負荷が増え分散性が低下</li>
</ul>



<h3 class="wp-block-heading">L1スケーリングの取り組み</h3>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>手法</th><th>例</th><th>説明</th></tr></thead><tbody><tr><td>シャーディング</td><td>Ethereum 2.0, NEAR</td><td>チェーンを水平分割し並列処理</td></tr><tr><td>高速コンセンサス</td><td>Solana (PoH)</td><td>ブロックタイム短縮・高TPS</td></tr><tr><td>高性能VM</td><td>Aptos, Sui (Move)</td><td>並列実行で処理効率を向上</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading">レイヤー2の役割と種類</h2>



<h3 class="wp-block-heading">なぜL2が必要か</h3>



<p class="wp-block-paragraph">L1を抜本的に改修するとハードフォークやセキュリティリスクが伴います。そこで「<strong>取引処理はオフチェーン／セキュリティはオンチェーン</strong>」という二層構造が生まれました。L2はL1の安全性を継承しつつ、処理を高速・低コスト化することが目的です。</p>



<h3 class="wp-block-heading">L2の分類</h3>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>カテゴリ</th><th>代表プロジェクト</th><th>仕組み</th><th>メリット</th><th>デメリット</th></tr></thead><tbody><tr><td>オプティミスティックロールアップ</td><td>Optimism, Arbitrum</td><td>不正がなければ即確定、異議申し立て期間あり</td><td>EVM互換、高スループット</td><td>7日程度の出金遅延</td></tr><tr><td>ZKロールアップ</td><td>zkSync, Starknet</td><td>ゼロ知識証明で即時確定</td><td>セキュリティ高、即時出金</td><td>証明計算が重い</td></tr><tr><td>サイドチェーン</td><td>Polygon PoS, Ronin</td><td>独自バリデータでチェーン運営</td><td>柔軟なガスモデル</td><td>L1とセキュリティ分離</td></tr><tr><td>ステートチャネル</td><td>Lightning, Raiden</td><td>当事者間で署名、最終結果のみL1へ</td><td>即時・極小手数料</td><td>双方オンライン前提</td></tr><tr><td>プラズマ</td><td>OMG Network</td><td>チェーンを子チェーン化</td><td>セキュリティ強</td><td>Exit手続きが複雑</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading">オプティミスティック vs ZKロールアップ</h2>



<h3 class="wp-block-heading">アーキテクチャ比較</h3>



<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="graph TD
  subgraph Optimistic
    A[L2 Batch Tx] --&gt; B[State Root 提出]
    B --&gt; C[Challenge期間]
    C --&gt; D[L1確定]
  end
  subgraph ZK
    E[L2 Batch Tx] --&gt; F[ZK Proof生成]
    F --&gt; G[Proof + State Root 提出]
    G --&gt; H[即時確定]
  end" 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: #C586C0">graph</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">TD</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">subgraph</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Optimistic</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">A</span><span style="color: #C586C0">[</span><span style="color: #CE9178">L2 Batch Tx</span><span style="color: #C586C0">]</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">--&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">B</span><span style="color: #C586C0">[</span><span style="color: #CE9178">State Root 提出</span><span style="color: #C586C0">]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">B </span><span style="color: #C586C0">--&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">C</span><span style="color: #C586C0">[</span><span style="color: #CE9178">Challenge期間</span><span style="color: #C586C0">]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">C </span><span style="color: #C586C0">--&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">D</span><span style="color: #C586C0">[</span><span style="color: #CE9178">L1確定</span><span style="color: #C586C0">]</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">end</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">subgraph</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">ZK</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">E</span><span style="color: #C586C0">[</span><span style="color: #CE9178">L2 Batch Tx</span><span style="color: #C586C0">]</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">--&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">F</span><span style="color: #C586C0">[</span><span style="color: #CE9178">ZK Proof生成</span><span style="color: #C586C0">]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">F </span><span style="color: #C586C0">--&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">G</span><span style="color: #C586C0">[</span><span style="color: #CE9178">Proof + State Root 提出</span><span style="color: #C586C0">]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">G </span><span style="color: #C586C0">--&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">H</span><span style="color: #C586C0">[</span><span style="color: #CE9178">即時確定</span><span style="color: #C586C0">]</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">end</span></span></code></pre></div>



<h3 class="wp-block-heading">実装コードスニペット（Solidity）</h3>



<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="// Optimistic Rollup用 ステートコミット例（擬似コード）
function commitBatch(bytes32 _stateRoot) external onlySequencer {
    batches.push(Batch(_stateRoot, block.timestamp));
}

// ZK Rollup用 プルーフ検証例
function verifyAndUpdate(bytes calldata proof, bytes32 newRoot) external {
    require(zkVerifier.verifyProof(proof, newRoot), &quot;invalid proof&quot;);
    stateRoot = newRoot;
}" 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">// Optimistic Rollup用 ステートコミット例（擬似コード）</span></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">commitBatch</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">bytes32</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_stateRoot</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">external</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">onlySequencer</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    batches.</span><span style="color: #DCDCAA">push</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">Batch</span><span style="color: #D4D4D4">(_stateRoot, </span><span style="color: #569CD6">block</span><span style="color: #D4D4D4">.timestamp));</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// ZK Rollup用 プルーフ検証例</span></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">verifyAndUpdate</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">bytes</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">calldata</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">proof</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">bytes32</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">newRoot</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">external</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">require</span><span style="color: #D4D4D4">(zkVerifier.</span><span style="color: #DCDCAA">verifyProof</span><span style="color: #D4D4D4">(proof, newRoot), </span><span style="color: #CE9178">&quot;invalid proof&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    stateRoot = newRoot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading">選択指針</h3>



<ul class="wp-block-list">
<li><strong>即時性重視</strong>：ZK</li>



<li><strong>EVM互換・開発容易</strong>：Optimistic</li>



<li><strong>データ圧縮効率</strong>：ZK（特にValidium）</li>
</ul>



<h2 class="wp-block-heading">サイドチェーンとL2の境界</h2>



<p class="wp-block-paragraph">Polygon PoS などは厳密には「L1とは独立したチェーン」ですが、ブリッジで資産を移動しやすく<strong>実質L2的役割</strong>を果たしています。セキュリティは独自バリデータに依存するため、イーサリアム本体ほど強固ではありませんが、トランザクション手数料が1/1000程度になる利点があります。</p>



<h2 class="wp-block-heading">代表的プロジェクト比較</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>ネットワーク</th><th>カテゴリ</th><th>TPS実測</th><th>手数料(USD)</th><th>出金時間</th><th>EVM互換</th></tr></thead><tbody><tr><td>Arbitrum One</td><td>Optimistic</td><td>~4,000</td><td>0.02</td><td>7日</td><td>◎</td></tr><tr><td>Optimism</td><td>Optimistic</td><td>~2,000</td><td>0.03</td><td>7日</td><td>◎</td></tr><tr><td>zkSync Era</td><td>ZK Rollup</td><td>~3,000</td><td>0.01</td><td>数分</td><td>◎</td></tr><tr><td>Starknet</td><td>ZK Rollup</td><td>~1,000</td><td>0.02</td><td>即時</td><td>△ (Cairo)</td></tr><tr><td>Polygon PoS</td><td>サイドチェーン</td><td>~7,000</td><td>0.005</td><td>数分</td><td>◎</td></tr><tr><td>Lightning</td><td>ステートチャネル</td><td>数万</td><td>ほぼ0</td><td>即時</td><td>✕</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading">開発者視点：L2でのDAppデプロイ手順（Hardhat例）</h2>



<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="npm init -y &amp;&amp; npm i hardhat @nomiclabs/hardhat-ethers ethers
npx hardhat            # プロジェクト初期化" 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: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">init</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-y</span><span style="color: #D4D4D4"> &amp;&amp; </span><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">hardhat</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">@nomiclabs/hardhat-ethers</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ethers</span></span>
<span class="line"><span style="color: #DCDCAA">npx</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">hardhat</span><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># プロジェクト初期化</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>hardhat.config.js</code></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="module.exports = {
  solidity: &quot;0.8.18&quot;,
  networks: {
    arbitrum: {
      url: &quot;https://arb1.arbitrum.io/rpc&quot;,
      accounts: [process.env.PRIVATE_KEY]
    }
  }
};" 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: #4EC9B0">module</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">exports</span><span style="color: #D4D4D4"> = {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">solidity:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;0.8.18&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">networks:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">arbitrum:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">url:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;https://arb1.arbitrum.io/rpc&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">accounts:</span><span style="color: #D4D4D4"> [</span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">PRIVATE_KEY</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>
<span class="line"><span style="color: #D4D4D4">};</span></span></code></pre></div>



<p class="wp-block-paragraph">デプロイスクリプト</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="async function main() {
  const Counter = await ethers.getContractFactory(&quot;Counter&quot;);
  const counter = await Counter.deploy();
  await counter.deployed();
  console.log(&quot;Counter:&quot;, counter.address);
}
main();" 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: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">Counter</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ethers</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getContractFactory</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Counter&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">counter</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Counter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">deploy</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">counter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">deployed</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">log</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Counter:&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">counter</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">address</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">();</span></span></code></pre></div>



<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="PRIVATE_KEY=0x... npx hardhat run scripts/deploy.js --network arbitrum" 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: #9CDCFE">PRIVATE_KEY</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #CE9178">x...</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">npx</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">hardhat</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">run</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">scripts/deploy.js</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--network</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">arbitrum</span></span></code></pre></div>



<p class="wp-block-paragraph">Optimistic や zkSync も RPC エンドポイントを変えるだけで同様にデプロイ可能です。</p>



<h2 class="wp-block-heading">レイヤー2とは何か──“セキュリティはL1、処理はL2”</h2>



<h3 class="wp-block-heading">基本アーキテクチャ</h3>



<p class="wp-block-paragraph">レイヤー2は「トランザクションの大部分を L1 の外で処理し、最終的な結果だけを L1 に書き戻す」ことでスループットとコストを劇的に改善します。L1 はセキュリティとデータ可用性を担保し、L2 は高速処理に特化する<strong>モジュラー型ブロックチェーン</strong>の代表的実装です。</p>



<h3 class="wp-block-heading">L2の方式を徹底解説</h3>



<h4 class="wp-block-heading">オプティミスティックロールアップ</h4>



<ul class="wp-block-list">
<li><strong>仕組み</strong>：Sequencer がバッチを L1 に投稿し、異議申し立て期間（Challenge Window）中に不正がなければ確定</li>



<li><strong>メリット</strong>：EVM 完全互換で開発が容易、ZK 証明が不要で計算負荷が低い</li>



<li><strong>デメリット</strong>：出金遅延（Arbitrum/Optimism では 7 日）が UX を阻害</li>
</ul>



<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="sequenceDiagram
  participant User
  participant Sequencer
  participant L1
  User-&gt;&gt;Sequencer: Tx 提出
  Sequencer-&gt;&gt;Sequencer: バッチ圧縮
  Sequencer-&gt;&gt;L1: データ投稿
  Note over L1: 7日間 Challenge
  L1--&gt;&gt;User: 完了通知" 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: #C586C0">sequenceDiagram</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">participant</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">User</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">participant</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Sequencer</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">participant</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">L1</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">User</span><span style="color: #C586C0">-&gt;&gt;</span><span style="color: #9CDCFE">Sequencer</span><span style="color: #C586C0">:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Tx 提出</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">Sequencer</span><span style="color: #C586C0">-&gt;&gt;</span><span style="color: #9CDCFE">Sequencer</span><span style="color: #C586C0">:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">バッチ圧縮</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">Sequencer</span><span style="color: #C586C0">-&gt;&gt;</span><span style="color: #9CDCFE">L1</span><span style="color: #C586C0">:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">データ投稿</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">Note</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">over</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">L1</span><span style="color: #C586C0">:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">7日間 Challenge</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">L1</span><span style="color: #C586C0">--&gt;&gt;</span><span style="color: #9CDCFE">User</span><span style="color: #C586C0">:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">完了通知</span></span></code></pre></div>



<h4 class="wp-block-heading">ZKロールアップ</h4>



<ul class="wp-block-list">
<li><strong>仕組み</strong>：L2 で生成した ZK‑SNARK/‑STARK 証明と状態ルートを L1 に投稿し、即時確定</li>



<li><strong>メリット</strong>：即時出金、セキュリティ強、データ圧縮効率が高い</li>



<li><strong>デメリット</strong>：証明生成が計算集約的でガス代も高め（ただし急速に最適化中）</li>
</ul>



<h4 class="wp-block-heading">サイドチェーン</h4>



<ul class="wp-block-list">
<li><strong>仕組み</strong>：独自のバリデータセットを持つ別チェーン。Polygon PoS、BNB Chain など</li>



<li><strong>メリット</strong>：ガスモデルやブロックサイズを自由に設定可能、取引コスト極小</li>



<li><strong>デメリット</strong>：セキュリティが L1 と独立しており、ブリッジ攻撃リスクが高い</li>
</ul>



<h4 class="wp-block-heading">ステートチャネル</h4>



<ul class="wp-block-list">
<li><strong>仕組み</strong>：参加者間でオフチェーン署名を交換し、最終結果だけを L1 に書き込む（Lightning, Raiden）</li>



<li><strong>メリット</strong>：即時・手数料ほぼゼロ、マイクロペイメントに最適</li>



<li><strong>デメリット</strong>：参加者が常時オンライン、N→N の拡張が困難</li>
</ul>



<h4 class="wp-block-heading">プラズマ</h4>



<ul class="wp-block-list">
<li><strong>仕組み</strong>：子チェーンで取引を処理し、定期的に Merkle ルートを L1 に投稿（OMG Network）</li>



<li><strong>メリット</strong>：大量トランザクション処理に強い</li>



<li><strong>デメリット</strong>：Exit 手続きが複雑、NFT など状態フルコピーが必要なアプリに不向き</li>
</ul>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">セキュリティと課題</h2>



<ul class="wp-block-list">
<li><strong>ブリッジ攻撃</strong>：L1&#x2194;L2間ブリッジは巨額資産が集中し攻撃対象になりやすい</li>



<li><strong>データ可用性</strong>：Validium のようにデータをオフチェーン保存する方式では、データ喪失リスクがある</li>



<li><strong>中央集権化懸念</strong>：Sequencer が単一点障害になる場合があり、ダウンタイム事例も存在</li>
</ul>



<h2 class="wp-block-heading">エコシステムの最新動向</h2>



<h3 class="wp-block-heading">DeFi の L2 移行</h3>



<p class="wp-block-paragraph">Uniswap、Aave、Curve など主要プロトコルが続々と L2 にデプロイ。手数料が数十分の一に削減され、アクティブユーザーが急増。</p>



<h3 class="wp-block-heading">NFT とロールアップ</h3>



<p class="wp-block-paragraph">zkSync Era 上での NFT ミントはガス代が約 0.005 USD。OpenSea も L2 対応を進めており、クリエイターが大量発行しやすい環境が整備。</p>



<h3 class="wp-block-heading">企業・政府導入</h3>



<p class="wp-block-paragraph">Visa が Starknet でオフチェーン決済の検証を発表。韓国政府は公共機関 ID を Polygon Supernet で実装予定。</p>



<h2 class="wp-block-heading">最新トレンドと将来展望</h2>



<h3 class="wp-block-heading">EIP‑4844 のインパクト</h3>



<ul class="wp-block-list">
<li><strong>データブロブ</strong>：ロールアップデータを廉価に投稿可能</li>



<li><strong>予想効果</strong>：L2 ガス代がさらに 5～10 倍削減、NFT ミントが 1 円未満に</li>



<li><strong>実装状況</strong>：Dencun アップグレードでメインネット導入予定（2024 下期）</li>
</ul>



<h3 class="wp-block-heading">アプリケーション固有ロールアップ</h3>



<p class="wp-block-paragraph">dYdX v4（Cosmos SDK + ABCI）、Lens Network、Otherside（Yuga Labs）が独自ロールアップを採用し、アプリごとに最適化されたスループットと手数料を実現。</p>



<h3 class="wp-block-heading">クロスロールアップ通信</h3>



<p class="wp-block-paragraph">LayerZero、Connext、Hyperlane などが「<strong>ロールアップ間メッセージング</strong>」を提供。複数 L2 を横断する DApp（例：ステーブルコイン自動最安転送）が誕生しつつある。</p>



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



<p class="wp-block-paragraph">レイヤー1はブロックチェーンの基盤としてセキュリティと分散性を担保し、レイヤー2はその上でスケーラビリティとユーザビリティを飛躍的に高める役割を果たします。オプティミスティックロールアップと ZK ロールアップが二大潮流となり、サイドチェーンやステートチャネルがニッチ領域を補完。EIP‑4844 やデータ可用性レイヤーの台頭により、L2 は「ブロックチェーン利用のデフォルト」へと進化しつつあります。<br>開発者にとっては RPC を切り替えるだけで L2 にデプロイでき、ユーザーは数円以下の手数料で高速トランザクションを享受できる時代が到来しました。スケーラビリティの壁を越える鍵は、まさにレイヤー2にあります。</p>



<p class="wp-block-paragraph"><strong>次のステップ</strong></p>



<ol class="wp-block-list">
<li>Hardhat で L2 ネットワーク RPC を追加し、既存コントラクトをデプロイしてガス比較を体験</li>



<li>ブリッジ SDK を用いて L1&#x2194;L2 資産移動の UX を検証</li>



<li>EIP‑4844 後のガスモデルを想定し、ロールアップネイティブな DApp 設計に着手</li>
</ol>



<p class="wp-block-paragraph">スケーラブルでユーザーフレンドリーなブロックチェーンを目指すなら、今こそ L2 の理解と実装が必須です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-layer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Telegram発・次世代ブロックチェーン「TON」完全ガイド──歴史・アーキテクチャ・開発手順・エコシステム解説</title>
		<link>https://techgrowup.net/blockchain-ton-2/</link>
					<comments>https://techgrowup.net/blockchain-ton-2/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sun, 13 Apr 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[CBDC]]></category>
		<category><![CDATA[DAO]]></category>
		<category><![CDATA[DeFi]]></category>
		<category><![CDATA[FunC]]></category>
		<category><![CDATA[GameFi]]></category>
		<category><![CDATA[NFT]]></category>
		<category><![CDATA[Tact]]></category>
		<category><![CDATA[Telegram]]></category>
		<category><![CDATA[The Open Network]]></category>
		<category><![CDATA[TON]]></category>
		<category><![CDATA[TVM]]></category>
		<category><![CDATA[マルチシャーディング]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2767</guid>

					<description><![CDATA[はじめに スマートフォンの普及によってメッセンジャーはもはや“日常インフラ”です。もしそのチャット UI から暗号資産の送金や NFT の購入、DeFi への流動性提供まで完結できたら──TON（The Open Net [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">スマートフォンの普及によってメッセンジャーはもはや“日常インフラ”です。もしそのチャット UI から暗号資産の送金や NFT の購入、DeFi への流動性提供まで完結できたら──<strong>TON（The Open Network）</strong> はその未来を最短距離で実現しようとしているレイヤー1 ブロックチェーンです。<br>Telegram が構想した「Telegram Open Network」をコミュニティが引き継ぎ、<strong>マルチシャーディング</strong>・<strong>TVM（TON Virtual Machine）</strong>・<strong>超高速ファイナリティ</strong>を武器に、Web3 のマスアダプションを目指しています。本記事では公式開発サイト <a rel="noopener" target="_blank" class="" href="https://ton.org/dev">https://ton.org/dev<span class="fa fa-external-link external-icon anchor-icon"></span></a> を軸に、技術設計・開発手順・巨大エコシステム・トークン経済・ロードマップを 解説します。</p>



<h2 class="wp-block-heading">TON の歴史とビジョン</h2>



<h3 class="wp-block-heading">Telegram Open Network から The Open Network へ</h3>



<ul class="wp-block-list">
<li><strong>2018 年</strong>：Telegram が 17 億 USD を調達し、独自チェーン TON を発表。</li>



<li><strong>2020 年</strong>：米 SEC との法的対立で Telegram は TON を断念。ただしソースコードはオープンソースとして公開。</li>



<li><strong>2021 年</strong>：コミュニティがコードをフォークし、名称を <strong>The Open Network</strong> と改め開発を継続。</li>



<li><strong>2022 年</strong>：メインネット安定稼働。Telegram ウォレットボットが TON 送金に対応し、ハンドルネーム NFT を発行。</li>
</ul>



<p class="wp-block-paragraph">「中央集権的サービスを介さず、メッセンジャー UI のままブロックチェーンを利用できる」というビジョンは、LINE・WeChat などが試みる Web3 施策とも一線を画します。Telegram との資本関係はないものの、ウォレットボットやミニアプリを通じた密な連携が、他チェーンにはない UX を生み出しています。</p>



<h2 class="wp-block-heading">TON の技術アーキテクチャ</h2>



<h3 class="wp-block-heading">三層シャーディングで“理論無限スケール”</h3>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>レイヤー</th><th>役割</th><th>特徴</th></tr></thead><tbody><tr><td><strong>Masterchain</strong></td><td>バリデータセット、ガバナンス、グローバルメタデータを保持</td><td>ネットワークの「背骨」</td></tr><tr><td><strong>Workchain</strong></td><td>アプリ／地域ごとに独立したルールや VM を設定</td><td>今後 EVM Workchain 実装予定</td></tr><tr><td><strong>Shardchain</strong></td><td>Workchain を動的に水平分割</td><td>トランザクション量に応じて自動増減</td></tr></tbody></table></div></figure>



<p class="wp-block-paragraph">動的シャーディングは、Ethereum2.0 や NEAR の“固定シャード”と異なり、負荷に応じてリアルタイムでシャード数を増減させます。これにより理論 TPS は 10 万超、ブロックタイムは 0.2 秒、ファイナリティは 5 秒前後を実測しています。</p>



<h3 class="wp-block-heading">PoS+BFT 合意</h3>



<p class="wp-block-paragraph">TON は DPoS ではなく <strong>シンプル PoS + BFT</strong> を採用。</p>



<ol class="wp-block-list">
<li>ステーク上位の候補からランダムローテーションでブロック提案者を選出</li>



<li>他バリデータが BFT 署名を付与し、2/3 以上で確定</li>



<li>不正提案はスラッシングでステーク没収</li>
</ol>



<p class="wp-block-paragraph">これにより高速ファイナリティとセキュリティを両立し、フォークリスクを最小化します。</p>



<h3 class="wp-block-heading">TON Virtual Machine (TVM)</h3>



<ul class="wp-block-list">
<li><strong>256‑bit スタックマシン</strong>：EVM の 256‑bit スタックと互換性が高いが、命令セットはより軽量。</li>



<li><strong>FunC</strong>：C 風構文の低レベル言語。手動メモリ管理でガス効率を極限まで最適化可能。</li>



<li><strong>Tact</strong>：TypeScript ライクな高級言語。型推論・モジュール・ユニットテストが組み込み。</li>



<li><strong>Solidity</strong>：EVM Workchain がローンチすればそのまま移植可能。</li>
</ul>



<p class="wp-block-paragraph">TVM のメッセージ駆動モデルはアクター型に近く、コントラクト同士が非同期メッセージでやり取りします。このため「Re‑entrancy」リスクが構造的に小さく、DeFi 開発者から高評価を得ています。</p>



<h2 class="wp-block-heading">開発者向けツールチェーン詳細</h2>



<h3 class="wp-block-heading">toncli の基本操作</h3>



<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="pip install toncli
toncli new hello-func
cd hello-func
vim contracts/contract.fc   # コード編集
toncli build
toncli deploy contracts/contract.tvc --value 1
toncli run get              # コントラクト呼び出し" 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: #DCDCAA">pip</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">toncli</span></span>
<span class="line"><span style="color: #DCDCAA">toncli</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">new</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">hello-func</span></span>
<span class="line"><span style="color: #DCDCAA">cd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">hello-func</span></span>
<span class="line"><span style="color: #DCDCAA">vim</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">contracts/contract.fc</span><span style="color: #D4D4D4">   </span><span style="color: #6A9955"># コード編集</span></span>
<span class="line"><span style="color: #DCDCAA">toncli</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">build</span></span>
<span class="line"><span style="color: #DCDCAA">toncli</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">deploy</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">contracts/contract.tvc</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--value</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #DCDCAA">toncli</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">run</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">get</span><span style="color: #D4D4D4">              </span><span style="color: #6A9955"># コントラクト呼び出し</span></span></code></pre></div>



<h3 class="wp-block-heading">Tact のワークフロー</h3>



<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="npm i -g tact
tact new counter
cd counter
vim src/Counter.tact
tact compile
tact deploy build/Counter.tvc --value 0.5
tact call get               # ステート読み出し" 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: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-g</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">tact</span></span>
<span class="line"><span style="color: #DCDCAA">tact</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">new</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">counter</span></span>
<span class="line"><span style="color: #DCDCAA">cd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">counter</span></span>
<span class="line"><span style="color: #DCDCAA">vim</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">src/Counter.tact</span></span>
<span class="line"><span style="color: #DCDCAA">tact</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">compile</span></span>
<span class="line"><span style="color: #DCDCAA">tact</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">deploy</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">build/Counter.tvc</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--value</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0.5</span></span>
<span class="line"><span style="color: #DCDCAA">tact</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">call</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">get</span><span style="color: #D4D4D4">               </span><span style="color: #6A9955"># ステート読み出し</span></span></code></pre></div>



<h3 class="wp-block-heading">デバッグ &amp; テスト</h3>



<ul class="wp-block-list">
<li><strong>toncli test</strong>：ローカル TVM を起動し、FunC スクリプトで単体テスト</li>



<li><strong>tact test</strong>：Jest 風シンタックスで記述。<code>expect(counter.get()).toBe(1)</code> のように直感的</li>
</ul>



<h3 class="wp-block-heading">RPC &amp; フロントエンド</h3>



<p class="wp-block-paragraph"><code>TonWeb.js</code> を使えば React/Next.js から TVM RPC を呼び出し可能。<code>wallet.sendTransaction</code> でチャットボット経由の送金も簡単に実装できます。</p>



<h2 class="wp-block-heading">エコシステムを形作る 6 つのレイヤー</h2>



<h3 class="wp-block-heading">インフラレイヤー</h3>



<ul class="wp-block-list">
<li><strong>Ton Access</strong>：Alchemy/Infura 的サービス。1 日 3 億 RPC を処理。</li>



<li><strong>TonDNS</strong>：ウォレットアドレスを <code>.ton</code> ドメインへマッピング。25 万登録突破。</li>



<li><strong>Validator Pool</strong>：8 億 TON（約 20 億 USD）がステーキング。年利 5 %。</li>
</ul>



<h3 class="wp-block-heading">DeFi レイヤー</h3>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>プロジェクト</th><th>TVL</th><th>特色</th></tr></thead><tbody><tr><td><strong>STON.fi</strong></td><td>150 M USD</td><td>ガス 0.04 %・Telegram ミニアプリ対応</td></tr><tr><td><strong>TonCredit</strong></td><td>65 M</td><td>オラクルに Chainlink 移植</td></tr><tr><td><strong>bemo</strong></td><td>90 M</td><td>stTON 発行、年利 6 %</td></tr></tbody></table></div></figure>



<p class="wp-block-paragraph">ガス代が 0.005 TON（約 0.01 USD）と極小なため、先物 AMM やオプション DEX のテストも進行中です。</p>



<h3 class="wp-block-heading">NFT &amp; デジタルアセット</h3>



<ul class="wp-block-list">
<li><strong>Getgems</strong>：取引高 3 億 USD。Compressed NFT でミントガス 90 % 削減。</li>



<li><strong>Fragment</strong>：Telegram ハンドルネーム NFT。最高落札は “@news” で 2.4 M TON。</li>



<li><strong>TON Diamonds</strong>：リアル宝石と連動するラグジュアリー NFT。</li>
</ul>



<h3 class="wp-block-heading">GameFi &amp; ミニアプリ</h3>



<ul class="wp-block-list">
<li><strong>TON Farm</strong>：MAU 120 万。Tap‑to‑Earn＋広告収益分配。</li>



<li><strong>Catizens</strong>：NFT アバターゲーム。Unity + TVM で低遅延。</li>



<li><strong>Tonopoly</strong>：不動産ボードゲーム β。オンチェーン土地所有。</li>
</ul>



<p class="wp-block-paragraph">Telegram ミニアプリ API を活用し、アプリダウンロード不要で即プレイ可能。オンボーディングが従来 GameFi の 10 分の 1 に短縮され、DAU が爆発的に増加しています。</p>



<h3 class="wp-block-heading">Social / DAO レイヤー</h3>



<ul class="wp-block-list">
<li><strong>TonVote</strong>：Quadratic Voting 採用。200 DAO が利用。</li>



<li><strong>TonTips</strong>：チャット投げ銭。1 日 5 万件のマイクロ決済。</li>



<li><strong>TonID</strong>：ソウルバウンドトークンで信用スコアを可視化し、DeFi 金利に反映。</li>
</ul>



<h3 class="wp-block-heading">リアルアセット / CBDC</h3>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>国・企業</th><th>ステータス</th><th>詳細</th></tr></thead><tbody><tr><td>UAE 中央銀行</td><td>PoC 完了</td><td>CBDC Workchain、ガス無料</td></tr><tr><td>カザフスタン郵政</td><td>テスト中</td><td>国際送金ブリッジで手数料 70 % 削減</td></tr><tr><td>Warner&nbsp;Music ME</td><td>提携</td><td>アーティスト NFT とストリーミングロイヤリティ連動</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading">トークン経済とステーキング</h2>



<p class="wp-block-paragraph">TON コインは追加発行がなく、手数料バーンで実質デフレ設計。現在流通量 3.4 B、PoW Giver 残高 1.6 B はエコシステム拡大に合わせて徐々に放出されます。<br>ステーキングは最低 10 k TON から。委任ステークも可能で、年利 4〜7 % を獲得できます。</p>



<h2 class="wp-block-heading">資金調達とコミュニティ支援</h2>



<ul class="wp-block-list">
<li><strong>TONcoin.Fund</strong>：1.5 億 USD。DeFi・GameFi・AI×Web3 にフォーカス。</li>



<li><strong>TON Grants</strong>：年間 500 万 USD。ドキュメント翻訳やライブラリ開発も対象。</li>



<li><strong>Hack‑a‑TON</strong>：四半期開催。前回は 1,200 名が参加し、30 万 USD を分配。</li>
</ul>



<p class="wp-block-paragraph">コミュニティ指標（2024 年 5 月時点）</p>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>指標</th><th>数値</th></tr></thead><tbody><tr><td>Telegram ユーザー</td><td>890 k</td></tr><tr><td>GitHub Stars</td><td>17 k</td></tr><tr><td>月間トランザクション</td><td>210 M</td></tr><tr><td>バリデータ数</td><td>392</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading">ロードマップ</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>期</th><th>予定</th></tr></thead><tbody><tr><td>2024 Q3</td><td>Tact v1.0、EVM Workchain β</td></tr><tr><td>2024 Q4</td><td>zk‑TON 研究成果、NFT 圧縮 v2</td></tr><tr><td>2025 H1</td><td>Global Name Service と Telegram 完全統合</td></tr><tr><td>2025 H2</td><td>クロスチェーン IBC ブリッジ、AI オラクル実装</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading">強みと課題</h2>



<p class="wp-block-paragraph"><strong>強み</strong></p>



<ul class="wp-block-list">
<li>Telegram ネイティブ UX により 10 億人規模の潜在市場</li>



<li>動的シャーディングで理論無限スケール、ガス極小</li>



<li>FunC／Tact／Solidity（予定）の多言語サポートと豊富なグラント</li>
</ul>



<p class="wp-block-paragraph"><strong>課題</strong></p>



<ul class="wp-block-list">
<li>バリデータのさらなる分散化と地域多様性</li>



<li>ドキュメントのアップデートと国際化対応</li>



<li>Telegram 依存による規制リスクとサービスポリシー変更</li>
</ul>



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



<p class="wp-block-paragraph">TON は「メッセンジャー×ブロックチェーン」という唯一無二のポジションで、UX とスケーラビリティを両立した稀有なレイヤー1です。DeFi・NFT・GameFi から CBDC まで六層エコシステムが拡大し、資金と開発者が急速に集結しています。<br>開発者は <code>toncli</code> や <code>tact</code> で数分でスマートコントラクトをデプロイでき、ユーザーは Telegram だけで暗号資産を管理可能。<strong>マスアダプションに最も近いチェーン</strong> と呼ばれる理由はここにあります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-ton-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Venom Blockchainを解説！規制準拠・超高速・マルチチェーン対応のWeb3インフラと開発手順</title>
		<link>https://techgrowup.net/blockchain-venom/</link>
					<comments>https://techgrowup.net/blockchain-venom/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sat, 12 Apr 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[CBDC]]></category>
		<category><![CDATA[DeFi]]></category>
		<category><![CDATA[GameFi]]></category>
		<category><![CDATA[TVM]]></category>
		<category><![CDATA[Venom]]></category>
		<category><![CDATA[Venom Foundation]]></category>
		<category><![CDATA[シャーディング]]></category>
		<category><![CDATA[規制準拠]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2764</guid>

					<description><![CDATA[はじめに 近年、レイヤー 1 ブロックチェーンは「スケーラビリティ」「規制対応」「開発者体験」の三つ巴で競争が激化しています。イーサリアムはスマートコントラクトを世に広めたものの、ガス高騰やトランザクション遅延が常態化し [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading"><strong>はじめに</strong></h1>



<p class="wp-block-paragraph">近年、レイヤー 1 ブロックチェーンは「<strong>スケーラビリティ</strong>」「<strong>規制対応</strong>」「<strong>開発者体験</strong>」の三つ巴で競争が激化しています。イーサリアムはスマートコントラクトを世に広めたものの、ガス高騰やトランザクション遅延が常態化し、金融機関や政府機関が求めるコンプライアンス要件を満たすにはまだ課題が残ります。そこで登場したのが <strong>Venom&nbsp;Blockchain</strong> です。</p>



<p class="wp-block-paragraph">Venom はアブダビ金融自由区 (<strong>ADGM</strong>) でレイヤー 1 として初の規制認可を取得したチェーンで、<strong>動的シャーディング</strong> と <strong>PoS+BFT 合意</strong> により理論上ほぼ無限にスケールします。また、<strong>TVM（TON Virtual Machine）</strong> を基盤に複数言語でのスマートコントラクト開発を可能にし、今後は EVM 互換レイヤーも提供予定です。さらに「パブリック＋プライベート」のハイブリッド設計により、CBDC や国際決済など“現実世界”のユースケースを強く意識している点が特徴です。本記事では Venom の技術アーキテクチャ、開発フロー、ユースケース、トークン経済、ロードマップを 詳しく解説します。</p>



<h2 class="wp-block-heading"><strong>Venom が目指すもの</strong></h2>



<h3 class="wp-block-heading"><strong>規制対応を前提とした設計</strong></h3>



<p class="wp-block-paragraph">多くのパブリックチェーンは「Permissionless」を掲げつつも、法規制と衝突しやすいというジレンマを抱えています。Venom は <strong>ADGM のデジタル資産フレームワーク</strong> に準拠し、<strong>KYC/AML モジュール</strong> をチェーンレベルで実装しました。アカウントごとに「認証済み」「制限付き」「匿名」などのステータスを付与でき、スマートコントラクトは実行時にコンプライアンスチェックを行えます。これにより銀行や中央銀行でも利用可能なレベルの規制遵守が実現します。</p>



<h3 class="wp-block-heading"><strong>ユニバーサル・ブロックチェーン構想</strong></h3>



<p class="wp-block-paragraph">Venom は「<strong>一つのプラットフォームで多様なニーズを満たす</strong>」ことを掲げ、パブリックチェーンとしてのオープン性と、プライベートチェーン並みのカスタマイズ性を両立させています。企業や政府は独自の <strong>Workchain</strong> を立ち上げ、独自ガスモデルや VM を設定可能。公共チェーンのセキュリティを享受しつつ、ニッチな要件に合わせたルールを運用できます。</p>



<h2 class="wp-block-heading"><strong>技術アーキテクチャの詳細</strong></h2>



<h3 class="wp-block-heading"><strong>1. 動的シャーディング</strong></h3>



<p class="wp-block-paragraph">従来の固定シャーディングはシャード数が不足するとボトルネックになります。Venom の <strong>Dynamic&nbsp;Sharding</strong> はネットワーク負荷を監視し、しきい値を超えると <strong>Shardchain</strong> を自動増設。逆に負荷が下がればシャードを統合し、リソースを節約します。これにより TPS は需要に応じて線形に伸び、理論値で <strong>10 万 TPS</strong> 超を目指しています。</p>



<h3 class="wp-block-heading"><strong>2. PoS+BFT 合意</strong></h3>



<p class="wp-block-paragraph">バリデータは <strong>VENOM</strong> をステークし、ラウンドロビンでブロック提案。次に BFT 投票フェーズで 2/3 以上の署名が揃えば 1–2 秒でブロックが確定します。フォークが発生しにくく、最終性が速いため金融決済に適しています。</p>



<h3 class="wp-block-heading"><strong>3. TVM と多言語サポート</strong></h3>



<p class="wp-block-paragraph">Venom は TON 系列の <strong>TVM</strong> を採用し、</p>



<ul class="wp-block-list">
<li><strong>FunC</strong>: TVM ネイティブの関数型言語</li>



<li><strong>Solidity</strong>: EVM ライクな言語。EVM 互換レイヤーで動作予定</li>



<li><strong>C++/Rust</strong>: 高速ネイティブコードを呼び出す FFI を提供します。開発者はパフォーマンス重視なら FunC/C++、既存 DApp 移植なら Solidity を選択できます。</li>
</ul>



<h2 class="wp-block-heading">開発者体験を掘り下げる</h2>



<h3 class="wp-block-heading">CLI と SDK</h3>



<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="npm i -g venom-dev           # CLI インストール
venom-dev init counter-func  # テンプレート生成
cd counter-func" 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: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">i</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-g</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">venom-dev</span><span style="color: #D4D4D4">           </span><span style="color: #6A9955"># CLI インストール</span></span>
<span class="line"><span style="color: #DCDCAA">venom-dev</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">init</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">counter-func</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># テンプレート生成</span></span>
<span class="line"><span style="color: #DCDCAA">cd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">counter-func</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>counter.fc</code> を編集したら、</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="venom-dev compile counter.fc
venom-dev deploy counter.tvc --value 10" 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: #DCDCAA">venom-dev</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">compile</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">counter.fc</span></span>
<span class="line"><span style="color: #DCDCAA">venom-dev</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">deploy</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">counter.tvc</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--value</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">10</span></span></code></pre></div>



<p class="wp-block-paragraph">わずか数コマンドでテストネットにデプロイ可能。今後 Hardhat プラグインがリリースされれば、Solidity 開発者は <code>npx hardhat run</code> でそのまま Venom をターゲットにできます。</p>



<h3 class="wp-block-heading">アカウント抽象化とガスレス UX</h3>



<p class="wp-block-paragraph">Venom&nbsp;Wallet は <strong>Account Abstraction</strong> を実装しており、</p>



<ul class="wp-block-list">
<li>ガス代を第三者がスポンサー</li>



<li>ソーシャルリカバリーで秘密鍵紛失を救済</li>



<li>マルチシグ＋ハードウェア署名を標準化<br>といった高度な UX をネイティブでサポートします。</li>
</ul>



<h2 class="wp-block-heading">ユースケースをさらに具体化</h2>



<h3 class="wp-block-heading">1. 中央銀行デジタル通貨 (CBDC)</h3>



<p class="wp-block-paragraph">UAE や GCC 諸国ではクロスボーダー決済コスト削減が急務です。Venom の <strong>Workchain</strong> に政府専用チェーンを作り、</p>



<ol class="wp-block-list">
<li>法定通貨を 1:1 でトークン化</li>



<li>銀行 KYC アカウントのみ転送可能</li>



<li>決済完了後にリアルタイムで FX 清算<br>というフローを実証中と報じられています。</li>
</ol>



<h3 class="wp-block-heading">2. 規制対応 DeFi</h3>



<p class="wp-block-paragraph">DEX「<strong>VenomSwap</strong>」では、匿名ユーザーは 1 日取引上限が設けられ、KYC 済みアカウントは上限なしという <strong>コンプライアンス階層</strong> がスマートコントラクトで自動適用されます。これにより機関投資家も参入しやすい環境を構築しています。</p>



<h3 class="wp-block-heading">3. GameFi のマスアダプション</h3>



<ul class="wp-block-list">
<li><strong>シャード毎にワールド分割</strong> → 同時接続 100 万人規模でも遅延 1 秒以下</li>



<li><strong>NFT ロイヤリティ</strong> を DAO 投票で動的変更</li>



<li><strong>ガスレス取引</strong> でカジュアルユーザーをオンボード</li>
</ul>



<h2 class="wp-block-heading">VENOM トークン経済を深堀り</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>指標</th><th>数値</th><th>解説</th></tr></thead><tbody><tr><td>初期供給</td><td>7.2 B</td><td>うち 25 % が財団ロック、10 % がエコシステム報奨</td></tr><tr><td>ステーキング最小額</td><td>10 k VENOM</td><td>誰でもライトノードを立て委任ステーク可</td></tr><tr><td>手数料バーン率</td><td>50 %</td><td>ネットワーク利用が増えるほど供給圧縮</td></tr><tr><td>インフレ上限</td><td>1 %/年</td><td>ステーキング報酬で調整、実質デフレを狙う</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading">他チェーンとの比較で見える強み</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>チェーン</th><th>規制準拠</th><th>シャーディング</th><th>ファイナリティ</th><th>ガスコスト</th><th>対象市場</th></tr></thead><tbody><tr><td><strong>Venom</strong></td><td>◎ (ADGM)</td><td>動的</td><td>1–2 秒</td><td>低</td><td>金融・政府</td></tr><tr><td>Ethereum</td><td>△</td><td>×</td><td>12 分</td><td>高</td><td>汎用</td></tr><tr><td>Polygon</td><td>△</td><td>×</td><td>2 秒</td><td>低</td><td>消費者DApp</td></tr><tr><td>Solana</td><td>△</td><td>×</td><td>&lt;1 秒</td><td>低</td><td>DeFi/ゲーム</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading">今後のロードマップ詳細</h2>



<ol class="wp-block-list">
<li><strong>2024 Q3</strong>
<ul class="wp-block-list">
<li>EVM 互換レイヤー β公開</li>



<li>Venom DEX V1 ローンチ（KYC レイヤー組込）</li>
</ul>
</li>



<li><strong>2024 Q4</strong>
<ul class="wp-block-list">
<li>CBDC Pilot Workchain を GCC 2 か国でテスト運用</li>



<li>ZK‑KYC SDK リリース（個人情報を秘匿したままコンプライアンス証明）</li>
</ul>
</li>



<li><strong>2025 H1</strong>
<ul class="wp-block-list">
<li>クロスチェーンブリッジ（Polkadot IBC・Cosmos IBC）</li>



<li>Workchain as‑a‑Service ポータル公開（企業向けクリックデプロイ）</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading">開発を始めるためのチェックリスト</h2>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>ステップ</th><th>目的</th><th>参考コマンド</th></tr></thead><tbody><tr><td>1</td><td>Wallet インストール</td><td><a target="_self" class="">https://venom.network/wallet</a></td></tr><tr><td>2</td><td>テストトークン取得</td><td>Faucet ボタンをクリック</td></tr><tr><td>3</td><td>CLI セットアップ</td><td><code>npm i -g venom-dev</code></td></tr><tr><td>4</td><td>テンプレ生成</td><td><code>venom-dev init mytoken</code></td></tr><tr><td>5</td><td>コントラクト実装</td><td><code>vim token.fc</code></td></tr><tr><td>6</td><td>コンパイル</td><td><code>venom-dev compile token.fc</code></td></tr><tr><td>7</td><td>デプロイ</td><td><code>venom-dev deploy token.tvc --value 20</code></td></tr><tr><td>8</td><td>ブロックエクスプローラ確認</td><td>explorer.venom.network</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading">課題とリスク</h2>



<ol class="wp-block-list">
<li><strong>エコシステム形成</strong><br>新興チェーンゆえに DApp 数・TVL はまだ少ない。財団は 10 億 USD 規模のファンドで開発者誘致を進行中。</li>



<li><strong>複雑なシャーディング</strong><br>動的シャードは運用オーバーヘッドが高く、バリデータソフトの最適化が必須。</li>



<li><strong>規制と分散性のバランス</strong><br>KYC/AML を強制し過ぎるとパーミッションレスの精神が損なわれる可能性。</li>
</ol>



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



<p class="wp-block-paragraph">Venom&nbsp;Blockchain は <strong>規制準拠</strong> と <strong>超高速スケーラビリティ</strong> を両立させた稀有なレイヤー 1 です。</p>



<ul class="wp-block-list">
<li><strong>ADGM 承認</strong>で金融機関・政府案件に適合</li>



<li><strong>動的シャーディング + PoS+BFT</strong> で理論 10 万 TPS を目指す</li>



<li><strong>TVM &amp; マルチ言語</strong>により FunC/C++ から Solidity まで幅広く対応予定</li>



<li><strong>Workchain</strong> で用途別チェーンをワンクリック構築</li>
</ul>



<p class="wp-block-paragraph">DeFi・GameFi はもちろん、CBDC や国際決済のインフラとしても期待が高まる Venom。まずはテストネットで Wallet と CLI をセットアップし、FunC で “Hello&nbsp;Venom” コントラクトをデプロイしてみましょう。次世代 Web3 インフラの可能性を体感できるはずです。</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-venom/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-05-23 08:40:41 by W3 Total Cache
-->