はじめに
トークンとは一体何者なのか?という疑問が浮かんだのでまずは自分で作って使ってみようということになりました。
ということで、ERC-20トークンを実装しデプロイしてMETAMSKで送金するまでの一連の流れをまとめました。
ERC-20トークンの要件
今回以下の要件を満たすERC-20トークンを作ります。
- 名前は"Test Japanese Yen"
- トークンのシンボルは"tJPY"
- 総発行量は1億トークン
- デプロイ先ネットーワーク(チェーン)はEthereumのGoerli Testnet
EthereumのGoerli Testnet
テストネットワークの一つ。メインネット(Ethereum)で正式に稼働させる前に、事前にテストをするためのネットワークになります。web2で例えるとステージング環境のような位置付けです。
そのため通貨もETHではなくGoerliETHであり実際のお金の価値はありません。
以下公式で紹介されているFausetと呼ばれるサイトから無料で入手することができます。
https://ethereum.org/en/developers/docs/networks/#goerli
作る
ライブラリを使えば5分でデプロイまでできてしまいます。
では始めます。
1. スマートコントラクトを実装
ライブラリをベースに実装することが一般的なようです。
ということでOpenZeppelinのContracts Wizardでコントラクトのソースコードを作成します。
要件通り、Nameに"Test Japanese Yen"、Synbolに"tJPY" 、Premintに"100000000"(1億)を設定します。
作成したソースコード
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract TestJapaneseYen is ERC20 {
constructor() ERC20("Test Japanese Yen", "tJPY") {
_mint(msg.sender, 100000000 * 10 ** decimals());
}
}
2. デプロイ
EthereumのGoerli Testnetに先ほどのコントラクトをデプロイしていきます。
2.1. 開発環境Remixを起動
先ほどのContracts Wizardの「Open in Remix」ボタンをクリックしてRemixを立ち上げます。
すると先ほど作成したソースコードが用意された状態で立ち上がります。
2.2. コンパイル
起動した状態ですでにコンパイル画面になっていると思います。そうでない場合は画面左端のSolidityアイコンをクリックしてください。
「Compile ****」ボタンをクリックしてコンパイルします。
コンパイルできました。画面左端のアイコンに、コンパイルが成功したことを示す緑色のチェックアイコンが表示されています。
2.3. デプロイ
コンパイルしたものをGoerli Testnetにデプロイします。
画面左端のSolidityアイコンの一つ下のアイコンをクリックしてデプロイ画面を表示させます。
この後デプロイする時にMETAMASKを通してEthereum Goerli Testnetにデプロすることになります。なので先にMETAMASKのネットワークをEthereum Goerli Testnetに変更しておきます。
併せて、デプロイ時に必要なガス代(GoerliETH)を調達します。以下のEtherum公式で紹介されているFausetsから好きなものを選び自分のアドレスにGoerliETHを入金してください。上のスクショのように金額が表示されたらOKです。
それではRemixに戻ってデプロイしていきます。
ENVIRONMENT欄で「Injected Provider - MetaMask」を選択します。METAMSKが立ち上がるのでOKしてください。
デプロイミスしないための確認
- 下側に小さく「Goerli」(デプロイ先のネットワーク)と表示されていること
- METAMASKで複数アカウントを管理している場合はACCOUNTの値が期待したアカウントのアドレスであること
「Deploy」ボタンをクリックします。するとMETAMASKが起動してGoerli Testnetにこのコントラクトをデプロイしてよいか承認を求められるので承認(Confirmをクリック)してください。
しばらくすると、Remix画面下側のターミナルにデプロイが正常に完了した旨が表示されます。
また、画面左下の「Deployed Contracts」には先ほどデプロイしたコントラクトが表示されます。ちなみに、ここからコントラクトとやりとりして送金することもできますが今回はMETAMASKを使いたいので割愛します。
これでGoerli Testnetへのデプロイ完了です!
2.4. Etherscanで確認
Etherscan(Goerli)で先ほどデプロイしたtJPYを確認しましょう。
Etherscan(Goerli)でコントラクトアドレスを検索します。
コントラクトアドレスはどこ?
先ほどの画面左下の「Deployed Contracts」のクリップボードボタンでコントラクトのアドレスを取得できます。
期待通りtJPYトークンがデプロイされていることが確認できます。
ついでにトークンの詳細も確認します。TOKEN TRACKERのリンクをクリックしてください。
するとスマートコントラクトで設定した通りに名前、シンボル、発行数量が設定されています。これでバッチリです。
トークンを"作る"パートはこれで以上です。
使う
最後に、先ほどデプロイしたトークンtJPYをMETAMASKを使って送金したいと思います。
と、当たり前のように言っていますが、なぜこれが可能かというと、METAMASKがERC-20トークに対応していて、かつ今回のコントラクトもERC-20に従って実装したからです。
なのでMETAMSKに限らずERC-20トークンに対応しているアプリケーションであれば同様に扱うことができます。
では続けます。
1. METAMASKにtJPYを認識させる
METAMSKで先ほどのコントラクトアドレスを入力してtJPYをインポートします。
2. 送金する
「Dev1 - Unsafe」から「Dev2 - Unsafe」へtJPYを送金しようと思います。
ということで「Send」ボタンをタップして送金相手を選択します。
1000tJPY送金しようと思うのでAmount欄に「1000」を入力して「Next」をタップし、内容に誤りがないことを確認したら「Confirm」をタップして送金を実行します。
結果、「Dev1 - Unsafe」から1000tJPY差し引かれ、「Dev2 - Unsafe」に1000tJPY入金されました。
(事前にDev2 - UnsafeアカウントにもtJPYを認識させています)
3. Etherscanで送金履歴を確認する
コントラクトを確認します。
「Dev1 - Unsafe」がコントラクトを呼び出しているのが分かります。
これで分かるのは、「Dev1 - Unsafe」が直接「Dev2 - Unsafe」に送金しているのではなく、
「Dev1 - Unsafe」に呼び出されたコントラクトが「Dev2 - Unsafe」へ送金する仕組みになっているということです。
ということでその詳細をTOKER TRAKERページで確認します。
すると確かに「Dev1 - Unsafe」が「Dev2 - Unsafe」に1000tJPY送金していることが確認できます。
トークンを"使う"パートもこれで以上です。
まとめ
ERC-20トークンを実装しテストネットワークにデプロイしてMETAMASKで送金するという一連の流れを体験しました。
当たり前のようにtJPYがMETAMSKで認識され、当たり前のように送金することができましたが、これが規格(今回でいうERC-20)による恩恵なんだなぁだと感じました。
EtherscanでのコントラクトのVerifyも扱う予定でしたが、今回のソースコードはOpenZeppelinの外部ライブラリを使っているために一工夫必要で説明が難しくなりそうだったので今回割愛しました。気になった方は調べてみてください。
thirdweb
今回は自作しましたが、thirdwebを使えばブラウザ上のボタンクリックだけでスマートコントラクトをデプロイ&管理することができます。一般的な機能が欲しいだけであればこういったツールを使った方が早く安く確実だと思います。非常に簡単にできるので使うと驚くと思います。
一方、特有の機能や条件を組み込みたいのであれば自作する必要があります。なので適材適所だと思います。