【Solidity】第6章第1回:ERC-20トークンの基本と実装

本記事では、Solidityを使用してERC-20トークンを作成する方法を解説します。ERC-20はEthereum上で最も一般的なトークン規格であり、仮想通貨やDAppの基盤となる重要な技術です。
0. 記事の概要
この記事を読むメリット
- ERC-20の基礎理解:トークン規格の概要と用途を学べます。
- トークン作成の実践力:SolidityでERC-20トークンを開発する具体的な手順を理解できます。
- 応用力の向上:ERC-20を基にした独自トークンのカスタマイズ方法を学べます。
この記事で学べること
- ERC-20トークンの基本仕様
- Solidityによるトークンの実装
- トークン開発時の注意点とベストプラクティス
1. ERC-20トークンとは?

1.1 ERC-20の概要
ERC-20は、Ethereumブロックチェーン上でトークンを作成するための標準規格です。この規格を使用することで、トークン間の互換性を確保し、ウォレットや取引所での扱いが容易になります。
1.2 ERC-20トークンの基本仕様
ERC-20トークンは以下の関数とイベントを含むインターフェースに従います:
totalSupply()
: トークンの総供給量を返すbalanceOf(address _owner)
: 指定アドレスのトークン残高を返すtransfer(address _to, uint256 _value)
: トークンを転送するapprove(address _spender, uint256 _value)
: 指定アドレスに一定量のトークン使用を許可するtransferFrom(address _from, address _to, uint256 _value)
: 他者のアカウントからトークンを転送するallowance(address _owner, address _spender)
: 使用許可されたトークン量を返す
2. SolidityでのERC-20トークン実装

2.1 基本的なコード例
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract MyERC20Token {
string public name = "MyToken";
string public symbol = "MTK";
uint8 public decimals = 18;
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
constructor(uint256 _initialSupply) {
totalSupply = _initialSupply * (10 ** uint256(decimals));
balanceOf[msg.sender] = totalSupply;
}
function transfer(address _to, uint256 _value) public returns (bool success) {
require(balanceOf[msg.sender] >= _value, "Insufficient balance");
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
function approve(address _spender, uint256 _value) public returns (bool success) {
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(balanceOf[_from] >= _value, "Insufficient balance");
require(allowance[_from][msg.sender] >= _value, "Allowance exceeded");
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
allowance[_from][msg.sender] -= _value;
emit Transfer(_from, _to, _value);
return true;
}
}
動作解説
このコードでは、MyERC20Token
というERC-20トークンを作成しています。トークンの名前やシンボル、初期供給量を設定し、基本的な関数を実装しています。
3. トークン開発時の注意点とベストプラクティス

3.1 セキュリティ
トークン開発時には、以下のセキュリティ対策を行いましょう:
- 入力値の検証:ユーザーからの入力を必ず検証する
- 整数のオーバーフロー防止:Solidity 0.8.0以降ではデフォルトでオーバーフローが防止されますが、明示的に注意すること
- テスト:包括的なテストを実施し、脆弱性を特定する
3.2 ガスコストの最適化
ガスコストを削減するため、以下のポイントに注意してください:
- ストレージ操作を最小化する
- 不要な計算を避ける
- イベントの使用を適切に制限する
4. 練習問題
以下の課題に挑戦してみましょう:
- トークン名やシンボルを動的に変更できるERC-20トークンを作成してください。
- トークンの発行者のみが新しいトークンをミントできる仕組みを実装してください。
5. まとめ
本記事では、SolidityでERC-20トークンを作成する方法について解説しました。ERC-20規格を理解し、実践することで、自分自身の仮想通貨やDAppの基盤を構築することが可能になります。