<?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%88%e3%83%a9%e3%83%b3%e3%82%b6%e3%82%af%e3%82%b7%e3%83%a7%e3%83%b3/feed/" rel="self" type="application/rss+xml" />
	<link>https://techgrowup.net</link>
	<description>エンジニアを強くする</description>
	<lastBuildDate>Sat, 05 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>BNB Chainを解説！高速・低手数料なブロックチェーンの仕組みと開発手法、活用事例をわかりやすく紹介</title>
		<link>https://techgrowup.net/blockchain-bnb-chain/</link>
					<comments>https://techgrowup.net/blockchain-bnb-chain/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sat, 05 Apr 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[ブロックチェーン]]></category>
		<category><![CDATA[Binance]]></category>
		<category><![CDATA[BNB]]></category>
		<category><![CDATA[BNB Chain]]></category>
		<category><![CDATA[BSC]]></category>
		<category><![CDATA[DeFi]]></category>
		<category><![CDATA[EVM互換]]></category>
		<category><![CDATA[スマートコントラクト]]></category>
		<category><![CDATA[トランザクション]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2739</guid>

					<description><![CDATA[はじめに 仮想通貨取引所として世界的に有名なBinanceが手掛けるBNB Chain（旧Binance Smart Chain: BSC）は、高速トランザクションと低手数料を特徴とし、イーサリアム（Ethereum）と [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">仮想通貨取引所として世界的に有名なBinanceが手掛ける<strong>BNB Chain</strong>（旧Binance Smart Chain: BSC）は、<strong>高速トランザクション</strong>と<strong>低手数料</strong>を特徴とし、イーサリアム（Ethereum）との高い互換性を持つブロックチェーンプラットフォームとして注目を集めています。<br>BNB Chainは<strong>分散型アプリケーション（DApp）やDeFi、NFT</strong>などのエコシステムを広げるべく、<strong>EVM互換</strong>かつ<strong>Proof of Staked Authority (PoSA)</strong> というユニークなコンセンサスを採用し、ユーザーにとって安価でスケーラブルな環境を提供しています。本記事では、BNB Chainの基本構造や設計思想、使われている技術、そしてDApp開発フローやコードサンプルまで、幅広く紹介していきます。</p>



<h2 class="wp-block-heading">BNB Chainの基礎知識</h2>



<h3 class="wp-block-heading">Binance Smart Chain（BSC）からBNB Chainへ</h3>



<p class="wp-block-paragraph">元々は<strong>Binance Smart Chain (BSC)</strong> としてローンチされましたが、2022年頃から<strong>BNB Chain</strong>という名称にリブランディングが行われました。</p>



<ul class="wp-block-list">
<li><strong>BNB</strong> は Binance のネイティブトークンであり、BNB Chainにおいては<strong>ガス手数料の支払い</strong>や<strong>バリデータのステーキング</strong>に使われます。</li>



<li>新名称「BNB Chain」は BNB を「Build and Build」と説明し、コミュニティ主導の分散型エコシステムへ発展する意向を示しています。</li>
</ul>



<h3 class="wp-block-heading">高速・安価なEVM互換チェーン</h3>



<p class="wp-block-paragraph">BNB Chainは、イーサリアムのEVMと<strong>互換性</strong>を保ちながら、<strong>高スループット</strong>と<strong>低トランザクション手数料</strong>を実現することを目指しています。</p>



<ul class="wp-block-list">
<li><strong>Proof of Staked Authority (PoSA)</strong> をコンセンサスアルゴリズムとして採用し、バリデータ数を限定することでブロック生成を高速化</li>



<li>その代償として分散性（バリデータが少数）への懸念もあるが、ユーザーにとっては安価かつ多くのDAppが動くメリットがある</li>
</ul>



<h2 class="wp-block-heading">BNB Chainの技術的背景</h2>



<h3 class="wp-block-heading">Proof of Staked Authority (PoSA)</h3>



<p class="wp-block-paragraph">イーサリアムがPoWやPoSへ移行中なのに対し、BNB Chainは<strong>PoSA</strong> (Proof of Staked Authority)と呼ばれる合意形成アルゴリズムを用います。</p>



<ul class="wp-block-list">
<li>バリデータ候補者は一定のBNBをステークし、コミュニティ投票やBinance等の選定プロセスを経てバリデータに就任</li>



<li>バリデータが定期的にローテーションされ、ブロック生成を担当</li>



<li>ブロックがチェーンに追加されるたびにバリデータはブロック報酬や手数料を受け取る<br>この仕組みにより、イーサリアムなどよりも高速なブロックタイム（約3秒〜）を実現しています。</li>
</ul>



<h3 class="wp-block-heading">デュアルチェーンアーキテクチャ</h3>



<p class="wp-block-paragraph">かつてはBinance Chain（BC）とBinance Smart Chain（BSC）の「デュアルチェーン構造」が存在し、</p>



<ul class="wp-block-list">
<li><strong>Binance Chain(BC)</strong>: 高速DEXやトークン発行に特化</li>



<li><strong>Binance Smart Chain(BSC)</strong>: スマートコントラクトとEVMサポート<br>という役割分担をしていましたが、BNB Chainへのリブランディングにより両者の機能やブランドが統合的に扱われる傾向が強まっています。</li>
</ul>



<h3 class="wp-block-heading">ネイティブトークンBNB</h3>



<p class="wp-block-paragraph">BNBはもともとBinance取引所のトークンとしてICOされましたが、BNB Chain上でのガス支払い・バリデータステーキングにも使われる<strong>ユーティリティトークン</strong>として機能します。</p>



<ul class="wp-block-list">
<li>取引所での手数料割引など、Binanceエコシステムと密接な関係</li>



<li>バリデータ運営者はBNBステーク量に応じて選出され、ブロック報酬を獲得</li>
</ul>



<h2 class="wp-block-heading">BNB Chainのメリット</h2>



<h3 class="wp-block-heading">高速かつ安価なトランザクション</h3>



<p class="wp-block-paragraph">PoSAにより、ブロックの生成間隔が3秒ほどと短く、Gas料金もイーサリアムメインネットより大幅に低いのが特徴です。DeFiやNFT取引で<strong>頻繁な更新</strong>が必要な場合にコストを抑えられ、ユーザー体験が向上します。</p>



<h3 class="wp-block-heading">EVM互換性</h3>



<p class="wp-block-paragraph"><strong>Solidity</strong>や<strong>Vyper</strong>などで書かれたイーサリアム向けスマートコントラクトをほぼそのまま移植可能。TruffleやHardhatなど<strong>EVM用のツール</strong>を使えるので、開発者は学習コストを抑えてDAppを移行・開発できます。</p>



<h3 class="wp-block-heading">豊富なDAppと高い流動性</h3>



<p class="wp-block-paragraph">Binanceという大手取引所がバックアップしていることもあり、<strong>DeFiプロジェクト（PancakeSwap, Venusなど）やNFTマーケット</strong>が多く稼働し、流動性が高まりやすい環境です。これによりユーザーや開発者が集まり、<strong>ネットワーク効果</strong>を生み出しています。</p>



<h2 class="wp-block-heading">スマートコントラクト開発フロー</h2>



<h3 class="wp-block-heading">SolidityとHardhat/Truffle</h3>



<p class="wp-block-paragraph">BNB Chainにデプロイする際、一般的な流れは<strong>イーサリアムと同じ</strong>です。</p>



<ol class="wp-block-list">
<li><strong>Solidity</strong>などでコントラクトを記述</li>



<li>Hardhat/Truffleなどでコンパイルとテスト</li>



<li>BNB Chain（テストネット：Chapel もしくは本番：BSC Mainnet）に<strong>RPC</strong>接続を設定</li>



<li><code>npx hardhat run scripts/deploy.js --network bscMainnet</code> のようなコマンドでデプロイ</li>
</ol>



<p class="wp-block-paragraph">以下に Hardhat のシンプルな例を示します。</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="// hardhat.config.js
require(&quot;@nomiclabs/hardhat-waffle&quot;);

module.exports = {
  solidity: &quot;0.8.0&quot;,
  networks: {
    bscTestnet: {
      url: &quot;https://data-seed-prebsc-1-s1.binance.org:8545/&quot;,
      chainId: 97,
      accounts: [&quot;&lt;YOUR_PRIVATE_KEY&gt;&quot;]
    },
    bscMainnet: {
      url: &quot;https://bsc-dataseed.binance.org/&quot;,
      chainId: 56,
      accounts: [&quot;&lt;YOUR_PRIVATE_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: #6A9955">// hardhat.config.js</span></span>
<span class="line"><span style="color: #DCDCAA">require</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;@nomiclabs/hardhat-waffle&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></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">solidity:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;0.8.0&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">bscTestnet:</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://data-seed-prebsc-1-s1.binance.org:8545/&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">chainId:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">97</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: #CE9178">&quot;&lt;YOUR_PRIVATE_KEY&gt;&quot;</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: #9CDCFE">bscMainnet:</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://bsc-dataseed.binance.org/&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">chainId:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">56</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: #CE9178">&quot;&lt;YOUR_PRIVATE_KEY&gt;&quot;</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>



<h3 class="wp-block-heading">コントラクト例：簡単なCounter</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.0;

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



<p class="wp-block-paragraph">ハードハットで以下のようなスクリプトを実行すれば、BSC Testnet へデプロイ可能です。</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="// scripts/deploy.js
async function main() {
  const [deployer] = await ethers.getSigners();
  console.log(&quot;Deploying with account:&quot;, deployer.address);

  const Counter = await ethers.getContractFactory(&quot;Counter&quot;);
  const counter = await Counter.deploy(10);
  await counter.deployed();
  
  console.log(&quot;Counter contract deployed at:&quot;, counter.address);
}

main()
  .then(() =&gt; process.exit(0))
  .catch(error =&gt; {
    console.error(error);
    process.exit(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">// scripts/deploy.js</span></span>
<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">deployer</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: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">log</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Deploying with account:&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">deployer</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">address</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></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 style="color: #B5CEA8">10</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>
<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 contract deployed at:&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>
<span class="line"><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">  .</span><span style="color: #DCDCAA">then</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">exit</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 style="color: #DCDCAA">catch</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">error</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: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">error</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">exit</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></code></pre></div>



<p class="wp-block-paragraph">CLI:</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 bscTestnet" 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">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">bscTestnet</span></span></code></pre></div>



<h2 class="wp-block-heading">BNB Chainエコシステムのユースケース</h2>



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



<p class="wp-block-paragraph">BNB Chainでは<strong>PancakeSwap</strong>が代表的な分散型取引所（DEX）として知られ、イーサリアムのUniswap同様にAMM（自動マーケットメイカー）方式を採用。PancakeSwapはガス代が低いことから、多くのトレーダーや流動性提供者が集まっています。<br>また、<strong>Venus</strong>や<strong>Alpaca Finance</strong>など、レンディング・借入プロトコルも活発に稼働。DeFiを動かすトータルバリューロック（TVL）の観点では、BNB Chainが主要ブロックチェーンの1つとなっています。</p>



<h3 class="wp-block-heading">NFTとゲーム</h3>



<p class="wp-block-paragraph">低手数料かつ高速で、メインストリームユーザーにとって利用しやすいことから、<strong>NFTプラットフォーム</strong>や<strong>ブロックチェーンゲーム</strong>が多く展開されています。<strong>BakerySwap</strong>や<strong>NFT marketplaces</strong>がBSC時代から存在し、スムーズなユーザー体験を提供。<br>ゲームではトランザクションを頻繁に行うケースが多いため、イーサリアムメインネットよりコストを抑えられるBNB Chainが好まれる傾向にあります。</p>



<h3 class="wp-block-heading">ミームトークンやトレーディング</h3>



<p class="wp-block-paragraph">BNB ChainはDeFiブームとともに<strong>ミームコイン</strong>や<strong>トークン投機</strong>も盛んになり、短期間で流行したトークンが多数誕生しました。これには注意が必要で、詐欺的なプロジェクトも混在しやすいため、DYOR（Do Your Own Research）が必須です。</p>



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



<h3 class="wp-block-heading">中央集権性の懸念</h3>



<p class="wp-block-paragraph">BNB Chainはバリデータ数が20〜30程度に限定されており、バリデータの選定過程や議決プロセスに<strong>Binance</strong>の影響力が大きいと批判される場合もあります。完全分散型のイーサリアムやビットコインと比べると、<strong>より中央集権的</strong>という指摘を受けがちです。</p>



<h3 class="wp-block-heading">ハッキングリスクとRug Pull</h3>



<p class="wp-block-paragraph">DeFiなどで大きな資金が集まるBNB Chainでは、<strong>スマートコントラクトの脆弱性</strong>やプロジェクトの悪意により被害が発生した例もあります。</p>



<ul class="wp-block-list">
<li>ハッキングされてトークンが盗まれる</li>



<li>開発者が流動性を持ち逃げする（Rug Pull）<br>ユーザーや投資家は<strong>プロジェクトの監査状況</strong>やコミュニティの評判を十分に確認する必要があります。</li>
</ul>



<h3 class="wp-block-heading">スケーラビリティ限界</h3>



<p class="wp-block-paragraph">現状PoSAチェーンで高速に動作していても、ユーザー数が増え続けるとさらなるスケーリングが必要になるかもしれません。BNB Chainは<strong>ZK Rollup</strong>など新技術の導入を検討しており、より大規模なユーザーベースに対応するための研究が続けられています。</p>



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



<h3 class="wp-block-heading">メインストリーム導入</h3>



<p class="wp-block-paragraph">Binanceが世界的な取引所としての影響力を持つことから、多くのプロジェクトがBNB Chain上でのサービス展開を検討しています。さらに、ユーザーフレンドリーなウォレットやフォークされたプロジェクトの登場で<strong>一般ユーザー</strong>が入りやすい土壌が整ってきました。<br>将来的には<strong>Web3サービス</strong>が大衆化するなかで、BNB Chainが**“エントリーポイント”**として多くの新規ユーザーを取り込む可能性があります。</p>



<h3 class="wp-block-heading">コミュニティガバナンス強化</h3>



<p class="wp-block-paragraph">BNB Chainは中央集権的と批判される部分もあるため、今後は<strong>よりコミュニティ中心のガバナンス</strong>への移行が注目されます。バリデータの増加やステーキングメカニズムの変更などにより、本来の分散性を高める努力が進む可能性があるでしょう。</p>



<h3 class="wp-block-heading">クロスチェーン連携</h3>



<p class="wp-block-paragraph">DeFiやNFTが複数のチェーンを横断する「マルチチェーン時代」に突入しつつある今、BNB Chainも<strong>クロスチェーンブリッジ</strong>の整備や、他のLayer2との相互運用を深めると考えられます。これによりユーザーが自由に資産やデータを行き来でき、より大規模なエコシステムを形成することが期待されます。</p>



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



<p class="wp-block-paragraph">BNB Chain（旧BSC）は、<strong>高速・低手数料</strong>の環境でイーサリアム互換のスマートコントラクトを動かせる、<strong>Binance由来</strong>のブロックチェーンプラットフォームです。</p>



<ul class="wp-block-list">
<li><strong>特徴</strong>
<ul class="wp-block-list">
<li>PoSAコンセンサスによる3秒程度のブロックタイム</li>



<li>ガス代がイーサリアムメインネットより安価</li>



<li>SolidityやTruffle/HardhatなどEVMツールと互換性</li>
</ul>
</li>



<li><strong>ユースケース</strong>
<ul class="wp-block-list">
<li>DeFi（PancakeSwapなど）の大規模流動性</li>



<li>NFTマーケットやゲームが低コスト・高速環境で展開</li>



<li>大手プロジェクトが続々と移行・拡張</li>
</ul>
</li>



<li><strong>課題と懸念</strong>
<ul class="wp-block-list">
<li>バリデータ数が少なく、中央集権的と批判される</li>



<li>セキュリティや詐欺リスクの発生</li>



<li>将来のスケーラビリティ拡大や分散性向上がどう進むか</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">現状、BNB Chainは<strong>Binance</strong>のエコシステムを背景に大量のユーザーと開発者を集め、DeFiやNFT領域で大きな成果をあげています。一方で、<strong>分散性の確保</strong>や<strong>セキュリティ面</strong>への継続的な取り組みも必要不可欠とされます。<br>もしイーサリアム上でのコストや遅延に悩んでいるなら、<strong>EVM互換</strong>を利用して、ほぼ同じ開発フローでBNB Chainにデプロイするのは1つの有力な選択肢です。すでに多数の開発者が使い慣れたSolidity + Hardhatのワークフローを適用できるため、新規学習コストも比較的低いでしょう。<br>今後もクロスチェーンや新たなスケーリング技術との連携が進めば、BNB Chainはさらに魅力的なプラットフォームに進化していく可能性があります。ぜひ公式Wikiやコミュニティ情報を参照し、BNB Chainを活用したDApp開発やDeFi参加を検討してみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/blockchain-bnb-chain/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:12:12 by W3 Total Cache
-->