ERC20トークン開発ハンズオン


はじめに

当記事はビットコインとか勉強会#60【ERC20トークン開発ハンズオン】の資料です。

アーカイブ動画は↓こちらになります。

Remix

↑EthereumのIDE「Remix」を使って、早速デプロイしてみましょう。

Google ChromeかBraveで開いてください。他のブラウザは動作できるかわからないです。

Workspacesの中で、contractsディレクトリの中にMyToken.sol
ファイルを作成します。

ERC20ソースコード

「Create your own ERC20 token」の箇所をなぞればすぐにERC20トークンが開発できます。

MyToken.sol
pragma solidity ^0.8.10;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {
    constructor(string memory name, string memory symbol) ERC20(name, symbol) {
        // Mint 100 tokens to msg.sender
        // Similar to how
        // 1 dollar = 100 cents
        // 1 token = 1 * (10 ** decimals)
        _mint(msg.sender, 100 * 10**uint(decimals()));
    }
}

上記コードをRemixのerc20.solに貼り付けます。

左のメニューに、エラーが出てしまいました。

importするファイルが読み込めないとのことです。

↓代わりにこちらを読み込んでみましょう。

importするファイルのURLを書き換えてあげて、MyToken.solは以下のようになります。

MyToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {
    constructor(string memory name, string memory symbol) ERC20(name, symbol) {
        // Mint 100 tokens to msg.sender
        // Similar to how
        // 1 dollar = 100 cents
        // 1 token = 1 * (10 ** decimals)
        _mint(msg.sender, 100 * 10**uint(decimals()));
    }
}

コンパイルが通るようになりました。

JavaScript VMを使ったデプロイ

Testnetを使う前に、練習でRemixのVM上にてERC20コントラクトをデプロイしてみます。

左のメニュー下から二つ目のアイコンをクリックして、デプロイしていきます。

ENVIRONMENTは初期値のJavaScript VM(London)のままにします。

Deployボタンの横の入力欄に

"Winecoin, "WIC"

というように、コイン名、ティッカー(3-4文字英大文字の略称)をつけてみましょう。

そして、Deployボタンを押します。

もしくは、Deployボタンの右側のvを押すと、引数ごとに入力しやすくなります。

⇅引数ごとに入力する場合、"(ダブルクォーテーション)は有っても無くてもデプロイできます。

コンソールで緑のチェックマークが出てきたので、デプロイ成功です。

DEPRPY & RUN TRANSACTIONSの一番下にMYTOKEN AT 0X...とあります。

>をクリックします。

これらはデプロイしたERC20コントラクトの関数になります。

テキスト入力欄のあるものは引数を取る関数。

橙色のボタンは送金等、状態を変化させる関数。

青色のボタンは状態を変化させない関数でチェーン上のコントラクトの状態を確認するものになります。

状態の参照

それぞれ確認してみます。

`decimals'は小数点以下何桁まで分割可能にするか。BTCは8桁ですが、ETHが18桁なのでERC20も18桁のものが多いです。

nameはデプロイ時に入力したWinecoinです。

symbolはデプロイ時に入力したWICです。

totalSupplyは100000000000000000000です。

これはソースコードerc20.sol

_mint(msg.sender, 100 * 10**uint(decimals()));

にある通り、100×10^18作られています。

100WICあり、補助単位の最小値(10の18乗分の1)をalcとしたら、100000000000000000000alcあることになります。

ACCOUNT欄をコピーして、balanceOfに貼り付け実行すると、100000000000000000000あることが確認できます。

トークンの送金

Accountのプルダウンから今使っている一番上のアドレス以外を選択しましょう。

異なるアドレスを選んでコピーボタンを押します。

送金前の送金先の残高を確認してみましょう。

当然0です。

transferrecipientの入力欄に貼り付け、`amount`には送金元の所有額以下を入力します。

例えば、5000000000000000000

ACCOUNTを一番上の最初のアドレスに戻します。

実行します。

送金先の残高がちゃんと増えていました。

送金元の残高が5000000000000000000減っています。

その他の関数

approve, allownance, transferFromについては普段使わない機能です。今回は扱わないですが、詳しくは下記記事をご覧ください。

ソースコード

pragma solidity ^0.8.10;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {
    constructor(string memory name, string memory symbol) ERC20(name, symbol) {
        // Mint 100 tokens to msg.sender
        // Similar to how
        // 1 dollar = 100 cents
        // 1 token = 1 * (10 ** decimals)
        _mint(msg.sender, 100 * 10**uint(decimals()));
    }
}

contractでコントラクトの宣言をします。

A is Bで継承ができます。AがBのサブクラス。(BがAのスーパークラス)

constructorとはデプロイ時に実行される関数です。

ERC20.solをimportしていて、ERC20は以下の3つのコントラクトをimportし継承しています。

Metamaskを使ったデプロイ

ここからは、Metamaskを使ってTestnetで実際にERC20コントラクトをデプロイし、送金してみましょう。

Metamaskはブラウザ拡張型のウォレットです。Ethereumを使うWebページに秘密鍵を露出させず、セキュアに署名をすることができます。

↑こちらからChromeまたはBraveに追加します。

新規で作成する場合、ニーモニックが画面に表示されますが、紙に書いて厳重に保管しましょう。

(Testnetでしか使わない場合はPC上のファイルに保管でもいいでしょうが。。)

ネットワークをRopstenに切り替えましょう。

Metamaskを準備しておきます。

Faucet

EthereumのTestnetRopstenのFaucetからコインを入手します。

Faucetとは蛇口という意味で、ブロックチェーンの世界では、Testnetコインのバラマキ所です。

↑MetaMask Ether Faucetが使えなくなってしまいました。

色々なFaucetを確認したところ、正常に稼働するのは以下です。(1日に0.3ETH)

※ハンズオン参加者が一斉にFaucetを触るとダウンする恐れがあります。既にRopstenのETHをお持ちの方は使用をお控えください。

環境はInjected Web3を選びます。

Metamask側では、接続をクリックします。

Metamaskのアカウントが接続済みになっていることを確認し、RemixのACCOUNTと同じであることを確認します。

NAMEとSYMBOLを入力したらデプロイしてみましょう。VMのときと同じでも違ってもどちらでも構いません。

Deployボタンを押すと、Metamaskがポップアップします。

確認ボタンを押すとコントラクトをデプロイするトランザクションがブロードキャストされます。

コンソールにcreation of MyToken pending...と表示されます。

VMでやったときと異なり、時間がかかります。

デプロイできました。

transaction hashをコピーして、ropstenのetherscanで見てみましょう。

↓検索窓にTransaction Hashを登録した結果がこちらです。

コントラクトの内容を見てみましょう

他のアカウントをコピーしてそれを送金先としてトークンを送ってみましょう。

Metamask上で、50 WICと出てきました。

確認ボタンを押します。

送金できました。

画面を閉じた後にコントラクトを触る方法

コードのタブで該当のファイルを開いた状態で、デプロイしたアドレスを入力すると、Deployed Contractsにコントラクトの関数一覧が出てきます。

便利ツールのご紹介

GUIが整ったERC20やERC721のソースコードを簡単に作成できるツールです。