本文へスキップ
BecomeCoder

Solidityコース · 第5章 発展 ― 継承・トークン・セキュリティ · レッスン22

ERC-20トークン ― 独自通貨を作る

ブラウザで完結

導入

ブロックチェーンといえば「トークン(独自コイン)」。その最も有名な規格が ERC-20 です。実は、決まった関数を持つだけのコントラクトにすぎません。ミニ版を作って仕組みを覗いてみましょう。

説明

ERC-20 の核心は「残高の mapping」と「transfer 関数」です。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract MiniToken {
    string public name = "MiniToken";
    string public symbol = "MINI";
    uint256 public totalSupply;
    mapping(address => uint256) public balanceOf;

    event Transfer(address indexed from, address indexed to, uint256 value);

    // デプロイ時に全供給量を発行者に配る
    constructor(uint256 _supply) {
        totalSupply = _supply;
        balanceOf[msg.sender] = _supply;
    }

    function transfer(address to, uint256 amount) public returns (bool) {
        require(balanceOf[msg.sender] >= amount, "insufficient balance");
        balanceOf[msg.sender] -= amount;
        balanceOf[to] += amount;
        emit Transfer(msg.sender, to, amount);
        return true;
    }
}
  • balanceOf … 「誰が何枚持っているか」の mapping。これがトークンの本体。
  • totalSupply … 発行総量。コンストラクタで発行者(デプロイした人)に全部渡している。
  • transfer(to, amount) … 自分の残高を減らし相手を増やす。第4章で学んだ requireevent がそのまま活きている。

つまり トークンとは「残高表とその更新ルール」を持つ1つのコントラクトです。ETH のような特別な存在ではなく、Solidity で書かれた普通のプログラムだと分かります。本物の ERC-20 は、これに approve / transferFrom(第三者に代理送金を許可する仕組み)などを加えたもので、OpenZeppelin の実装を継承して安全に作るのが実務の定番です。

graph TB
    C["MiniToken コントラクト"]
    C --> B["balanceOf(残高表)"]
    B --> O["発行者: 1000000"]
    B --> A["Alice: 50"]
    B --> D["Bob: 30"]
    C --> TF["transfer で残高を移動"]

やってみよう

第2〜4章で学んだ mapping・require・event・constructor が、そのままトークンの部品になっていることを確かめてみましょう。基礎の積み重ねだけで「独自通貨」が書けてしまう――これが Solidity の面白さです。

実際に動かしてみよう

下のエディタのコントラクトを「コンパイル & デプロイ」すると、ブラウザ内で本物のSolidityコンパイラ(solc)がコンパイルし、EVM(@ethereumjs)にデプロイされます。デプロイ後は public な関数がボタンになって並ぶので、引数を入れて呼び出すと戻り値・イベント・require のエラー(revert理由)まで確認できます。本文のコントラクトを書き換えて動きを試しながら進めましょう(コンパイラ本体は初回だけ読み込みに数秒かかります)。

Solidity — ブラウザ内でコンパイル & 実行

ブラウザ内で本物のSolidityコンパイラ(solc)とEVM(@ethereumjs)を動かす環境を読み込みます(コンパイラ本体は初回のコンパイル時に読み込むため、最初の実行だけ数秒かかります)。
スクロールして表示された時点でも自動で読み込まれます。