この章について
前章までで、Solidityの基本的なコントラクト作成とイベント機能を学びました。ここで少し立ち止まり、ブロックチェーンとWeb3開発の全体像を俯瞰しましょう。個々の技術要素がどのように関連し合い、全体としてどのようなシステムを構成するのかを理解することで、後の章の学習がよりスムーズになります。
ブロックチェーンの基本概念
ブロックチェーンとは何か
ブロックチェーンは、トランザクション(取引)の記録を「ブロック」という単位にまとめ、それを鎖(チェーン)のように連結したデータ構造です。各ブロックは前のブロックのハッシュ値を含むため、過去のデータを改ざんすると後続のすべてのブロックが無効になります。
Ethereum とスマートコントラクト
Ethereumは、ブロックチェーン上でプログラム(スマートコントラクト)を実行できるプラットフォームです。ビットコインが「プログラム可能な通貨」なら、Ethereumは「プログラム可能なコンピュータ」と言えます。
スマートコントラクトの特徴は以下のとおりです。
| 特徴 | 説明 |
|---|---|
| 不変性 | デプロイ後にコードを変更できない |
| 決定性 | 同じ入力に対して常に同じ結果を返す |
| 透明性 | コードとデータが公開される |
| 自律性 | 条件が満たされれば自動的に実行される |
EVM(Ethereum Virtual Machine)
EVMは、Solidityなどの高級言語で書かれたスマートコントラクトを実行する仮想マシンです。Solidityのコードはまずバイトコードにコンパイルされ、EVM上で実行されます。
ガス(Gas)とトランザクション
Ethereum上でのすべての計算にはガスが必要です。ガスは計算リソースの単位であり、ガス代はETH(Ethereumの通貨)で支払います。
トランザクションの構造は以下のようになっています。
// トランザクションの構成要素
{
from: "0x...", // 送信者アドレス
to: "0x...", // 送信先アドレス(コントラクトアドレス)
value: 0, // 送金額(ETH)
data: "0x...", // 呼び出す関数とパラメータ(ABIエンコード)
gasLimit: 150000, // ガス上限
maxFeePerGas: "...", // 最大ガス価格
nonce: 5, // 送信者のトランザクション番号
}
Web3開発のアーキテクチャ
従来のWeb(Web2)との比較
Web3では、バックエンドサーバーの代わりにブロックチェーン上のスマートコントラクトがビジネスロジックを担い、データベースの代わりにブロックチェーンのストレージとIPFSがデータを保持します。
各レイヤーの役割
フロントエンド(Next.js, React)
- ユーザーインターフェースの提供
- ウォレットとの接続(wagmi, ethers.js)
- コントラクトの呼び出しとレスポンスの表示
ウォレット(MetaMask)
- 秘密鍵の管理
- トランザクションの署名
- ユーザーの認証(接続アドレスがIDとなる)
スマートコントラクト(Solidity)
- ビジネスロジックの実行
- 状態(ストレージ)の管理
- イベントの発行
IPFS / Pinata
- 大きなデータ(画像、JSON等)の分散保存
- コンテンツアドレッシング(データの内容からアドレスが決まる)
開発ツールチェーン
本書で使用する開発ツールの全体像は以下のとおりです。
ネットワークの種類
| ネットワーク | 用途 | 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: スマートコントラクトのアカウント。コードによって動作が制御されます。
まとめ
本章では、ブロックチェーンとWeb3開発の全体像を整理しました。EVM、ガス、トランザクション、ABIといった基本概念と、フロントエンドからスマートコントラクトまでの各レイヤーの役割を理解しました。
次章では、Solidityの重要なデータ構造である mapping について学びます。