テスト環境上でERC-20のトークンを作ってみました


最近、NFTのおかげでブロックチェーン界隈が一般的になりつつあるので、そろそろ本格的に勉強せねばと思い、とりあえずイーサリアムで多く使われている規格ERC-20のトークンを発行することにしました。

イーサリアムの公式のチュートリアルで紹介されていた YouTube 「Create your own Blockchain ERC20 Token」 をメイン教材に、分からないところはいろいろググって補足して、なんとかテストネットワーク上でのトークン発行までやってみました。

※YouTubeの内容とまったく同じではないです。

正直、1つ1つのコードやコマンド、手順の意味をほとんど理解しておらず、とりあえず手を動かしてみただけなのですが、せっかくですので、その手順を公開します。

1.環境

macOS Catalina

2.MetaMask

まずは、MetaMaskというイーサリアム系の仮想通貨ウォレットを、Google Chrome の拡張機能でゲットします。

3.テストネットワーク

テストネットワークとは、イーサリアム上で作成したDAppsなどをテストするのに利用する環境のことです。
テストするにはテスト用のイーサリアムが必要になります。
テストネットの種類は、Ropsten、 Kovan、 Rinkeby などがあります。

ここでは、Rinkebyにします。
※Ropsten, Kovanも試してみましたが、うまくいかなかったので、Rinkeby にします。

MetaMask を開き、下画像のところをクリック

Rinkebyテストネットワークを選択

なお、テストネットが出ない場合は、[Show/hide]をクリックし

Show test networks を「オン」にします。

METAMASK のアドレスをコピーします。
(以下の画像のところをクリックすればコピーできます)

4.テスト用のイーサリアムをゲット

こちらのサイトを参考にしました。
[イーサリアム] テストネットワーク用ETHの入手方法

変わった方法なのですが、
自分のツイッターで MetaMask のアドレスをつぶやき、ツイートのURLを控えておきます。

MetaMaskで
[購入] > [ETH を取得]

こんなサイトにとびます。
左側の [Crypto Faucet] をクリック

さきほどのツイートのURL をペーストし、[Give me Ether]をクリックします。

自分のMetaMaskにテスト用のイーサリアムが入金されます。

5.環境構築

公式サイトを見ながらやりました。
https://eth-brownie.readthedocs.io/en/stable/install.html

まずpipxをインストール

$ pip install --user pipx
$ pipx ensurepath

これでだめなら、

$ python3 -m pip install --user pipx
$ python3 -m pipx ensurepath

一度、exit でターミナルを閉じます。

再度ターミナルを開き、
pipxを使ってBrownieをインストールします。

$ pipx install eth-brownie

イーサリアムのエミュレーター ganache-cliをインストールします。

npm install -g ganache-cli

トークン作成へ

まずは、brownieのプロジェクトを作成します。

brownie init

以下のフォルダができます。

build           
contracts       
interfaces      
reports         
scripts         
tests

contractsフォルダに
TokenERC20.sol というファイルを作ります。

コードはこちらのをコピペします。
https://github.com/PatrickAlphaC/erc20-brownie/tree/main/contracts

コンパイルします。

$ brownie compile

エミュレーターganache-cli を起動します。

$ ganache-cli

10個のアカウントができていて100ETH ずつ入っています。

scriptsフォルダに
deploy_token.py というファイルを作り、以下のコードを入力します。
ここでは、Tatsuyaというトークン(TTY)を1000000000000000000000TTY発行します。

deploy_token.py
from brownie import accounts, config, TokenERC20

initial_supply = 1000000000000000000000  # 1000
token_name = "Tatsuya"
token_symbol = "TTY"

def main():
    account = accounts.add(config["wallets"]["from_key"])
    erc20 = TokenERC20.deploy(
        initial_supply, token_name, token_symbol, {"from": account} , publish_source=True 
    )

プロジェクトフォルダ直下に
brownie-config.yaml ファイルを作成

brownie-config.yaml
dependencies:
  - OpenZeppelin/[email protected]
compiler:
  solc:
    remappings:
      - '@openzeppelin=OpenZeppelin/[email protected]'
    dotenv: .env
    wallets:
      from_key: ${PRIVATE_KEY}

コンパイルします。

$ brownie compile

INFURA のアカウントを開設し、新規プロジェクトを作り、PROJECT_IDをひかえてきます。

MetaMaskの秘密鍵を控えておきます。
PRIVATE_KEYは、MetaMask アカウントの詳細 > 秘密鍵のエクスポート から取得できます。
※秘密鍵は絶対に公開してはいけません。

ETHERSCANからAPIトークンを取得し、控えておきます。

 

プロジェクトフォルダ直下に
.envファイル を作り、さきほど控えたものをペーストします。

export WEB3_INFURA_PROJECT_ID='INFURAのPROJECT ID'
export PRIVATE_KEY='MetaMaskの秘密鍵'
export ETHERSCAN_TOKEN='ETHERSCANのApi-Key Token'

実行!!

今回のテストネットワークはRinkebyなので --network rinkeby を末尾につけます。

$ brownie run scripts/deploy_token.py --network rinkeby


Brownie v1.17.2 - Python development framework for Ethereum

Erc20TestProject is the active project.

Running 'scripts/deploy_token.py::main'...
Transaction sent: 0x583378041cbf99ab9b27229c5090b662510f4de0bd665a8ad6dfcdf62d393ae8
  Gas price: 1.000000012 gwei   Gas limit: 743694   Nonce: 10
  TokenERC20.constructor confirmed   Block: 9991995   Gas used: 676086 (90.91%)
  TokenERC20 deployed at: 0xAf844d4886118e0e8068D1d5DD4263012a41fd75

Waiting for https://api-rinkeby.etherscan.io/api to process contract...
Verification submitted successfully. Waiting for result...
Verification pending...
Verification complete. Result: Pass - Verified

やったー、とおった!!

Etherscanで見ると、コントラクトができてます。

MetaMaskを開き、 [Import tokens]

さきほどのトークンコントラクトアドレスをペーストし、[add Custom Token]

Import Token

MetaMask に入りました。



以上です。