Solidity

【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. 練習問題

以下の課題に挑戦してみましょう:

  1. トークン名やシンボルを動的に変更できるERC-20トークンを作成してください。
  2. トークンの発行者のみが新しいトークンをミントできる仕組みを実装してください。

5. まとめ

本記事では、SolidityでERC-20トークンを作成する方法について解説しました。ERC-20規格を理解し、実践することで、自分自身の仮想通貨やDAppの基盤を構築することが可能になります。