導入
ブロックチェーンといえば「トークン(独自コイン)」。その最も有名な規格が 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章で学んだrequireとeventがそのまま活きている。
つまり トークンとは「残高表とその更新ルール」を持つ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 の面白さです。