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


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


[イーサリアムの公式のチュートリアル](https://ethereum.org/ja/developers/tutorials/
)で紹介されていた YouTube　「[Create your own Blockchain ERC20 Token] (https://www.youtube.com/watch?v=8rpir_ZSK1g)」　をメイン教材に、分からないところはいろいろググって補足して、なんとかテストネットワーク上でのトークン発行までやってみました。

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

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


##1.環境
macOS Catalina


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

[![Image from Gyazo](https://i.gyazo.com/079bfcf8998371507ae482bda81c24df.png)](https://gyazo.com/079bfcf8998371507ae482bda81c24df)


##3.テストネットワーク

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

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

MetaMask を開き、下画像のところをクリック
[![Image from Gyazo](https://i.gyazo.com/14de23908029cf260e5245126ea95019.png)](https://gyazo.com/14de23908029cf260e5245126ea95019)

Rinkebyテストネットワークを選択
[![Image from Gyazo](https://i.gyazo.com/633f6d78d3c330230025b0a1dbff6f79.png)](https://gyazo.com/633f6d78d3c330230025b0a1dbff6f79)


なお、テストネットが出ない場合は、[Show/hide]をクリックし
[![Image from Gyazo](https://i.gyazo.com/9617c8a0fc564e3754511b1d7a1c7910.png)](https://gyazo.com/9617c8a0fc564e3754511b1d7a1c7910)

Show test networks を「オン」にします。
[![Image from Gyazo](https://i.gyazo.com/f629d5b0306cac4e0098788825c5bc53.png)](https://gyazo.com/f629d5b0306cac4e0098788825c5bc53)


METAMASK のアドレスをコピーします。
（以下の画像のところをクリックすればコピーできます）
[![Image from Gyazo](https://i.gyazo.com/744251a07da55a035695dd38f8a36158.png)](https://gyazo.com/744251a07da55a035695dd38f8a36158)

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

こちらのサイトを参考にしました。
[[イーサリアム] テストネットワーク用ETHの入手方法](https://pprct.net/ethereum_testnet_howtouse/#RinkebyETH)

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

MetaMaskで
[購入] ＞ [ＥＴＨ　を取得]

こんなサイトにとびます。
左側の [Crypto Faucet] をクリック
[![Image from Gyazo](https://i.gyazo.com/8d3948004b0503fab126f2785d3e162b.png)](https://gyazo.com/8d3948004b0503fab126f2785d3e162b)

さきほどのツイートのURL　をペーストし、[Give me Ether]をクリックします。
[![Image from Gyazo](https://i.gyazo.com/9891b21b837b1e45489dda362f93f5b5.png)](https://gyazo.com/9891b21b837b1e45489dda362f93f5b5)

自分の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 ずつ入っています。
![スクリーンショット 2022-01-14 22.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/5be56a40-fb03-1cb9-a59e-58abdd69328a.png)


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/openzeppelin-contracts@3.4.0
compiler:
  solc:
    remappings:
      - '@openzeppelin=OpenZeppelin/openzeppelin-contracts@3.4.0'
　　　　dotenv: .env
　　　　wallets:
  　　　　from_key: ${PRIVATE_KEY}
```


コンパイルします。

```
$ brownie compile
```


[INFURA](https://infura.io/) のアカウントを開設し、新規プロジェクトを作り、PROJECT_IDをひかえてきます。
![スクリーンショット 2022-01-14 23.00.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/c11113ca-3d4e-11e0-c72f-3f7de5ec42bd.png)

MetaMaskの秘密鍵を控えておきます。
PRIVATE_KEYは、MetaMask　アカウントの詳細　＞　秘密鍵のエクスポート　から取得できます。
※秘密鍵は絶対に公開してはいけません。
[![Image from Gyazo](https://i.gyazo.com/4d51921757dee45241a3165fd1d87254.png)](https://gyazo.com/4d51921757dee45241a3165fd1d87254)

[ETHERSCAN](https://etherscan.io/)からAPIトークンを取得し、控えておきます。

　<br>

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

```.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](https://etherscan.io/)で見ると、コントラクトができてます。
[![Image from Gyazo](https://i.gyazo.com/a912637d6176213fb8d6cf078c796256.png)](https://gyazo.com/a912637d6176213fb8d6cf078c796256)


MetaMaskを開き、 [Import tokens]

[![Image from Gyazo](https://i.gyazo.com/66734adf9146957a79ccaefcaeb38889.png)](https://gyazo.com/66734adf9146957a79ccaefcaeb38889)

さきほどのトークンコントラクトアドレスをペーストし、[add Custom Token]
[![Image from Gyazo](https://i.gyazo.com/0cde56754b3d46b3f043009d4e8457a4.png)](https://gyazo.com/0cde56754b3d46b3f043009d4e8457a4)

Import Token
[![Image from Gyazo](https://i.gyazo.com/41aaed8ad6ec41b9bc61923a4be9243e.png)](https://gyazo.com/41aaed8ad6ec41b9bc61923a4be9243e)

MetaMask に入りました。
[![Image from Gyazo](https://i.gyazo.com/72c95743ad600601eb60664949f51ee6.png)](https://gyazo.com/72c95743ad600601eb60664949f51ee6)

[![Image from Gyazo](https://i.gyazo.com/fe57d3285f7c061d42dc125617770793.png)](https://gyazo.com/fe57d3285f7c061d42dc125617770793)

<br>
以上です。