この章について

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

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

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

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

(Gepthnrxaee:s#svh0i:[:s.)0.0x.x0]Aprheta#vxs1::h:0[x.0A.x.B]prh#ea2vts:xh::0x[0B.x.C.]

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

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

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

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

EVM(Ethereum Virtual Machine)

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

SEoVlMidity+A.BsI(o(ls)olc))

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

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

:EENTRFHCT20::21,105=0:00,0:g60使a50s,0g0a×0sgagsas

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

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

Web3開発のアーキテクチャ

従来のWeb(Web2)との比較

WWeeb(b(2R3Neeaxctt.j)s)::((NMoedtea.Mjassk))((P(PoEistInthPageFtrrSaeeSu)QmL))

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

各レイヤーの役割

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

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

ウォレット(MetaMask)

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

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

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

IPFS / Pinata

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

開発ツールチェーン

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

1234....SNoe:lx/it/d.ij[tsEy[t+Hha[ewrSr[a[deeHgPhpuamiaomrintldaiMhtNaaaae]ittn]SwnDoeKrt]k]]IPFS

ネットワークの種類

ネットワーク用途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: スマートコントラクトのアカウント。コードによって動作が制御されます。

EOAContractAccount

まとめ

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

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

関連記事