この章について

前章までで、Solidityの基本的なコントラクト作成とイベント機能を学びました。ここで少し立ち止まり、ブロックチェーンとWeb3開発の全体像を俯瞰しましょう。個々の技術要素がどのように関連し合い、全体としてどのようなシステムを構成するのかを理解することで、後の章の学習がよりスムーズになります。

ブロックチェーンの基本概念

ブロックチェーンとは何か

ブロックチェーンは、トランザクション(取引)の記録を「ブロック」という単位にまとめ、それを鎖(チェーン)のように連結したデータ構造です。各ブロックは前のブロックのハッシュ値を含むため、過去のデータを改ざんすると後続のすべてのブロックが無効になります。

ブロック #0        ブロック #1        ブロック #2
(Genesis)
┌──────────┐    ┌──────────┐    ┌──────────┐
│ prev: 0x0│◄───│prev: 0xA │◄───│prev: 0xB │
│ tx: [...] │    │ tx: [...] │    │ tx: [...] │
│ hash: 0xA│    │ hash: 0xB│    │ hash: 0xC│
└──────────┘    └──────────┘    └──────────┘

Ethereum とスマートコントラクト

Ethereumは、ブロックチェーン上でプログラム(スマートコントラクト)を実行できるプラットフォームです。ビットコインが「プログラム可能な通貨」なら、Ethereumは「プログラム可能なコンピュータ」と言えます。

スマートコントラクトの特徴は以下のとおりです。

特徴説明
不変性デプロイ後にコードを変更できない
決定性同じ入力に対して常に同じ結果を返す
透明性コードとデータが公開される
自律性条件が満たされれば自動的に実行される

EVM(Ethereum Virtual Machine)

EVMは、Solidityなどの高級言語で書かれたスマートコントラクトを実行する仮想マシンです。Solidityのコードはまずバイトコードにコンパイルされ、EVM上で実行されます。

Solidity (.sol)
    ↓ コンパイル (solc)
バイトコード + ABI
    ↓ デプロイ (トランザクション)
EVM上で実行可能

ガス(Gas)とトランザクション

Ethereum上でのすべての計算にはガスが必要です。ガスは計算リソースの単位であり、ガス代はETH(Ethereumの通貨)で支払います。

トランザクションのコスト = ガス使用量 × ガス価格

例:
  ETH送金: 21,000 gas
  ERC20トークン送金: 約65,000 gas
  NFTミント: 約150,000 gas
  複雑なコントラクト呼び出し: 数十万 gas

トランザクションの構造は以下のようになっています。

// トランザクションの構成要素
{
  from: "0x...",       // 送信者アドレス
  to: "0x...",         // 送信先アドレス(コントラクトアドレス)
  value: 0,            // 送金額(ETH)
  data: "0x...",       // 呼び出す関数とパラメータ(ABIエンコード)
  gasLimit: 150000,    // ガス上限
  maxFeePerGas: "...", // 最大ガス価格
  nonce: 5,            // 送信者のトランザクション番号
}

Web3開発のアーキテクチャ

従来のWeb(Web2)との比較

Web2 アーキテクチャ:
┌────────────┐    ┌────────────┐    ┌────────────┐
│ フロントエンド │───→│ バックエンド  │───→│ データベース  │
│ (React等)   │    │ (Node.js等) │    │ (PostgreSQL) │
└────────────┘    └────────────┘    └────────────┘

Web3 アーキテクチャ:
┌────────────┐    ┌────────────┐    ┌────────────┐
│ フロントエンド │───→│  ウォレット   │───→│ ブロックチェーン│
│ (Next.js等) │    │ (MetaMask)  │    │ (Ethereum)  │
└────────────┘    └────────────┘    └────────────┘
                                    ┌────────────┐
                                    │    IPFS     │
                                    │ (Pinata等)  │
                                    └────────────┘

Web3では、バックエンドサーバーの代わりにブロックチェーン上のスマートコントラクトがビジネスロジックを担い、データベースの代わりにブロックチェーンのストレージとIPFSがデータを保持します。

各レイヤーの役割

フロントエンド(Next.js, React)

  • ユーザーインターフェースの提供
  • ウォレットとの接続(wagmi, ethers.js)
  • コントラクトの呼び出しとレスポンスの表示

ウォレット(MetaMask)

  • 秘密鍵の管理
  • トランザクションの署名
  • ユーザーの認証(接続アドレスがIDとなる)

スマートコントラクト(Solidity)

  • ビジネスロジックの実行
  • 状態(ストレージ)の管理
  • イベントの発行

IPFS / Pinata

  • 大きなデータ(画像、JSON等)の分散保存
  • コンテンツアドレッシング(データの内容からアドレスが決まる)

開発ツールチェーン

本書で使用する開発ツールの全体像は以下のとおりです。

開発フロー:

1. コントラクト開発
   Solidity → [Hardhat] → コンパイル → テスト → デプロイ

2. フロントエンド開発
   Next.js + wagmi → ウォレット接続 → コントラクト呼び出し

3. データ保存
   画像/メタデータ → [Pinata SDK] → IPFS

4. テスト/デプロイ
   ローカル → [Hardhat Network]
   テストネット → [Sepolia]
   本番 → [Ethereum Mainnet]

ネットワークの種類

ネットワーク用途ETHの入手方法
Hardhat Networkローカル開発自動で付与
SepoliaテストFaucetから取得
Ethereum Mainnet本番取引所で購入

トランザクションのライフサイクル

ユーザーがフロントエンドからNFTをミントするまでの流れを追ってみましょう。

// 1. ユーザーがミントボタンをクリック
// 2. wagmiがトランザクションデータを構築
const tx = await writeContract({
  address: contractAddress,
  abi: contractABI,
  functionName: "mint",
  args: [userAddress, tokenURI],
});

// 3. MetaMaskがトランザクション確認ダイアログを表示
//    ユーザーが「確認」をクリック

// 4. トランザクションがネットワークに送信される
//    → メモリプール(mempool)に入る
//    → バリデータがブロックに含める
//    → ブロックが確定する

// 5. トランザクションレシートを取得
const receipt = await waitForTransactionReceipt(config, { hash: tx });
// receipt.status === 'success' → 成功
// receipt.status === 'reverted' → 失敗(revert)

// 6. フロントエンドのUIを更新

ABI(Application Binary Interface)

ABIは、フロントエンドとスマートコントラクトの間のインターフェース定義です。コントラクトの関数名、引数の型、戻り値の型が記述されています。

[
  {
    "inputs": [
      { "name": "to", "type": "address" },
      { "name": "uri", "type": "string" }
    ],
    "name": "mint",
    "outputs": [{ "name": "", "type": "uint256" }],
    "stateMutability": "nonpayable",
    "type": "function"
  }
]

Hardhatでコンパイルすると、artifacts/contracts/ContractName.sol/ContractName.json にABIが生成されます。

アカウントの種類

Ethereumには2種類のアカウントがあります。

EOA(Externally Owned Account): 秘密鍵で制御される一般的なアカウント。MetaMaskで管理するアドレスはEOAです。

Contract Account: スマートコントラクトのアカウント。コードによって動作が制御されます。

EOA(ウォレット)→ トランザクション送信 → Contract Account
                                    関数実行
                                    状態更新
                                    イベント発行

まとめ

本章では、ブロックチェーンとWeb3開発の全体像を整理しました。EVM、ガス、トランザクション、ABIといった基本概念と、フロントエンドからスマートコントラクトまでの各レイヤーの役割を理解しました。

次章では、Solidityの重要なデータ構造である mapping について学びます。

関連記事