トークン規格(ERC-20・721・1155)
なぜ無数のトークンをウォレットや取引所が共通に扱えるのか。ERC-20・721・1155のインタフェースと相互運用、そして事故の温床であるapproveパターンの安全性まで、分散台帳上の状態設計として原理から腑に落ちる。
- 1.ERC規格の本質は「関数シグネチャの約束(インタフェース)」であり、残高や所有者は各コントラクトのストレージに `{アドレス: 残高}` として保持される。トークンは通貨ではなく状態遷移する台帳エントリにすぎない。
- 2.ERC-20は代替可能(fungible)で残高を数量で管理、ERC-721は各IDが一意の非代替(NFT)、ERC-1155は1コントラクトで多数のID+数量を扱い代替も非代替も表現する。差は所有権をどう写像するかにある。
- 3.approve/transferFromは第三者に移転権限を委任する2段階方式。無制限approveの残存・承認レース・トークン取りこぼしが事故源で、Permit署名やpull型設計、安全な受領コールバックで守る。
トークン規格とは「インタフェースの約束」である
ERC(Ethereum Request for Comments)で定められるトークン規格の正体は、新しい貨幣でも特別なオンチェーン機能でもありません。あるコントラクトが「この名前・この引数・この戻り値の関数を必ず備える」というインタフェースの取り決め、ただそれだけです。ERC-20 なら balanceOf(address)、transfer(address,uint256)、approve、transferFrom といった関数群のシグネチャが規定され、これらを実装したコントラクトは「ERC-20 トークン」を名乗れます。
なぜ約束だけで価値が生まれるのか。ウォレット・取引所・DeFi プロトコルといった呼び出す側が、同じ関数名で残高照会や送金を発行できるからです。中身の実装が違っても、外から見えるインタフェースが同一なら、1つのウォレットが数万種のトークンを同じコードパスで扱えます。これが相互運用(composability) の土台で、トークン規格の価値のほぼ全てはここに集約されます。トークン自体はスマートコントラクトであり、その挙動は EVM 上で全ノードが決定的に再現します。
ERC-20 の残高はチェーンの基本機能ではなく、コントラクトの永続ストレージにある写像 {アドレス: 残高} のエントリです。「Aに100トークンある」とは、そのコントラクトの storage スロットに balances[A] = 100 と記録されている状態を指します。送金は EVM の状態遷移で balances[A] を減らし balances[B] を増やす書き換えにすぎません。ネイティブ通貨(ETH)だけは例外で、こちらはプロトコル直下のアカウント残高です。
ERC-20:代替可能トークンと残高モデル
ERC-20 は代替可能(fungible) トークンの規格です。代替可能とは、同種のトークンが1単位1単位で完全に等価で、区別する必要がないこと——1円玉が誰の持つ1円玉とも等価なのと同じです。したがって所有権は「誰がいくつ持つか」という数量の写像だけで表現できます。
中核の状態は次の2つです。balances は {所有者アドレス: 残高}。allowances は {所有者: {委任先: 上限額}} の二重写像で、後述の委任送金に使います。移転は所有者自身が呼ぶ transfer と、事前承認を受けた第三者が呼ぶ transferFrom の2系統があり、いずれも Transfer イベントを発行して外部(インデクサやウォレット)へ変化を知らせます。イベントはログに記録されるだけで残高そのものではない点に注意が必要です。
// ERC-20 の中核インタフェース(抜粋・擬似)
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
実装上の落とし穴が2つあります。第一に、ERC-20 には小数点がなく、全て整数です。decimals()(多くは18)は表示上の桁を示すだけで、内部は最小単位の整数量で保持します。第二に、transfer が失敗時に false を返す実装と revert する実装が混在し、さらに戻り値を返さない旧式トークンも存在します。戻り値を検査しない呼び出し側は「送れていないのに成功扱い」する事故を起こすため、SafeERC20 のようなラッパで戻り値の有無を吸収するのが定石です。
ERC-721:非代替トークン(NFT)
ERC-721 は非代替(non-fungible) トークン、いわゆる NFT の規格です。各トークンが tokenId(一意な整数)で識別され、1つ1つが固有で交換不能です。所有権の写像も ERC-20 とは形が違い、{tokenId: 所有者アドレス} というIDから所有者への写像が中核になります。「数量」ではなく「どのIDを誰が持つか」で所有を表す点が本質的な差です。
代替可能・非代替の違いは、所有権をどう台帳に写すかの違いに帰着します。次の表が要点です。
| 観点 | ERC-20(代替可能) | ERC-721(非代替) |
|---|---|---|
| 識別の単位 | 数量(区別しない) | tokenId(1つずつ固有) |
| 所有の写像 | {所有者: 残高} | {tokenId: 所有者} |
| 移転の粒度 | 任意の数量を分割送金 | ID単位でしか送れない(分割不可) |
| 典型用途 | 通貨・ガバナンス票・ステーブルコイン | アート・会員権・ゲーム資産・証書 |
| メタデータ | 通常なし(等価なので不要) | tokenURI で各IDに属性・画像を紐付け |
ここで重要なのは、画像や属性そのものはチェーン上にないのが通例という点です。tokenURI(tokenId) が返すのは外部(IPFS や HTTP)のメタデータの在り処を示す URL であり、オンチェーンに確定しているのは「そのIDの所有者は誰か」だけです。所有権の記録は分散台帳が保証しますが、URL 先の実体が差し替えられたり消えたりする可能性は規格の外にあります。「NFTを買う」とは実体データの所有ではなく、台帳上のID所有権の取得である、と正確に理解する必要があります。
ERC-721 には safeTransferFrom があり、受取先がコントラクトの場合に onERC721Received コールバックの実装有無を確認します。これを実装しないコントラクトへ NFT を送ると、受け取り側にNFTを扱うロジックがなく永久にロックされる恐れがあるためです。単なる transferFrom はこの検査をせず、取りこぼしの原因になります。受領側の同意を型で強制するこの仕組みは、後述の approve と並ぶ安全設計の柱です。
ERC-1155:マルチトークン規格
ERC-1155 は、1つのコントラクトで多数のトークン種別を同時に扱うマルチトークン規格です。各 id ごとに数量を持つ {id: {所有者: 残高}} という二重写像を中核にし、id を代替可能トークンにも(同一idを大量発行)非代替トークンにも(そのidを1つだけ発行)割り当てられます。ERC-20 と ERC-721 の表現力を1規格に統合したものと捉えると分かりやすいです。
最大の利点はバッチ処理と共有デプロイです。balanceOfBatch や safeBatchTransferFrom で複数種別を1トランザクションでまとめて照会・移転でき、ガス(トークンインセンティブ設計で述べる資源計量)を大きく節約します。ゲームのように何千種のアイテムを扱う用途では、種別ごとにコントラクトを個別デプロイする ERC-721/20 に比べ、デプロイコストも運用も劇的に軽くなります。
| 規格 | 1コントラクトが扱う種別 | 残高の写像 | 代替性 | 強み |
|---|---|---|---|---|
| ERC-20 | 1種類 | {所有者: 残高} | 代替可能のみ | 最も単純・広く普及 |
| ERC-721 | 多数(1 id = 1個) | {id: 所有者} | 非代替のみ | 個体の一意性・メタデータ |
| ERC-1155 | 多数(id ごとに数量) | {id: {所有者: 残高}} | 両方を表現 | バッチ処理・デプロイ共有・省ガス |
ERC-1155 も安全受領を重視し、受取コントラクトに onERC1155Received / onERC1155BatchReceived の実装を要求します。単一と複数で別コールバックを用意するのは、バッチ移転を1つの原子的操作として扱い、途中で一部だけ成功する半端な状態を避けるためです。
approveパターンと相互運用の安全性
複数のトークン規格が共通して抱える急所が approve/transferFrom の委任モデルです。分散型取引所(DEX)のようなコントラクトにトークンを預けて動かしてもらうには、所有者が自分でいちいち送るのではなく、第三者に移転権限を前もって渡す必要があります。その2段階が approve と transferFrom です。
委任送金の2段階(ERC-20 の例)
1. 所有者 → token.approve(DEX, 上限額)
# allowances[所有者][DEX] = 上限額 を記録(権限だけ委任、送金はまだ)
2. DEX → token.transferFrom(所有者, 受取先, 数量)
# allowances を検査・減算し balances を書き換える(実際の移転)
この設計は柔軟ですが、事故と攻撃の温床でもあります。原因はすべて「委任した権限がストレージに残り続ける」ことに由来します。
| リスク | 原因(状態モデル上の理由) | 対策 |
|---|---|---|
| 無制限approveの残存 | 利便のため上限に最大値を承認したまま放置し、後で悪用・流出される | 必要額だけ承認し、使用後に0へ戻す/定期的にrevoke |
| 承認レース(front-running) | 承認額を変更する2トランザクションの隙に旧承認を使い切られ二重消費 | 一旦0にしてから再設定、またはincrease/decreaseAllowance |
| 悪意コントラクトへの承認 | 承認先が信頼できず、いつでもtransferFromで引き出せる | 承認前に相手コントラクトを検証、失効期限付き承認を使う |
| トークン取りこぼし(誤送金) | 非対応コントラクトへ直接transferしロジックがなく回収不能 | safeTransfer系+受領コールバックで受け手の同意を型で強制 |
EIP-2612 の Permit は、approve を「オンチェーン取引」ではなくオフチェーン署名で表現します。所有者が承認内容に署名し、その署名をコントラクトが検証して allowance を設定するため、事前の approve トランザクションが不要になりガスと手間を削れます。署名の検証原理は通常のECDSA署名と同じで、鍵を持つ本人だけが正当な承認を作れます。
もう一つ規格横断で重要なのが ERC-165(インタフェース検出) です。相手コントラクトが supportsInterface(bytes4) に応じ、「自分は ERC-721 に対応する」と機械的に申告できます。呼び出す側は送金前に対応可否を確認でき、非対応先への送信で資産を失う事故を減らせます。インタフェースの約束を実行時に問い合わせられるようにしたのが ERC-165 で、静的な規格合意を動的な相互運用へつなぐ役割を持ちます。
「ERC-20/721/1155 の違い」は所有権の写像で説明できると強いです——20は {所有者: 残高}、721は {id: 所有者}、1155は {id: {所有者: 残高}}。「approve と transferFrom の役割分担」「無制限approveの危険」「safeTransfer と受領コールバックが要る理由」も頻出。核は一貫して、トークンが台帳上の状態写像であり、規格はその読み書きインタフェースを標準化して相互運用を生む、という一点です。
まとめ
- トークン規格の本質はインタフェースの約束であり、残高・所有者は各コントラクトのストレージにある写像として保持される。共通シグネチャがウォレット・DEX による相互運用を生む。
- ERC-20 は代替可能で
{所有者: 残高}、ERC-721 は非代替で{tokenId: 所有者}、ERC-1155 は{id: {所有者: 残高}}で代替も非代替も1コントラクトに統合する。差は所有権の写像方法に帰着する。 - NFT がチェーンに確定するのはID所有権のみで、画像・属性は tokenURI 先の外部データにすぎない。
- approve/transferFrom は権限委任の2段階方式。無制限承認の残存・承認レース・誤送金が事故源で、必要額承認・Permit署名・safeTransfer と受領コールバックで守る。
- ERC-165 で対応インタフェースを実行時に検出でき、静的な規格合意を動的な相互運用へつなぐ。
ブロックチェーン Article
トークン規格(ERC-20・721・1155)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
ブロックチェーン
比較で見る軸
難易度: advanced / カテゴリ: ブロックチェーン / タグ数: 6
導入後に効く点
ERC-20は代替可能(fungible)で残高を数量で管理、ERC-721は各IDが一意の非代替(NFT)、ERC-1155は1コントラクトで多数のID+数量を扱い代替も非代替も表現する。差は所有権をどう写像するかにある。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ブロックチェーン
- タグ数
- 6
判断チェックリスト
- 自社の用途が「ブロックチェーン / トークン規格」に近いか確認する。
- 強みである「ERC規格の本質は「関数シグネチャの約束(インタフェース)」であり、残高や所有者は各コントラクトのストレージに `{アドレス: 残高}` として保持される。トークンは通貨ではなく状態遷移する台帳エントリにすぎない。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。