広告

第19話:ERC20の世界へ!標準トークンのインターフェースを理解する

2025年7月31日

第19話:ERC20の世界へ!標準トークンのインターフェースを理解する

概要

なぜ独自トークンはウォレットに表示されない?その答えであるイーサリアム最重要規格「ERC20」を解説します。それがコードではなく「インターフェース」である理由と、相互運用性を実現する必須関数群を学習。

DeFiの核心であるapprove/transferFromの委任送金の仕組みを深掘りし、世界中のDAppと連携するためのトークン設計思想を身につけます。

目次
Solidity学習講座:最終版 目次(全20話)
Solidity学習講座:最終版 目次(全20話)

基礎編 第1話:未来のインターネットへようこそ!Solidityとスマートコントラクトの全体像 第2話:準備は1分!ブラウザだけで開発できる「Remix IDE」の基本操作 第3話:記念すべき初コント ...

続きを見る

はじめに

これまでの実践編で、あなたは投票システム、独自トークン、そしてオークションといった、本格的なDAppをゼロから構築する力を身につけました。特に第17話で作成した「SimpleToken」は、鋳造・残高管理・送金という、通貨の核心的な機能を持っていましたね。

しかし、ここで一つの素朴な疑問が浮かびます。 「なぜ、私たちの作ったSimpleTokenは、MetaMaskのようなウォレットで残高が表示されないのだろう?」 「なぜ、Uniswapのような分散型取引所(DEX)で取引できないのだろう?」

その答えは、私たちのSimpleTokenが、イーサリアムの世界の**「共通言語」**を話していないからです。それは、特定の村でしか通じない方言のようなもの。世界中の誰もが理解できる「標準語」で話して初めて、あなたのトークンは広大なイーサリアムエコシステムの一員として認められるのです。

その「標準語」こそが、今回学ぶERC20です。ERC20は、イーサリアム上で代替可能なトークン(Fungible Token)を発行するための、最も重要で、最も有名な標準規格です。この規格を理解することは、DeFiの仕組みを理解し、世界と互換性のあるアプリケーションを構築するための、決定的な一歩となります。

「標準」とは何か?なぜERC20は重要なのか?

「標準」の重要性を理解するために、身近なUSBポートを想像してみてください。

キーボード、マウス、USBメモリ、スマートフォン…。メーカーや製品が違っても、同じ形のUSBポートに差し込めば、どれも問題なくコンピュータに認識され、機能しますよね。これは、全ての製品が「USB」という物理的な形状と通信方法の**「標準規格」**に従って作られているからです。

もしこの標準がなければ、私たちは製品ごとに異なる形のポートとケーブルを用意し、コンピュータは製品ごとに特別なソフトウェアをインストールしなければならず、大混乱に陥るでしょう。

ERC20は、まさにトークンにおけるUSBポートです。

ERC20という標準規格は、「代替可能なトークン(どれも同じ価値を持つトークン)とは、最低限これらの関数とイベントを持っていなければならない」というルールを定めたものです。

このルールに従うことで、あなたのトークンは、

  • あらゆるウォレット(MetaMask, Trust Walletなど)で残高が自動的に表示される
  • あらゆる分散型取引所(Uniswap, Curveなど)で取引ペアを組める
  • あらゆるDeFiプロトコル(Aave, Compoundなど)で貸し借りや運用の対象となれる

といった、絶大な**相互運用性(Interoperability)**を手に入れます。ERC20という共通言語があるからこそ、私たちは無数のDAppが連携し合う、巨大な金融エコシステムを享受できているのです。

ERC20インターフェースの解剖

それでは、ERC20が定める「最低限のルール」とは具体的に何なのでしょうか? それは、以下の関数とイベントを、指定された通りに実装することです。これらをインターフェースと呼びます。

1. 基本情報(読み取り専用関数)

全てのERC20トークンは、自身の基本情報を返す、以下の関数を持たなければなりません。

  • name() public view returns (string): トークンの名前(例: "Dai Stablecoin")を返す。
  • symbol() public view returns (string): トークンのシンボル(例: "DAI")を返す。
  • decimals() public view returns (uint8): トークンの小数点以下の桁数を返す。ETHが18桁であるのと同じように、多くのトークンは18を返します。これにより、1トークンを1 * 10^18という整数で表現しつつ、UI上では「1.0」と正しく表示できます。
  • totalSupply() public view returns (uint256): トークンの総供給量を返す。

2. 残高確認と直接送金

