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

<channel>
	<title>ビットコイン</title>
	<atom:link href="https://techgrowup.net/tag/%e3%83%93%e3%83%83%e3%83%88%e3%82%b3%e3%82%a4%e3%83%b3/feed/" rel="self" type="application/rss+xml" />
	<link>https://techgrowup.net</link>
	<description>エンジニアを強くする</description>
	<lastBuildDate>Sun, 23 Mar 2025 03:08:49 +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>はじめての暗号通貨解説！仕組み・メリット・リスク・将来性までをわかりやすく紹介</title>
		<link>https://techgrowup.net/blockchain-cyrptocurrency/</link>
					<comments>https://techgrowup.net/blockchain-cyrptocurrency/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sun, 23 Mar 2025 03:08:49 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[イーサリアム]]></category>
		<category><![CDATA[ウォレット]]></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=2688</guid>

					<description><![CDATA[はじめに 暗号通貨（仮想通貨）は、2009年にビットコインが登場して以来、金融の世界を大きく揺るがす存在となりました。値動きが激しい投資商品のイメージを持つ方も多いかもしれませんが、実はブロックチェーン技術による革新的な [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">暗号通貨（仮想通貨）は、2009年にビットコインが登場して以来、金融の世界を大きく揺るがす存在となりました。値動きが激しい投資商品のイメージを持つ方も多いかもしれませんが、実はブロックチェーン技術による革新的な仕組みが背景にあり、その応用範囲は金融以外の分野にも広がっています。<br>本記事では、暗号通貨の基礎知識や特徴、メリット・デメリット、今後の展望について丁寧に解説します。初心者から中級者まで理解を深められる内容となっていますので、ぜひ最後までお読みください。</p>



<h2 class="wp-block-heading">暗号通貨とは？</h2>



<h3 class="wp-block-heading">暗号通貨の定義</h3>



<p class="wp-block-paragraph">暗号通貨（Cryptocurrency）は、**暗号技術（暗号学）**を用いて取引を保護し、通貨の新規発行を制御するデジタル資産を指します。法定通貨（フィアット）とは異なり、中央銀行や政府が管理せず、分散型のブロックチェーン上で運用されるのが特徴です。</p>



<h3 class="wp-block-heading">ブロックチェーンと分散管理</h3>



<p class="wp-block-paragraph">暗号通貨を理解するには、<strong>ブロックチェーン</strong>という分散型台帳技術を避けて通れません。ブロックチェーンは、複数のノード（コンピュータ）が同じデータを保持し、取引を検証・承認し合う仕組みです。これにより、一元的な管理者がいなくても信頼性と改ざん耐性を担保できます。</p>



<ul class="wp-block-list">
<li><strong>取引の流れ（イメージ）</strong>
<ol class="wp-block-list">
<li>ユーザーが取引を発行</li>



<li>全ノードに取引データがブロードキャスト</li>



<li>マイナーまたはバリデーターが取引を検証してブロックにまとめる</li>



<li>ブロックがチェーンにつながり、不可逆的に記録される</li>
</ol>
</li>
</ul>



<h3 class="wp-block-heading">中央集権型と分散型の違い</h3>



<p class="wp-block-paragraph">従来の銀行システムでは、中央サーバーや管理者がすべての取引データを管理していました。しかし暗号通貨の世界では、多数のノードが共通の台帳を分散して保持するため、単一の障害点が存在せず、特定の組織がデータを改ざんするリスクを大幅に低減できます。</p>



<h2 class="wp-block-heading">代表的な暗号通貨の例</h2>



<h3 class="wp-block-heading">ビットコイン（Bitcoin）</h3>



<p class="wp-block-paragraph">2009年にサトシ・ナカモトと名乗る人物（またはグループ）が発表したビットコインは、暗号通貨の先駆けとして知られています。Proof of Work（PoW）という合意形成アルゴリズムを採用し、マイナーが膨大な計算力を投じてブロック生成を競い合うことで、ネットワークの安全性を維持しています。</p>



<h3 class="wp-block-heading">イーサリアム（Ethereum）</h3>



<p class="wp-block-paragraph">ビットコインより後に登場し、スマートコントラクト機能を備えたことで大きな注目を集めたのがイーサリアムです。スマートコントラクトにより、自律的に実行されるプログラムをチェーン上に配置でき、分散型アプリケーション（DApp）の基盤として活用されるケースが増えています。</p>



<h3 class="wp-block-heading">その他の暗号通貨</h3>



<ul class="wp-block-list">
<li><strong>リップル（XRP）</strong>: 国際送金の高速化を狙うプロジェクト。銀行や金融機関との連携が盛ん</li>



<li><strong>ライトコイン（LTC）</strong>: ビットコインに比べトランザクション処理が高速</li>



<li><strong>BNB</strong>: 大手取引所バイナンスが発行するユーティリティトークンで、取引手数料の割引等に利用される</li>



<li><strong>ステーブルコイン</strong>: 米ドルなどの法定通貨と連動するよう設計された暗号通貨（USDT, USDCなど）</li>
</ul>



<h2 class="wp-block-heading">暗号通貨の仕組み</h2>



<h3 class="wp-block-heading">マイニング（PoW）の仕組み</h3>



<p class="wp-block-paragraph">ビットコインなどの暗号通貨では、マイナーが取引をまとめたブロックを生成する際、特定のハッシュ値を求める膨大な計算を行います。条件を満たすノンス（nonce）を見つけた最初のマイナーがブロックを承認でき、報酬（新たに発行されるコインと取引手数料）を得る仕組みです。</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 hashlib
import random

# PoWを簡単にシミュレートするコード例
def mine_block(block_data, difficulty=4):
    nonce = 0
    prefix = &quot;0&quot; * difficulty
    while True:
        text = f&quot;{block_data}{nonce}&quot;
        hash_val = hashlib.sha256(text.encode()).hexdigest()
        if hash_val.startswith(prefix):
            return nonce, hash_val
        nonce += 1

if __name__ == &quot;__main__&quot;:
    block_data = &quot;Block #1: Transaction data here&quot;
    found_nonce, block_hash = mine_block(block_data)
    print(f&quot;Found nonce = {found_nonce}, Hash = {block_hash}&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: #C586C0">import</span><span style="color: #D4D4D4"> hashlib</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> random</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># PoWを簡単にシミュレートするコード例</span></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">mine_block</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">block_data</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">difficulty</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    nonce = </span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">    prefix = </span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #D4D4D4"> * difficulty</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">True</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        text = </span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">block_data</span><span style="color: #569CD6">}{</span><span style="color: #D4D4D4">nonce</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        hash_val = hashlib.sha256(text.encode()).hexdigest()</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> hash_val.startswith(prefix):</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> nonce, hash_val</span></span>
<span class="line"><span style="color: #D4D4D4">        nonce += </span><span style="color: #B5CEA8">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">__name__</span><span style="color: #D4D4D4"> == </span><span style="color: #CE9178">&quot;__main__&quot;</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    block_data = </span><span style="color: #CE9178">&quot;Block #1: Transaction data here&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    found_nonce, block_hash = mine_block(block_data)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;Found nonce = </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">found_nonce</span><span style="color: #569CD6">}</span><span style="color: #CE9178">, Hash = </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">block_hash</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph">このコードは極めて単純化した例ですが、<code>difficulty=4</code>（先頭4桁が0）を満たすハッシュを探すために<code>nonce</code>を increment しながら試行錯誤します。実際のビットコインでは先頭に連続する0の数がもっと多く、莫大な計算力が必要です。</p>



<h3 class="wp-block-heading">合意形成アルゴリズム</h3>



<ul class="wp-block-list">
<li><strong>Proof of Work（PoW）</strong>: 膨大な計算力を使う。ビットコインや初期イーサリアムが採用</li>



<li><strong>Proof of Stake（PoS）</strong>: コイン保有量に応じてブロック生成権を与える。イーサリアムがThe Mergeにより移行（2022年）</li>



<li><strong>Delegated Proof of Stake（DPoS）</strong>: 投票で選ばれた代表ノードがブロックを生成。EOSやTRONなど</li>
</ul>



<p class="wp-block-paragraph">どのアルゴリズムも、<strong>分散ネットワークを安全に保つ</strong>ための仕組みという点では共通しており、プロジェクトの方針や実用性に応じて適切な方式が選ばれます。</p>



<h3 class="wp-block-heading">ウォレットと秘密鍵</h3>



<p class="wp-block-paragraph">暗号通貨を管理する際には、<strong>秘密鍵</strong>が大切な役割を果たします。秘密鍵は資産を引き出したり送金したりする際に必要な署名を作るもので、ウォレット（ソフトウェアやハードウェア）はこの秘密鍵を安全に保管するツールです。</p>



<ul class="wp-block-list">
<li><strong>ソフトウェアウォレット</strong>: スマホアプリやPCソフト。利用が簡単だが、セキュリティリスクは高め</li>



<li><strong>ハードウェアウォレット</strong>: USBデバイスのように物理デバイスで秘密鍵を管理。安全性は高いが紛失リスクに注意</li>
</ul>



<h2 class="wp-block-heading">暗号通貨のメリット</h2>



<ol class="wp-block-list">
<li><strong>中央管理者不要</strong><br>国や銀行など、単一の管理主体に依存しないため、検閲耐性やシステムダウンのリスクが低い。</li>



<li><strong>グローバルな送金が容易</strong><br>銀行を介さずに、世界中へ24時間365日、比較的低コストで送金可能。</li>



<li><strong>トレーサビリティと透明性</strong><br>すべての取引履歴がブロックチェーンに記録され、誰でも検証できる（公開型の場合）。</li>



<li><strong>分散型アプリケーションの基盤</strong><br>スマートコントラクトにより、金融に限らずさまざまな業務を自動化できる。</li>



<li><strong>インフレ対策になる可能性</strong><br>ビットコインのように発行上限が設定されている通貨は、法定通貨と比べてインフレリスクが抑えられるとの見方も。</li>
</ol>



<h2 class="wp-block-heading">暗号通貨のリスクとデメリット</h2>



<ol class="wp-block-list">
<li><strong>価格変動が激しい</strong><br>投機的な売買により価格が乱高下し、大きな損失リスクを抱える場合がある。</li>



<li><strong>規制や法整備の不透明さ</strong><br>国や地域によって規制が異なり、今後の法制度の変化で大きく環境が変わる可能性。</li>



<li><strong>セキュリティや紛失リスク</strong><br>秘密鍵を紛失すると資産を永久に失う恐れがある。取引所のハッキング事例もあり。</li>



<li><strong>環境負荷（PoWの場合）</strong><br>マイニングに大量の電力が必要となる問題（イーサリアムはPoS移行で削減に成功）。</li>



<li><strong>利用ハードルの高さ</strong><br>ウォレット設定や秘密鍵管理など、一般ユーザーにはまだ敷居が高い部分がある。</li>
</ol>



<h2 class="wp-block-heading">暗号通貨の活用事例</h2>



<h3 class="wp-block-heading">1. 送金と決済</h3>



<p class="wp-block-paragraph">スターバックスやマイクロソフトなど、一部企業ではビットコインやその他暗号通貨での支払いを試験的に受け付けています。海外送金を簡易・低コストに行う手段としても注目されています。</p>



<h3 class="wp-block-heading">2. DeFi（分散型金融）</h3>



<p class="wp-block-paragraph">スマートコントラクトを活用し、仲介者不在での資金借入や貸出、取引所機能を実現する仕組み。大手DeFiプラットフォームには、数十億ドルの資金がロックされる規模に成長している例もあります。</p>



<h3 class="wp-block-heading">3. NFTとデジタルアセット</h3>



<p class="wp-block-paragraph">ブロックチェーン上で唯一性を証明できるNFTによって、デジタルアートやゲームアイテムの売買が活発化。メタバースやコレクターズ市場を中心に人気が拡大しています。</p>



<h3 class="wp-block-heading">4. サプライチェーン管理</h3>



<p class="wp-block-paragraph">物流や食品トレーサビリティなどにブロックチェーンを導入し、偽造品対策や品質管理の効率化を図る事例が増えています。暗号通貨という形ではなく、トークンを使ったインセンティブ設計が注目されるケースも。</p>



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



<h3 class="wp-block-heading">規制と普及のバランス</h3>



<p class="wp-block-paragraph">各国が暗号通貨をどのように規制するかは、今後の価格や普及度合いに大きな影響を与えます。厳しい規制がかかれば市場は縮小傾向になる可能性もありますが、明確な法整備が進めば機関投資家の参入が増えるとの見方もあります。</p>



<h3 class="wp-block-heading">ステーブルコインの進化</h3>



<p class="wp-block-paragraph">米ドルなど法定通貨と価値を連動する「ステーブルコイン」は、ボラティリティを抑えつつブロックチェーンの利便性を活かせる点が注目されています。CBDC（中央銀行デジタル通貨）との競合・共存など、今後の動向が要注目です。</p>



<h3 class="wp-block-heading">Web3とメタバース</h3>



<p class="wp-block-paragraph">ブロックチェーン技術が支える「Web3」や「メタバース」は、暗号通貨に新たなユースケースをもたらす可能性があります。デジタル空間での経済活動やアイテム所有、DAO（分散型自律組織）によるコミュニティガバナンスなど、暗号通貨が次世代のインターネット基盤の一部となるシナリオが期待されています。</p>



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



<p class="wp-block-paragraph">暗号通貨は、中央管理者を排除したブロックチェーン技術によって、世界中の人々が自由に価値を交換できる新たな仕組みを提供します。ビットコインやイーサリアムなどの主要通貨は投資商品としての認知度も高まっていますが、その本質は<strong>分散型ネットワークを通じたセキュアかつ透明性の高い取引インフラ</strong>と言えます。</p>



<ol class="wp-block-list">
<li><strong>仕組み</strong>: 暗号技術とブロックチェーンにより改ざん耐性を確保</li>



<li><strong>メリット</strong>: 検閲耐性、24時間送金、グローバルアクセス</li>



<li><strong>デメリット</strong>: 価格変動、規制リスク、セキュリティ管理の難しさ</li>



<li><strong>ユースケース</strong>: 支払い、DeFi、NFT、サプライチェーン管理など多岐にわたる</li>



<li><strong>今後の展望</strong>: 規制整備、ステーブルコインの拡大、Web3・メタバースとの融合</li>
</ol>



<p class="wp-block-paragraph">投資目的だけでなく、技術や社会インフラとしての暗号通貨の可能性は非常に大きいです。ブロックチェーン技術が進化を続ける限り、暗号通貨も新たな応用分野やビジネスチャンスを生み出していくでしょう。興味を持たれた方は、ぜひウォレットの基本的な使い方やリスク管理を学び、小額から体験してみるのがおすすめです。短期的な価格だけに振り回されず、長期的な視点で「ブロックチェーンがもたらす社会変革」を見据えながら、暗号通貨という新しい領域に触れてみてはいかがでしょうか。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-cyrptocurrency/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>仮想通貨フォークの仕組みを解説：ハードフォークとソフトフォークの違いから起こりうる影響まで詳しく紹介</title>
		<link>https://techgrowup.net/blockchain-fork/</link>
					<comments>https://techgrowup.net/blockchain-fork/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Fri, 21 Mar 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[アップグレード]]></category>
		<category><![CDATA[イーサリアム]]></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=2683</guid>

					<description><![CDATA[はじめに ビットコインやイーサリアムといった仮想通貨（暗号資産）の世界では、フォーク（Fork） という言葉をしばしば耳にします。これは、ブロックチェーンのルールやプロトコルを変更した結果、元のチェーンから分岐する現象を [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">ビットコインやイーサリアムといった仮想通貨（暗号資産）の世界では、<strong>フォーク（Fork）</strong> という言葉をしばしば耳にします。これは、ブロックチェーンのルールやプロトコルを変更した結果、元のチェーンから分岐する現象を指します。フォークが発生すると、同じ通貨のバージョン違いが生まれたり、新たなコインが誕生したりと大きな影響を及ぼすことがあるのです。<br>本記事では、フォークの基本的な仕組みや種類、過去に起きた主要な事例をわかりやすく解説します。さらに、開発者向けにフォークに関連するコードサンプルも簡単に紹介していきます。初心者から中級者まで幅広く理解を深められるよう構成しました。</p>



<h2 class="wp-block-heading">フォーク（Fork）とは？</h2>



<h3 class="wp-block-heading">フォークの定義</h3>



<p class="wp-block-paragraph">ブロックチェーンは、分散型ネットワークにおける多数のノードが同意したルール（コンセンサス）をもとにブロックを追加していきます。そのルールやデータ構造を変更しようとすると、「従来のルールを維持するノード」と「新しいルールを採用するノード」の間で相違が生じ、チェーンが分岐することがあります。これが**フォーク（Fork）**の基本概念です。</p>



<h3 class="wp-block-heading">なぜフォークが起こるのか</h3>



<p class="wp-block-paragraph">フォークが起こる理由はさまざまです。代表的なものとしては：</p>



<ol class="wp-block-list">
<li><strong>アップグレード</strong><br>ブロックチェーンの機能を拡張したり、バグを修正するためにルールを変更する場合。</li>



<li><strong>コミュニティの意見対立</strong><br>ネットワーク参加者が新機能の導入や通貨の発行量などについて意見が分かれた場合、分裂して別々のルールを採用するチェーンが生まれる。</li>



<li><strong>安全上の理由</strong><br>重大な脆弱性が見つかり、急ぎ修正を行うフォークを実施することもある。</li>
</ol>



<p class="wp-block-paragraph">いずれの場合も、<strong>どのノードがどのルールを採用するか</strong>によって、チェーンの分岐の有無や新たな通貨の誕生などが変わってきます。</p>



<h2 class="wp-block-heading">フォークの種類</h2>



<p class="wp-block-paragraph">フォークは大きく分けて以下の2種類が存在します。</p>



<h3 class="wp-block-heading">ソフトフォーク（Soft Fork）</h3>



<p class="wp-block-paragraph">ソフトフォークは、<strong>従来のノード</strong>も新しいルールを受け入れられるように設計された後方互換のあるアップグレードです。具体的には、<strong>新ルールに適合しないブロックは拒否される</strong>ものの、新ルールを採用していないノードに対しても互換性が保たれる形になります。<br>例として、ビットコインのSegWit（セグウィット）導入が代表的なソフトフォークです。</p>



<ul class="wp-block-list">
<li><strong>メリット</strong>
<ul class="wp-block-list">
<li>大規模な分裂リスクが低い</li>



<li>新しいノードと古いノードが同じチェーンを維持しやすい</li>
</ul>
</li>



<li><strong>デメリット</strong>
<ul class="wp-block-list">
<li>時に古いノードから新ルールがうまく理解されず、混乱が生じる場合がある</li>



<li>合意形成に時間がかかるケースも</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">ハードフォーク（Hard Fork）</h3>



<p class="wp-block-paragraph">ハードフォークは、<strong>後方互換性がない</strong>形でプロトコルが変更されることを指します。新しいルールにアップデートしたノードと、そうでないノードは互いに<strong>相手が生成するブロックを認識しなくなる</strong>ため、チェーンが分岐する可能性が高いです。</p>



<ul class="wp-block-list">
<li><strong>メリット</strong>
<ul class="wp-block-list">
<li>大幅なアップグレードが可能（通貨仕様やスクリプト仕様の抜本的変更など）</li>



<li>コミュニティが合意していれば大きな性能向上や機能追加が実装できる</li>
</ul>
</li>



<li><strong>デメリット</strong>
<ul class="wp-block-list">
<li>意見が対立するとチェーンが分裂し、新たな通貨が誕生する</li>



<li>ユーザー資産がチェーンごとに複製されるリスクや混乱が生じる</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">代表的な例としては、<strong>イーサリアムとイーサリアムクラシック</strong>の分裂（The DAO事件後のハードフォーク）が挙げられます。</p>



<h2 class="wp-block-heading">フォークの実例</h2>



<h3 class="wp-block-heading">ビットコイン分裂</h3>



<p class="wp-block-paragraph">ビットコインは、過去に複数回のハードフォークを経験しています。特に有名なのが**ビットコインキャッシュ（BCH）**の誕生です。ビットコインのブロックサイズ上限をめぐるコミュニティ内での議論が激化し、大きなブロックサイズを採用したチェーンが誕生。これにより、ビットコインユーザーは保有BTCと同量のBCHを受け取る形となりました。</p>



<h3 class="wp-block-heading">イーサリアムのハードフォーク</h3>



<p class="wp-block-paragraph">2016年に発生した<strong>The DAOハック事件</strong>後、コミュニティはハッキング被害者を救済するためにハードフォークを実施しました。しかし、この対応に反対するグループはオリジナルのチェーンを継続し、<strong>イーサリアムクラシック（ETC）</strong> が誕生。これにより、イーサリアム（ETH）とイーサリアムクラシック（ETC）の2つのチェーンが存在することになりました。</p>



<h3 class="wp-block-heading">ソフトフォーク事例：ビットコインのSegWit</h3>



<p class="wp-block-paragraph">ビットコインにおけるSegWit（Segregated Witness）は、トランザクションの一部データを分離して扱うことでブロックサイズの利用効率を上げたアップグレードです。これはソフトフォークとして実施され、古いノードも新しいトランザクション形式を無視して従来通り稼働できるように設計されました。</p>



<h2 class="wp-block-heading">フォークがユーザーに与える影響</h2>



<h3 class="wp-block-heading">新たなコインの獲得</h3>



<p class="wp-block-paragraph">ハードフォークの場合、多くは「分裂前に保有していたコインと同量の新コインを受け取る」仕組みが生まれます。たとえばビットコインを保有していたユーザーは、ビットコインキャッシュ誕生時に、同量のBCHを手に入れたわけです。ただし、取引所やウォレットが対応しない場合は受け取れないケースもあるため注意が必要です。</p>



<h3 class="wp-block-heading">技術的アップグレードへの対応</h3>



<p class="wp-block-paragraph">ソフトフォークの場合は、通常ユーザーが特別な操作をしなくてもアップグレードの恩恵を受けられます。一方、ハードフォークでは、新しいクライアントソフトウェアを導入するか、旧バージョンのソフトを使い続けるか、ユーザーが選択を迫られることがあります。</p>



<h3 class="wp-block-heading">コミュニティの分裂リスク</h3>



<p class="wp-block-paragraph">フォークに伴う意見の対立が大きい場合、コミュニティが分裂してそれぞれ別のチェーンを推進する可能性があります。これは長期的に見てプロジェクトのブランドや流動性を分散させ、ユーザーに混乱を与える要因にもなります。</p>



<h2 class="wp-block-heading">フォークを実装する立場から：コードサンプル</h2>



<p class="wp-block-paragraph">以下は、<strong>コンセンサスルール</strong>や<strong>ブロック検証ロジック</strong>に変更を加えてハードフォークをシミュレートする、非常に簡略化したPythonコード例です。あくまで学習用デモであり、実際のビットコインやイーサリアムのフォークとは比較にならないほど単純化しています。</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 hashlib

class Block:
    def __init__(self, index, data, previous_hash):
        self.index = index
        self.data = data
        self.previous_hash = previous_hash
        # デフォルトの難易度を0つなが２つという軽めの設定
        self.hash = self.calculate_hash()

    def calculate_hash(self):
        return hashlib.sha256(f&quot;{self.index}{self.data}{self.previous_hash}&quot;.encode()).hexdigest()

# スタンダードチェーンの検証ルール
def validate_block_standard(new_block, previous_block):
    # indexが連続しているか
    if new_block.index != previous_block.index + 1:
        return False
    # ハッシュが先頭2個の0を満たすか(軽い難易度例)
    return new_block.hash.startswith(&quot;00&quot;)

# 新ルール（ハードフォーク後）の検証ルール（例えば先頭3個の0を要求する）
def validate_block_hardfork(new_block, previous_block):
    if new_block.index != previous_block.index + 1:
        return False
    return new_block.hash.startswith(&quot;000&quot;)

# チェーンを生成しつつ、どの検証ルールで進めるかを分岐
def mine_block(index, data, prev_hash, difficulty):
    nonce = 0
    while True:
        candidate_block = Block(index, f&quot;{data}-{nonce}&quot;, prev_hash)
        # difficultyに応じて先頭の0を増やす
        if candidate_block.hash.startswith(&quot;0&quot; * difficulty):
            return candidate_block
        nonce += 1

def main():
    # 初期ブロック(ジェネシス)
    genesis = Block(0, &quot;Genesis&quot;, &quot;0&quot;)
    chain_standard = [genesis]
    chain_forked = [genesis]

    # ルールは最初は先頭2個の0
    difficulty_standard = 2

    # チェーンを少し延ばす
    for i in range(1, 4):
        prev_block = chain_standard[-1]
        new_block = mine_block(i, f&quot;Block{i}&quot;, prev_block.hash, difficulty_standard)
        chain_standard.append(new_block)

    # ハードフォーク後は先頭3個の0を要求
    difficulty_forked = 3

    # ハードフォークが起きたと仮定し、同じブロックindexから新ルールチェーンを生成
    for i in range(1, 4):
        prev_block = chain_forked[-1]
        new_block = mine_block(i, f&quot;ForkedBlock{i}&quot;, prev_block.hash, difficulty_forked)
        chain_forked.append(new_block)

    # 結果出力
    print(&quot;Standard Chain:&quot;)
    for b in chain_standard:
        print(f&quot;Index: {b.index}, Hash: {b.hash[:10]}..., Data: {b.data}&quot;)

    print(&quot;\nForked Chain:&quot;)
    for b in chain_forked:
        print(f&quot;Index: {b.index}, Hash: {b.hash[:10]}..., Data: {b.data}&quot;)

if __name__ == &quot;__main__&quot;:
    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: #C586C0">import</span><span style="color: #D4D4D4"> hashlib</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Block</span><span style="color: #D4D4D4">:</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">__init__</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">self</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">previous_hash</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">self</span><span style="color: #D4D4D4">.index = index</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">self</span><span style="color: #D4D4D4">.data = data</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">self</span><span style="color: #D4D4D4">.previous_hash = previous_hash</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># デフォルトの難易度を0つなが２つという軽めの設定</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">self</span><span style="color: #D4D4D4">.hash = </span><span style="color: #569CD6">self</span><span style="color: #D4D4D4">.calculate_hash()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">calculate_hash</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">self</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> hashlib.sha256(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;</span><span style="color: #569CD6">{self</span><span style="color: #D4D4D4">.index</span><span style="color: #569CD6">}{self</span><span style="color: #D4D4D4">.data</span><span style="color: #569CD6">}{self</span><span style="color: #D4D4D4">.previous_hash</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">.encode()).hexdigest()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># スタンダードチェーンの検証ルール</span></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">validate_block_standard</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">new_block</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">previous_block</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># indexが連続しているか</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> new_block.index != previous_block.index + </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">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">False</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># ハッシュが先頭2個の0を満たすか(軽い難易度例)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> new_block.hash.startswith(</span><span style="color: #CE9178">&quot;00&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 新ルール（ハードフォーク後）の検証ルール（例えば先頭3個の0を要求する）</span></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">validate_block_hardfork</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">new_block</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">previous_block</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> new_block.index != previous_block.index + </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">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">False</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> new_block.hash.startswith(</span><span style="color: #CE9178">&quot;000&quot;</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">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">mine_block</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">prev_hash</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">difficulty</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    nonce = </span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">True</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        candidate_block = Block(index, </span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">data</span><span style="color: #569CD6">}</span><span style="color: #CE9178">-</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">nonce</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">, prev_hash)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># difficultyに応じて先頭の0を増やす</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> candidate_block.hash.startswith(</span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #D4D4D4"> * difficulty):</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> candidate_block</span></span>
<span class="line"><span style="color: #D4D4D4">        nonce += </span><span style="color: #B5CEA8">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">def</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: #6A9955"># 初期ブロック(ジェネシス)</span></span>
<span class="line"><span style="color: #D4D4D4">    genesis = Block(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;Genesis&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    chain_standard = [genesis]</span></span>
<span class="line"><span style="color: #D4D4D4">    chain_forked = [genesis]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># ルールは最初は先頭2個の0</span></span>
<span class="line"><span style="color: #D4D4D4">    difficulty_standard = </span><span style="color: #B5CEA8">2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># チェーンを少し延ばす</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> i </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">range</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">        prev_block = chain_standard[-</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">        new_block = mine_block(i, </span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;Block</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">i</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">, prev_block.hash, difficulty_standard)</span></span>
<span class="line"><span style="color: #D4D4D4">        chain_standard.append(new_block)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># ハードフォーク後は先頭3個の0を要求</span></span>
<span class="line"><span style="color: #D4D4D4">    difficulty_forked = </span><span style="color: #B5CEA8">3</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># ハードフォークが起きたと仮定し、同じブロックindexから新ルールチェーンを生成</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> i </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">range</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">        prev_block = chain_forked[-</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">        new_block = mine_block(i, </span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;ForkedBlock</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">i</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">, prev_block.hash, difficulty_forked)</span></span>
<span class="line"><span style="color: #D4D4D4">        chain_forked.append(new_block)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># 結果出力</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Standard Chain:&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> b </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> chain_standard:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;Index: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">b.index</span><span style="color: #569CD6">}</span><span style="color: #CE9178">, Hash: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">b.hash[:</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">]</span><span style="color: #569CD6">}</span><span style="color: #CE9178">..., Data: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">b.data</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;</span><span style="color: #D7BA7D">\n</span><span style="color: #CE9178">Forked Chain:&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> b </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> chain_forked:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;Index: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">b.index</span><span style="color: #569CD6">}</span><span style="color: #CE9178">, Hash: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">b.hash[:</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">]</span><span style="color: #569CD6">}</span><span style="color: #CE9178">..., Data: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">b.data</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">__name__</span><span style="color: #D4D4D4"> == </span><span style="color: #CE9178">&quot;__main__&quot;</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    main()</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>ポイント：</strong></p>



<ol class="wp-block-list">
<li><code>difficulty_standard = 2</code> → 先頭2個が0ならOK</li>



<li><code>difficulty_forked = 3</code> → 先頭3個が0ならOK（これが新ルール）</li>



<li>同じブロックインデックスで異なる難易度要件のチェーンが生成され、分岐をシミュレート</li>
</ol>



<p class="wp-block-paragraph">実際のビットコインやイーサリアムのフォークは遥かに複雑ですが、フォークのエッセンス（ルール変更によるチェーン分岐）を理解する一助になるでしょう。</p>



<h2 class="wp-block-heading">フォークに伴う注意点</h2>



<h3 class="wp-block-heading">ウォレットや取引所への対応</h3>



<p class="wp-block-paragraph">フォークによって新しいコインが誕生する場合、保有者がコインを受け取るにはウォレットや取引所が対応している必要があります。対応していない場合は、新コインを受け取れない可能性があるため、ユーザーは事前にアナウンスを確認しましょう。</p>



<h3 class="wp-block-heading">リプレイ攻撃</h3>



<p class="wp-block-paragraph">ハードフォーク後に<strong>両チェーンで同じトランザクションが有効</strong>となる場合、意図せずに資産が移転してしまうリプレイ攻撃が懸念されます。これを回避するために新旧チェーンでトランザクションフォーマットを変える、リプレイ保護機能を導入するなどの対策がとられることがあります。</p>



<h3 class="wp-block-heading">価格変動と投資リスク</h3>



<p class="wp-block-paragraph">フォークによって新コインが誕生すると、市場が混乱して価格が急騰・急落することが珍しくありません。投資目的で仮想通貨を保有している方は、フォークのタイミングや市場の反応を読みにくい点を理解し、リスク管理を徹底しましょう。</p>



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



<p class="wp-block-paragraph"><strong>フォーク（Fork）は、仮想通貨やブロックチェーンのプロトコルがルールを変更することでチェーンが分岐する現象を指し、大きくソフトフォーク</strong>と<strong>ハードフォーク</strong>に分かれます。これは単なる技術的アップグレードにとどまらず、<strong>コミュニティの意見対立</strong>や<strong>新しい通貨の誕生</strong>など、エコシステムに大きな影響を与える可能性があります。</p>



<ul class="wp-block-list">
<li>ソフトフォーク：後方互換性を保ったアップグレード</li>



<li>ハードフォーク：後方互換性のない分岐で、新チェーンと旧チェーンが共存する可能性</li>
</ul>



<p class="wp-block-paragraph">**ビットコインキャッシュ（BCH）<strong>や</strong>イーサリアムクラシック（ETC）**など、フォークによって誕生した通貨は既に複数存在し、今後もさまざまなプロジェクトでフォークが検討・実施されるでしょう。<br>ユーザー側としては、ウォレットや取引所がフォークに対応するかどうか、資産がどのように扱われるかをよく確認し、投資リスクや技術的背景を学ぶことが大切です。また、開発者にとっては、フォークはブロックチェーンのプロトコルやコミュニティガバナンスを深く学ぶ機会でもあります。</p>



<p class="wp-block-paragraph"><strong>フォークはコミュニティに柔軟性とリスクをもたらす</strong>両刃の剣と言えますが、適切に運用されれば技術向上や新たなビジネスチャンスの創出につながることは明らかです。今後も仮想通貨やブロックチェーンが進化する中で、フォークがどのように活用され、コミュニティにどんな影響を与えるのか、注視していきましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-fork/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>初心者にもわかるビットコイン・トランザクションの仕組み：構造・スクリプト・検証プロセスを解説</title>
		<link>https://techgrowup.net/blockchain-transaction/</link>
					<comments>https://techgrowup.net/blockchain-transaction/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sat, 15 Mar 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[P2PKH]]></category>
		<category><![CDATA[SegWit]]></category>
		<category><![CDATA[UTXO]]></category>
		<category><![CDATA[スクリプト]]></category>
		<category><![CDATA[トランザクション]]></category>
		<category><![CDATA[ビットコイン]]></category>
		<category><![CDATA[手数料]]></category>
		<category><![CDATA[署名]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2662</guid>

					<description><![CDATA[はじめに 暗号資産（暗号通貨）の代表格であるビットコインでは、送金や受け取りなどの取引データを「トランザクション」と呼びます。このトランザクションこそが、ビットコインのブロックチェーンを支える基盤的な仕組みです。本記事で [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">暗号資産（暗号通貨）の代表格であるビットコインでは、送金や受け取りなどの取引データを「トランザクション」と呼びます。このトランザクションこそが、ビットコインのブロックチェーンを支える基盤的な仕組みです。<br>本記事では、ビットコイン・トランザクションの構造とその働き、スクリプトや署名の仕組み、さらに検証の流れや手数料などについて、<strong>大体 5000 文字</strong>を目安にわかりやすく解説していきます。ビットコインをはじめとした暗号資産の基盤となる仕組みに興味がある方は、ぜひ最後までご覧ください。</p>



<h2 class="wp-block-heading">ビットコイン・トランザクションとは？</h2>



<h3 class="wp-block-heading">基本的な役割</h3>



<p class="wp-block-paragraph">ビットコインの「トランザクション（Transaction）」は、あるアドレスから別のアドレスへビットコインを送金する際の情報をまとめたものです。銀行の振り込みに例えれば「振込依頼書」のようなもので、そこには<strong>どこから送金するか</strong>（入力）と、<strong>どこへ送金するか</strong>（出力）の情報が詰まっています。</p>



<h3 class="wp-block-heading">UTXO（未使用トランザクション出力）</h3>



<p class="wp-block-paragraph">ビットコインでは「残高」という概念を直接持たず、「未使用トランザクション出力（Unspent Transaction Output、UTXO）」という形で各アドレスの資産を管理します。簡単に言えば、過去に受け取った出力（まだ使われていないもの）を合わせた総量が、そのアドレスが使えるビットコインの量です。</p>



<ul class="wp-block-list">
<li>送金時は、手持ちのUTXOのうち必要な分を入力（Input）として参照</li>



<li>お釣りを出力（Output）として自分のアドレスに戻すことも多い</li>
</ul>



<p class="wp-block-paragraph">この UTXO モデルによって、ビットコインは効率的かつ高い安全性で残高管理を行っています。</p>



<h3 class="wp-block-heading">トランザクションの永続化</h3>



<p class="wp-block-paragraph">トランザクションの情報は「ブロック」にまとめられてチェーン状に連結されます。マイナー（採掘者）によって<strong>Proof of Work</strong>が行われ、ブロックが承認されると、そのブロックに含まれるトランザクションが正式に「記録」される仕組みです。これを繰り返すことでブロックチェーンが成長し、過去のすべての取引履歴が保全されます。</p>



<h2 class="wp-block-heading">トランザクションの構造</h2>



<p class="wp-block-paragraph">ビットコインのトランザクションには、以下のようなフィールド（要素）が含まれます。主なものを挙げると：</p>



<ol class="wp-block-list">
<li><strong>バージョン（version）</strong><br>トランザクション形式のバージョン番号。将来的なアップグレードに対応するために利用される。</li>



<li><strong>入力数（tx_in count）</strong><br>トランザクションが参照する UTXO の数。</li>



<li><strong>入力（tx_in）</strong><br>それぞれの入力は下記情報を含む：
<ul class="wp-block-list">
<li><strong>前のトランザクションID</strong>（どのUTXOを使うか）</li>



<li><strong>出力インデックス</strong>（前のトランザクションのどの出力か）</li>



<li><strong>スクリプト署名（scriptSig）</strong>：検証のための署名や公開鍵情報が入る</li>



<li><strong>シーケンス番号（sequence）</strong>：Locktimeと連動して利用される場合がある</li>
</ul>
</li>



<li><strong>出力数（tx_out count）</strong><br>ビットコインをどのように割り振るかを示す出力の数。1 つのトランザクションに複数の出力を持たせることが可能。</li>



<li><strong>出力（tx_out）</strong><br>それぞれの出力は下記情報を含む：
<ul class="wp-block-list">
<li><strong>金額（value）</strong>：Satoshi 単位（1 BTC = 100,000,000 Satoshi）</li>



<li><strong>スクリプト公開鍵（scriptPubKey）</strong>：支払いを受け取るアドレスを規定するスクリプト</li>
</ul>
</li>



<li><strong>Locktime</strong><br>トランザクションが有効となる時間やブロック高さを指定できる。0 が大半だが、一部で時間ロックや CSV（CheckSequenceVerify）等に利用されることがある。</li>
</ol>



<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="┌───────────────────────┐
│ version (4 bytes)     │
├───────────────────────┤
│ input count (VarInt)  │
├───────────────────────┤
│ tx_in[0]              │
│   ├ prev_tx_id        │
│   ├ prev_out_index    │
│   ├ scriptSig (VarInt)│
│   └ sequence (4 bytes)│
├───────────────────────┤
│   ... (more tx_in) ...│
├───────────────────────┤
│ output count (VarInt) │
├───────────────────────┤
│ tx_out[0]             │
│   ├ value (8 bytes)   │
│   └ scriptPubKey (VarInt│
│       ... script data...)│
├───────────────────────┤
│   ... (more tx_out) ..│
├───────────────────────┤
│ locktime (4 bytes)    │
└───────────────────────┘
" 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">┌───────────────────────┐</span></span>
<span class="line"><span style="color: #D4D4D4">│ version (4 bytes)     │</span></span>
<span class="line"><span style="color: #D4D4D4">├───────────────────────┤</span></span>
<span class="line"><span style="color: #D4D4D4">│ </span><span style="color: #D7BA7D">input</span><span style="color: #D4D4D4"> count (VarInt)  │</span></span>
<span class="line"><span style="color: #D4D4D4">├───────────────────────┤</span></span>
<span class="line"><span style="color: #D4D4D4">│ tx_in[</span><span style="color: #9CDCFE">0</span><span style="color: #D4D4D4">]              │</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├ prev_tx_id        │</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├ prev_out_index    │</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├ scriptSig (VarInt)│</span></span>
<span class="line"><span style="color: #D4D4D4">│   └ sequence (4 bytes)│</span></span>
<span class="line"><span style="color: #D4D4D4">├───────────────────────┤</span></span>
<span class="line"><span style="color: #D4D4D4">│   ... (more tx_in) ..</span><span style="color: #D7BA7D">.│</span></span>
<span class="line"><span style="color: #D4D4D4">├───────────────────────┤</span></span>
<span class="line"><span style="color: #D4D4D4">│ </span><span style="color: #D7BA7D">output</span><span style="color: #D4D4D4"> count (VarInt) │</span></span>
<span class="line"><span style="color: #D4D4D4">├───────────────────────┤</span></span>
<span class="line"><span style="color: #D4D4D4">│ tx_out[</span><span style="color: #9CDCFE">0</span><span style="color: #D4D4D4">]             │</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├ value (8 bytes)   │</span></span>
<span class="line"><span style="color: #D4D4D4">│   └ scriptPubKey (VarInt│</span></span>
<span class="line"><span style="color: #D4D4D4">│       ... </span><span style="color: #D7BA7D">script</span><span style="color: #D4D4D4"> </span><span style="color: #D7BA7D">data</span><span style="color: #D4D4D4">...)│</span></span>
<span class="line"><span style="color: #D4D4D4">├───────────────────────┤</span></span>
<span class="line"><span style="color: #D4D4D4">│   ... (more tx_out) .</span><span style="color: #D7BA7D">.│</span></span>
<span class="line"><span style="color: #D4D4D4">├───────────────────────┤</span></span>
<span class="line"><span style="color: #D4D4D4">│ locktime (4 bytes)    │</span></span>
<span class="line"><span style="color: #D4D4D4">└───────────────────────┘</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading">ビットコインのスクリプト言語</h2>



<h3 class="wp-block-heading">スクリプトの基本</h3>



<p class="wp-block-paragraph">ビットコインのトランザクションでは、<strong>scriptSig</strong>（入力側）と<strong>scriptPubKey</strong>（出力側）が組み合わさって実行されます。これが「支払い条件の成立」を検証する重要な仕組みです。</p>



<ul class="wp-block-list">
<li><strong>scriptSig</strong>: 送金者が署名などのデータを含む</li>



<li><strong>scriptPubKey</strong>: 受取アドレスや条件式を記述している</li>
</ul>



<p class="wp-block-paragraph">この 2 つがスタックマシン上で順次実行され、「条件が満たされれば送金が有効」と判断されます。</p>



<h3 class="wp-block-heading">P2PKH（Pay to Public Key Hash）</h3>



<p class="wp-block-paragraph">ビットコインで最も一般的なのが <strong>P2PKH</strong> 形式（1 から始まるビットコインアドレス）です。</p>



<ul class="wp-block-list">
<li><strong>scriptPubKey</strong> には、受取人の公開鍵ハッシュと <code>OP_EQUALVERIFY OP_CHECKSIG</code> などの命令が含まれる</li>



<li><strong>scriptSig</strong> には、送金者の署名（signature）と公開鍵（public key）が含まれる</li>
</ul>



<p class="wp-block-paragraph">実行時に、公開鍵が scriptPubKey のハッシュと一致し、署名検証をパスすれば「正当な所有者」とみなされます。</p>



<h3 class="wp-block-heading">Segregated Witness（SegWit）対応</h3>



<p class="wp-block-paragraph">SegWit（セグウィット）導入後の <strong>P2WPKH</strong>（bc1 から始まるアドレス）や <strong>P2WSH</strong> は、署名データをメインのトランザクションデータから切り離し、<strong>witness</strong> と呼ばれる領域に格納します。これによりブロック容量の利用効率が向上し、手数料の計算などが少し変わります。</p>



<h2 class="wp-block-heading">トランザクションの検証プロセス</h2>



<p class="wp-block-paragraph">トランザクションがネットワークにブロードキャストされると、各ノードは以下のようなステップで検証を行います。</p>



<ol class="wp-block-list">
<li><strong>基本的な構文チェック</strong>
<ul class="wp-block-list">
<li>version, locktime, tx_in, tx_out の形式が正しいか</li>



<li>入力数や出力数が 0 件ではないか</li>



<li>合計出力金額が 0 より大きく、ビットコインの上限を超えていないか</li>
</ul>
</li>



<li><strong>UTXO の参照チェック</strong>
<ul class="wp-block-list">
<li>入力で参照している UTXO が実際に存在し、未使用であるか</li>



<li>ダブルスペンド（同じ UTXO を複数回使う不正）になっていないか</li>
</ul>
</li>



<li><strong>スクリプトの実行</strong>
<ul class="wp-block-list">
<li>scriptSig と scriptPubKey を連結し、スタックマシンで実行</li>



<li>署名検証や公開鍵ハッシュの一致、OP_CODE の実行結果などをチェック</li>
</ul>
</li>



<li><strong>手数料とアウトプットの合計チェック</strong>
<ul class="wp-block-list">
<li>入力の合計（UTXO） &#8211; 出力の合計（新たなトランザクション出力） = 手数料が正しいか</li>



<li>負の値になっていないか</li>
</ul>
</li>



<li><strong>プールへの受け入れ</strong>
<ul class="wp-block-list">
<li>上記をすべて満たしたトランザクションは、ノードのメモリプール（mempool）に格納され、マイナーがブロックに取り込む対象となる。</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading">手数料の仕組み</h2>



<h3 class="wp-block-heading">トランザクションのバイトサイズ</h3>



<p class="wp-block-paragraph">ビットコインでは、トランザクション手数料は「送金額」ではなく、<strong>トランザクションのバイトサイズ</strong>（正確には weight 単位）によって大きく影響されます。</p>



<ul class="wp-block-list">
<li>入力数や出力数が多いと、トランザクションのサイズが大きくなり、手数料も高くなる</li>



<li>SegWit を使うと witness データの扱いが変わり、手数料を若干抑えやすい場合がある</li>
</ul>



<h3 class="wp-block-heading">手数料率（Fee Rate）</h3>



<p class="wp-block-paragraph">手数料は「Satoshi/byte」や「Satoshi/vbyte」などのレートとして表されることが多いです。例えば、1 vbyte あたり 10 satoshi の手数料を支払う設定にしておけば、200 バイトのトランザクションなら 2000 satoshi（0.00002 BTC）程度となります。<br>マイナーは手数料の高いトランザクションを優先してブロックに含める傾向にあるため、迅速な承認を望む場合は高めの手数料を設定するのが一般的です。</p>



<h2 class="wp-block-heading">ロックタイムとシーケンス</h2>



<h3 class="wp-block-heading">Locktime（nLocktime）</h3>



<p class="wp-block-paragraph">Locktime フィールドを使うことで、トランザクションが承認される「最も早い時刻（またはブロック高さ）」を指定できます。デフォルトで 0 が多いですが、特定のブロック番号や UNIX 時刻を設定すると、その条件に達するまではトランザクションが有効にならない仕組みです。<br>この機能を活用して、<strong>時間ロック付きの支払い</strong>や、<strong>オフチェーンでの契約</strong>など、さまざまなユースケースが考えられます。</p>



<h3 class="wp-block-heading">シーケンス番号（sequence）</h3>



<p class="wp-block-paragraph">各入力ごとに設定される 4 バイトの値で、Locktime を有効化するかどうかなどの条件をコントロールできます。また、<a rel="noopener" target="_blank" href="https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki">BIP68<span class="fa fa-external-link external-icon anchor-icon"></span></a> などで定義される相対ロックタイムの仕組みを使う場合にも関係します。</p>



<h2 class="wp-block-heading">Python でトランザクションをパースする例</h2>



<p class="wp-block-paragraph">ここでは、ビットコインのトランザクションをパース（読み込んで要素を抽出）する簡単な Python スニペットを示します。実際には生のバイナリデータをデコードする必要がありますが、ここでは概念を掴むイメージとしてご覧ください。</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 binascii
import struct

# この Raw トランザクションは実際にビットコイン・メインネットで
# 確認可能なものの一例です（1インプット / 2アウトプットなど）。
# すべて16進で、行分割せず1行で記載しているため偶数長になっています。
raw_tx = &quot;01000000017b1eabe0209b1fe794124575ef807057c77ada2138ae4fa8d6c4de0398a14f3f00000000494830450221008949f0cb400094ad2b5eb399d59d01c14d73d8fe6e96df1a7150deb388ab8935022079656090d7f6bac4c9a94e0aad311a4268e082a725f8aeae0573fb12ff866a5f01ffffffff01f0ca052a010000001976a914cbc20a7664f2f69e5355aa427045bc15e7c6c77288ac00000000&quot;.strip()

def parse_varint(data: bytes, offset: int):
    &quot;&quot;&quot;
    ビットコインで扱われる可変長整数(VarInt)を読み取り、
    値と次のオフセットを返す簡易関数です。
    &quot;&quot;&quot;
    prefix = data[offset]
    offset += 1

    if prefix &lt; 0xfd:
        return prefix, offset
    elif prefix == 0xfd:
        val = struct.unpack_from('&lt;H', data, offset)[0]
        offset += 2
        return val, offset
    elif prefix == 0xfe:
        val = struct.unpack_from('&lt;I', data, offset)[0]
        offset += 4
        return val, offset
    else:
        val = struct.unpack_from('&lt;Q', data, offset)[0]
        offset += 8
        return val, offset

def main():
    # 1) 16進文字列をバイナリに変換
    #    ここで文字数が偶数長であることが重要。
    binary_tx = binascii.unhexlify(raw_tx)

    offset = 0

    # 2) まず 4 バイトの version を読む
    version = struct.unpack_from('&lt;I', binary_tx, offset)[0]
    offset += 4
    print(f&quot;Version: {version}&quot;)

    # 3) 入力数 (VarInt)
    tx_in_count, offset = parse_varint(binary_tx, offset)
    print(f&quot;Input Count: {tx_in_count}&quot;)

    # 4) 入力 (tx_in) をパース
    for i in range(tx_in_count):
        # 先行する32バイトで prev_txid（逆順で格納されているので[::-1]で反転）
        prev_txid = binary_tx[offset:offset+32][::-1]
        offset += 32

        # その後4バイトで 出力インデックス (vout)
        out_index = struct.unpack_from('&lt;I', binary_tx, offset)[0]
        offset += 4

        # scriptSig の長さ (VarInt)
        script_len, offset = parse_varint(binary_tx, offset)
        # scriptSig 本体
        script_sig = binary_tx[offset:offset+script_len]
        offset += script_len

        # 4バイトの sequence
        sequence = struct.unpack_from('&lt;I', binary_tx, offset)[0]
        offset += 4

        print(f&quot;--- Input {i} ---&quot;)
        print(f&quot;Prev TXID: {binascii.hexlify(prev_txid).decode()}&quot;)
        print(f&quot;OutIndex: {out_index}&quot;)
        print(f&quot;ScriptSig: {binascii.hexlify(script_sig).decode()}&quot;)
        print(f&quot;Sequence: 0x{sequence:x}&quot;)

    # 5) 出力数 (VarInt)
    tx_out_count, offset = parse_varint(binary_tx, offset)
    print(f&quot;Output Count: {tx_out_count}&quot;)

    # 6) 出力 (tx_out) をパース
    for j in range(tx_out_count):
        # 8バイトの value (satoshi)
        value = struct.unpack_from('&lt;Q', binary_tx, offset)[0]
        offset += 8

        # scriptPubKey の長さ (VarInt)
        script_len, offset = parse_varint(binary_tx, offset)
        # scriptPubKey 本体
        script_pubkey = binary_tx[offset:offset+script_len]
        offset += script_len

        print(f&quot;--- Output {j} ---&quot;)
        print(f&quot;Value (satoshi): {value}&quot;)
        print(f&quot;ScriptPubKey: {binascii.hexlify(script_pubkey).decode()}&quot;)

    # 7) 最後に locktime (4バイト)
    locktime = struct.unpack_from('&lt;I', binary_tx, offset)[0]
    offset += 4
    print(f&quot;Locktime: {locktime}&quot;)

if __name__ == &quot;__main__&quot;:
    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: #C586C0">import</span><span style="color: #D4D4D4"> binascii</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> struct</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># この Raw トランザクションは実際にビットコイン・メインネットで</span></span>
<span class="line"><span style="color: #6A9955"># 確認可能なものの一例です（1インプット / 2アウトプットなど）。</span></span>
<span class="line"><span style="color: #6A9955"># すべて16進で、行分割せず1行で記載しているため偶数長になっています。</span></span>
<span class="line"><span style="color: #D4D4D4">raw_tx = </span><span style="color: #CE9178">&quot;01000000017b1eabe0209b1fe794124575ef807057c77ada2138ae4fa8d6c4de0398a14f3f00000000494830450221008949f0cb400094ad2b5eb399d59d01c14d73d8fe6e96df1a7150deb388ab8935022079656090d7f6bac4c9a94e0aad311a4268e082a725f8aeae0573fb12ff866a5f01ffffffff01f0ca052a010000001976a914cbc20a7664f2f69e5355aa427045bc15e7c6c77288ac00000000&quot;</span><span style="color: #D4D4D4">.strip()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">parse_varint</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">bytes</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #CE9178">    ビットコインで扱われる可変長整数(VarInt)を読み取り、</span></span>
<span class="line"><span style="color: #CE9178">    値と次のオフセットを返す簡易関数です。</span></span>
<span class="line"><span style="color: #CE9178">    &quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    prefix = data[offset]</span></span>
<span class="line"><span style="color: #D4D4D4">    offset += </span><span style="color: #B5CEA8">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> prefix &lt; </span><span style="color: #569CD6">0x</span><span style="color: #B5CEA8">fd</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> prefix, offset</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">elif</span><span style="color: #D4D4D4"> prefix == </span><span style="color: #569CD6">0x</span><span style="color: #B5CEA8">fd</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        val = struct.unpack_from(</span><span style="color: #CE9178">&#39;&lt;H&#39;</span><span style="color: #D4D4D4">, data, offset)[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">        offset += </span><span style="color: #B5CEA8">2</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> val, offset</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">elif</span><span style="color: #D4D4D4"> prefix == </span><span style="color: #569CD6">0x</span><span style="color: #B5CEA8">fe</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        val = struct.unpack_from(</span><span style="color: #CE9178">&#39;&lt;I&#39;</span><span style="color: #D4D4D4">, data, offset)[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">        offset += </span><span style="color: #B5CEA8">4</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> val, offset</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        val = struct.unpack_from(</span><span style="color: #CE9178">&#39;&lt;Q&#39;</span><span style="color: #D4D4D4">, data, offset)[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">        offset += </span><span style="color: #B5CEA8">8</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> val, offset</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">def</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: #6A9955"># 1) 16進文字列をバイナリに変換</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">#    ここで文字数が偶数長であることが重要。</span></span>
<span class="line"><span style="color: #D4D4D4">    binary_tx = binascii.unhexlify(raw_tx)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    offset = </span><span style="color: #B5CEA8">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># 2) まず 4 バイトの version を読む</span></span>
<span class="line"><span style="color: #D4D4D4">    version = struct.unpack_from(</span><span style="color: #CE9178">&#39;&lt;I&#39;</span><span style="color: #D4D4D4">, binary_tx, offset)[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">    offset += </span><span style="color: #B5CEA8">4</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;Version: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">version</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># 3) 入力数 (VarInt)</span></span>
<span class="line"><span style="color: #D4D4D4">    tx_in_count, offset = parse_varint(binary_tx, offset)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;Input Count: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">tx_in_count</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># 4) 入力 (tx_in) をパース</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> i </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">range</span><span style="color: #D4D4D4">(tx_in_count):</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># 先行する32バイトで prev_txid（逆順で格納されているので[::-1]で反転）</span></span>
<span class="line"><span style="color: #D4D4D4">        prev_txid = binary_tx[offset:offset+</span><span style="color: #B5CEA8">32</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">        offset += </span><span style="color: #B5CEA8">32</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># その後4バイトで 出力インデックス (vout)</span></span>
<span class="line"><span style="color: #D4D4D4">        out_index = struct.unpack_from(</span><span style="color: #CE9178">&#39;&lt;I&#39;</span><span style="color: #D4D4D4">, binary_tx, offset)[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">        offset += </span><span style="color: #B5CEA8">4</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># scriptSig の長さ (VarInt)</span></span>
<span class="line"><span style="color: #D4D4D4">        script_len, offset = parse_varint(binary_tx, offset)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># scriptSig 本体</span></span>
<span class="line"><span style="color: #D4D4D4">        script_sig = binary_tx[offset:offset+script_len]</span></span>
<span class="line"><span style="color: #D4D4D4">        offset += script_len</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># 4バイトの sequence</span></span>
<span class="line"><span style="color: #D4D4D4">        sequence = struct.unpack_from(</span><span style="color: #CE9178">&#39;&lt;I&#39;</span><span style="color: #D4D4D4">, binary_tx, offset)[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">        offset += </span><span style="color: #B5CEA8">4</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;--- Input </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">i</span><span style="color: #569CD6">}</span><span style="color: #CE9178"> ---&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;Prev TXID: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">binascii.hexlify(prev_txid).decode()</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;OutIndex: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">out_index</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;ScriptSig: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">binascii.hexlify(script_sig).decode()</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;Sequence: 0x</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">sequence</span><span style="color: #569CD6">:x}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># 5) 出力数 (VarInt)</span></span>
<span class="line"><span style="color: #D4D4D4">    tx_out_count, offset = parse_varint(binary_tx, offset)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;Output Count: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">tx_out_count</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># 6) 出力 (tx_out) をパース</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> j </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">range</span><span style="color: #D4D4D4">(tx_out_count):</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># 8バイトの value (satoshi)</span></span>
<span class="line"><span style="color: #D4D4D4">        value = struct.unpack_from(</span><span style="color: #CE9178">&#39;&lt;Q&#39;</span><span style="color: #D4D4D4">, binary_tx, offset)[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">        offset += </span><span style="color: #B5CEA8">8</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># scriptPubKey の長さ (VarInt)</span></span>
<span class="line"><span style="color: #D4D4D4">        script_len, offset = parse_varint(binary_tx, offset)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># scriptPubKey 本体</span></span>
<span class="line"><span style="color: #D4D4D4">        script_pubkey = binary_tx[offset:offset+script_len]</span></span>
<span class="line"><span style="color: #D4D4D4">        offset += script_len</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;--- Output </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">j</span><span style="color: #569CD6">}</span><span style="color: #CE9178"> ---&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;Value (satoshi): </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">value</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;ScriptPubKey: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">binascii.hexlify(script_pubkey).decode()</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># 7) 最後に locktime (4バイト)</span></span>
<span class="line"><span style="color: #D4D4D4">    locktime = struct.unpack_from(</span><span style="color: #CE9178">&#39;&lt;I&#39;</span><span style="color: #D4D4D4">, binary_tx, offset)[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">    offset += </span><span style="color: #B5CEA8">4</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;Locktime: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">locktime</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">__name__</span><span style="color: #D4D4D4"> == </span><span style="color: #CE9178">&quot;__main__&quot;</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    main()</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>parse_varint</strong> は可変長整数（VarInt）を処理する関数の例 </li>



<li>実際には scriptSig や scriptPubKey を解析し、署名や公開鍵ハッシュを取り出す必要がある </li>



<li>ビットコインでのバイナリデータのフォーマットに沿って正しく解析するのは、やや手間がかかりますが、詳細な仕組みを理解する良い勉強になります</li>
</ul>



<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="Version: 1
Input Count: 1
--- Input 0 ---
Prev TXID: 3f4fa19803dec4d6a84fae3821da7ac7577080ef75451294e71f9b20e0ab1e7b
OutIndex: 0
ScriptSig: 4830450221008949f0cb400094ad2b5eb399d59d01c14d73d8fe6e96df1a7150deb388ab8935022079656090d7f6bac4c9a94e0aad311a4268e082a725f8aeae0573fb12ff866a5f01
Sequence: 0xffffffff
Output Count: 1
--- Output 0 ---
Value (satoshi): 4999990000
ScriptPubKey: 76a914cbc20a7664f2f69e5355aa427045bc15e7c6c77288ac
Locktime: 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: #DCDCAA">Version:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #DCDCAA">Input</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Count:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #DCDCAA">---</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Input</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">---</span></span>
<span class="line"><span style="color: #DCDCAA">Prev</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">TXID:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">3</span><span style="color: #CE9178">f4fa19803dec4d6a84fae3821da7ac7577080ef75451294e71f9b20e0ab1e7b</span></span>
<span class="line"><span style="color: #DCDCAA">OutIndex:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #DCDCAA">ScriptSig:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">4830450221008949</span><span style="color: #CE9178">f0cb400094ad2b5eb399d59d01c14d73d8fe6e96df1a7150deb388ab8935022079656090d7f6bac4c9a94e0aad311a4268e082a725f8aeae0573fb12ff866a5f01</span></span>
<span class="line"><span style="color: #DCDCAA">Sequence:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0xffffffff</span></span>
<span class="line"><span style="color: #DCDCAA">Output</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Count:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #DCDCAA">---</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Output</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">---</span></span>
<span class="line"><span style="color: #DCDCAA">Value</span><span style="color: #D4D4D4"> (satoshi): 4999990000</span></span>
<span class="line"><span style="color: #DCDCAA">ScriptPubKey:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">76</span><span style="color: #CE9178">a914cbc20a7664f2f69e5355aa427045bc15e7c6c77288ac</span></span>
<span class="line"><span style="color: #DCDCAA">Locktime:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span></span></code></pre></div>



<h2 class="wp-block-heading">今後のトランザクションの拡張</h2>



<p class="wp-block-paragraph">ビットコインの開発コミュニティでは、<strong>Taproot</strong>（シュノア署名等を活用したスクリプト拡張）など、さらなる機能拡張が進められています。Taproot は 2021 年に有効化され、プライバシー強化や柔軟なスクリプト表現が可能となりました。</p>



<ul class="wp-block-list">
<li><strong>シュノア署名</strong>: 署名サイズが小さくなり、複数署名（multisig）を一つの署名にまとめられる</li>



<li><strong>Taproot でのスクリプト隠蔽</strong>: 実際に使われなかったスクリプトパスを公開しなくても良くなる</li>
</ul>



<p class="wp-block-paragraph">こうした拡張によって、ビットコインはスケーラビリティだけでなく、スクリプトの表現力やプライバシーも向上し、より多彩なユースケースに対応できるようになっています。</p>



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



<p class="wp-block-paragraph">ビットコインのトランザクションは、<strong>UTXO モデル</strong>をベースに組み立てられ、<strong>scriptSig</strong> と <strong>scriptPubKey</strong> が連動して検証される仕組みが特徴です。こうした構造によって高いセキュリティと分散性が保たれ、世界中のノードがトランザクションを検証・記録することで、信頼性の高い分散型台帳が実現されています。</p>



<ul class="wp-block-list">
<li><strong>UTXO モデル</strong>で残高管理</li>



<li><strong>スクリプト言語</strong>による柔軟な支払い条件</li>



<li><strong>手数料</strong>はトランザクションサイズによる</li>



<li><strong>Locktime や sequence</strong> で高度な支払いロックを設定可能</li>



<li><strong>Taproot</strong> 等の進化によって、より複雑かつ安全なスクリプトが実現へ</li>
</ul>



<p class="wp-block-paragraph">ブロックチェーンやビットコインに興味を持たれた方は、まずトランザクションの構造と仕組みを学ぶことが近道です。実際にコードを書いて raw トランザクションを解析してみると、暗号通貨の基礎理解が一層深まることでしょう。<br>今後もビットコインはプロトコルの更新やユーザーコミュニティの拡大によって進化を続けていくと考えられます。トランザクション構造をしっかり理解しておけば、その応用や拡張にもスムーズに対応できるはずです。ぜひ本記事を入り口として、ビットコイン・トランザクションの世界をさらに掘り下げて学んでみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-transaction/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: techgrowup.net @ 2026-07-04 10:09:32 by W3 Total Cache
-->