はじめに
当記事はビットコインとか勉強会#60【ERC20トークン開発ハンズオン】の資料です。
アーカイブ動画は↓こちらになります。
Remix
↑EthereumのIDE「Remix」を使って、早速デプロイしてみましょう。
Google ChromeかBraveで開いてください。他のブラウザは動作できるかわからないです。
Workspaces
の中で、contracts
ディレクトリの中にMyToken.sol
ファイルを作成します。
ERC20ソースコード
「Create your own ERC20 token」の箇所をなぞればすぐにERC20トークンが開発できます。
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
は以下のようになります。
// 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です。
transfer
のrecipient
の入力欄に貼り付け、`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のソースコードを簡単に作成できるツールです。
続き
approve, transferFromの使い方について続編を書きました。