ユーザーの残高を確認し、直接送金するための基本的な関数です。

  • balanceOf(address account) public view returns (uint256): accountで指定されたアドレスの残高を返す。
  • transfer(address recipient, uint256 amount) public returns (bool): この関数を呼び出した人(msg.sender)の残高から、recipientamount分のトークンを送金する。

私たちの「SimpleToken」は、totalSupplybalanceOf(publicなマッピング経由)、transferといった、このあたりの機能はすでに実装していましたね。

3. 委任送金(デリゲート転送)- allowanceの仕組み

ここからが、ERC20の真骨頂であり、DeFiを可能にする核心的な仕組みです。これは、**「ユーザーが、自分のトークンを、自分以外の誰か(通常は別のスマートコントラクト)が動かすことを許可する」**ための機能です。

例えば、あなたがUniswapでDAIをUSDCに交換したいとき、あなたはUniswapのコントラクトに対して「私のウォレットからDAIを引き出して、交換処理に使ってください」と許可を与える必要があります。この一連の流れを実現するのが、以下の3つの関数です。

  • approve(address spender, uint256 amount) public returns (bool) トークンの所有者(msg.sender)が、spender(支出を許可されたアドレス。この場合はUniswapのコントラクト)に対して、「私のトークンをamountまでなら自由に使っていいですよ」と**承認(approve)**を与える関数。
  • allowance(address owner, address spender) public view returns (uint256) ownerspenderに対して、あとどれくらいの量のトークンを使うことを許可しているか、その残量を確認する関数。
  • transferFrom(address sender, address recipient, uint256 amount) public returns (bool) spender(例: Uniswap)が、sender(例: あなた)のウォレットからrecipient(例: 交換相手)へ、amount分のトークンを送金するための関数。この関数は、spendersenderから十分なallowanceを与えられている場合にのみ成功します。

この「approve & transferFrom」の仕組みがあるからこそ、DEXやレンディングプロトコルは、ユーザーの資産を安全に(しかしプログラム的に)移動させることができるのです。

4. イベント

ERC20は、トークンの移動と承認に関して、以下の2つのイベントを放出(emit)することを義務付けています。

  • Transfer(address indexed from, address indexed to, uint256 value) トークンがfromからtovalue分移動した際に必ず放出されます。新規発行(ミント)の場合はfromがゼロアドレス(address(0))となり、焼却(バーン)の場合はtoがゼロアドレスとなります。
  • Approval(address indexed owner, address indexed spender, uint256 value) approve関数が成功した際に、誰(owner)が誰(spender)にいくら(value)の許可を与えたかを記録するために放出されます。

まとめ:世界標準を話すということ

お疲れ様でした!今回は、コードを一行も書くことなく、イーサリアムで最も重要な標準規格「ERC20」の設計思想とインターフェースについて学びました。

  • ERC20は、トークンが持つべき関数とイベントを定めた**「インターフェース規格」**である。
  • この規格に従うことで、あらゆるウォレットやDAppとの**「相互運用性」**が保証される。
  • totalSupply, balanceOf, transferといった基本機能に加え、DeFiの要である**approvetransferFromによる委任送金**の仕組みが定められている。

私たちのSimpleTokenを完全なERC20トークンにするには、decimalsの実装や、この委任送金の仕組みを丸ごと追加する必要がある、ということがお分かりいただけたと思います。

そして、この話を現実の開発に繋げると、「ERC20トークンをゼロから書くべきではない」という結論に至ります。なぜなら、OpenZeppelinのような信頼できるライブラリが、ガス効率が良く、セキュリティ監査済みの、完璧なERC20実装を継承可能なコントラクトとして提供してくれているからです。プロの開発者は、その上に独自の機能(例えば、特別なミントのルールなど)を追加していくのです。

さあ、これにてSolidity学習講座の主要なレッスンは全て終了です。あなたは、言語の基本から、DAppの実践的な構築、そして世界標準との接続方法まで、一気通貫で学び抜きました。

次回、**第20話「最終話!これまでの総復習と、次のステップ」**では、この長い旅路を振り返り、あなたが身につけた知識とスキルを再確認します。そして、これからあなたが本格的なWeb3開発者として羽ばたいていくために、次に何を学ぶべきか、その具体的なロードマップを提示します。

目次
Solidity学習講座:最終版 目次(全20話)
Solidity学習講座:最終版 目次(全20話)

基礎編 第1話:未来のインターネットへようこそ!Solidityとスマートコントラクトの全体像 第2話:準備は1分!ブラウザだけで開発できる「Remix IDE」の基本操作 第3話:記念すべき初コント ...

続きを見る

-Solidity