12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Blockchain(ブロックチェーン)Advent Calendar 2021

Day 17

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

Last updated at Posted at 2022-01-26

はじめに

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

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

Remix

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

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

スクリーンショット 2022-01-26 17.31.46.png

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に貼り付けます。

スクリーンショット 2022-01-26 17.32.34.png

スクリーンショット 2022-01-23 22.13.54.png

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

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()));
    }
}

スクリーンショット 2022-01-26 17.34.02.png

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

JavaScript VMを使ったデプロイ

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

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

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

スクリーンショット 2022-01-26 17.36.10.png

スクリーンショット 2022-01-23 22.29.24.png

Deployボタンの横の入力欄に

"Winecoin, "WIC"

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

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

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

スクリーンショット 2022-01-24 21.35.59.png

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

スクリーンショット 2022-01-24 20.25.42.png

スクリーンショット 2022-01-26 17.38.26.png

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

スクリーンショット 2022-01-26 17.39.45.png

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

>をクリックします。

スクリーンショット 2022-01-23 22.37.59.png

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

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

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

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

状態の参照

スクリーンショット 2022-01-24 21.50.08.png

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

`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あることになります。

スクリーンショット 2022-01-24 21.57.37.png

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

スクリーンショット 2022-01-24 21.58.47.png

トークンの送金

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

スクリーンショット 2022-01-24 21.48.13.png

スクリーンショット 2022-01-24 21.49.07.png

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

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

スクリーンショット 2022-01-24 22.10.39.png

当然0です。

スクリーンショット 2022-01-24 22.09.23.png

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

例えば、5000000000000000000

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

スクリーンショット 2022-01-24 22.12.46.png

実行します。

スクリーンショット 2022-01-24 22.14.23.png

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

スクリーンショット 2022-01-24 22.14.57.png

送金元の残高が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上のファイルに保管でもいいでしょうが。。)

スクリーンショット 2022-01-25 23.58.53.png

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

Metamaskを準備しておきます。

Faucet

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

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

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

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

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

環境はInjected Web3を選びます。

スクリーンショット 2022-01-26 0.04.45.png

スクリーンショット 2022-01-26 0.06.23.png

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

スクリーンショット 2022-01-26 0.07.00.png

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

スクリーンショット 2022-01-26 0.10.02.png

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

スクリーンショット 2022-01-26 0.11.00.png

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

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

スクリーンショット 2022-01-26 0.12.24.png

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

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

スクリーンショット 2022-01-26 0.16.38.png

デプロイできました。

スクリーンショット 2022-01-26 0.17.07.png

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

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

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

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

スクリーンショット 2022-01-26 0.37.48.png

スクリーンショット 2022-01-26 0.39.23.png

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

確認ボタンを押します。

送金できました。

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

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

スクリーンショット 2022-01-26 0.52.30.png

便利ツールのご紹介

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

続き

approve, transferFromの使い方について続編を書きました。

12
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?