Solidityで「お薬手帳」を作る -テストネットにデプロイ編- Block 3

# はじめに
- この記事では作成したコントラクトをGoerliテストネットへデプロイする流れを記載する
- 事前にInfulaやEtherScan、Metamaskなどに登録しておく必要がある
わからない方は下記の動画を見てみましょう。

<iframe width="560" height="315" src="https://www.youtube.com/embed/M576WGiDBdQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# Goerliテストネットへデプロイする流れ
### Chainlink-mixを使おう
まずは Block2 で作成した medicineNotebook.sol を別の場所に避難し、ほかのファイルを全削除する。
以前 Block1 にて `brownie init` を実施したが、その代わりに `brownie bake chainlink-mix` を実行する。
すると何もないフォルダにBrownieでデプロイするときに使うフォルダやファイルが大量に作成される。
将来的に使うであろう Chainlinkのコントラクトも作成されており便利。
もともと空だったフォルダの中に chainlink というフォルダがあるのでそこで作業する。
 ```powershell:terminal
PS C:\Users\taken\Documents\demos\medicineNotebook> cd chainlink
PS C:\Users\taken\Documents\demos\medicineNotebook\chainlink>
```
避難した medicineNotebook.sol を contracts フォルダ内に移動する。
※buildフォルダ内にも contracts フォルダが存在するが、ここに入れてはいけない。
　chainlink 直下の contracts フォルダに sol ファイルを移動すること。
　今後作成する sol ファイルはここに入れていく。

### pythonでデプロイするためのファイルを作ろう
デプロイするためには python や JavaScript でコードを書かなくてはならない。
この方法も本記事冒頭に示した動画で説明してくれている。

chainlink 直下に scripts フォルダがあるのでそこに deploy.py ファイルを作成する。

まずは medicineNotebookをインポートする。
brownie は優秀で、下記のコードを書けば自動的に contracts フォルダ内の sol ファイルから見つけてくれる。
```python:deploy.py
from brownie import medicineNotebook
```
次に自分の所有する Metamask ウォレットと接続するために get_account 関数をインポートする。
これは同じ scripts フォルダ内の helpful_scripts.py に記載されている。
```python:deploy.py
from brownie import medicineNotebook
from scripts.helpful_scripts import get_account
```

- get_account 関数を見てみよう
get_account関数とは何なのかについてはこちらを参照ください。
＜後日作成するかも＞

次に deploy 関数（と main 関数）を作成する。
まずは自分が使いたいウォレットのアカウントを取り込み、そのアカウントでコントラクトをデプロイする。
deploy 関数最後の `print` 文はコントラクトアドレスの確認のため書いただけなので意味はあまりない。

```python:deploy.py
from brownie import medicineNotebook
from scripts.helpful_scripts import get_account

def deploy():
    account = get_account()
    MedicineNotebook = medicineNotebook.deploy({"from": account})
    print(MedicineNotebook)

def main():
    deploy()
```
これを実行すればテストネットへデプロイできる...かと思いきや、まだ重要なことが抜けている。
どのテストネットへデプロイするのか？自分のウォレットのアドレス情報はどこにあるのか？

### .env ファイルに情報を書き込もう
`brownie bake chainlink-mix` を実行した後、 chainlink フォルダ内に
.env.example といったファイルがあるはず。
このファイル名を .env に変更する。

さらに下記の記載を追加する。`<XXXX>`は各自異なる。
```.env:.env
export WEB3_INFURA_PROJECT_ID='<Infula の api-key>'
export PRIVATE_KEY='<自分のウォレットのプライベートキー>'
export ETHERSCAN_TOKEN='<EtherScan の api-key>'
```
私はテスト用に Infula アカウントやウォレットを作成しているため
ここに書いてもいいが、念のため書かないでおく。
特に自分が普段使いしているウォレットのプライベートキーとかは絶対にネット上に公開しないよう注意。

.env ファイルを作成して各情報を記載したが、
これだけだと brownie はどこから上記情報を読み込めよいかわからない。
そこで、 brownie-config.yamal に下記の記載を追記してやる。
```yaml:brownie-config.yaml
dotenv: .env
```
こうすることで brownie は deploy.py を実行する際に
Infula や ウォレットのアドレスを引っ張ってくることができる。
実際の brownie-config.yaml ファイルには大量の記載があると思うが、それらは省略している。
あと、Goerli の項目の verify を True にしておくと Goerli EtherScan 上で
コントラクトにチェックマークがつく？この意味は後で自分で調べてみる。

これで準備が整ったので Goerli テストネットへデプロイしてみる。

### Goerli テストネットへのデプロイ
テストネットに ETH がないとデプロイできないため、Goerli Faucet から Goerli ETH を取得しておこう。
私は Alchemy の Goerli Faucet から取得した。

デプロイは`brownie run scripts/deploy.py --network goerli`で実施する。
```powershell:terminal 
PS C:\Users\taken\Documents\demos\medicineNotebook\chainlink> brownie run scripts/deploy.py --network goerli
情報: 与えられたパターンのファイルが見つかりませんでした。
Brownie v1.19.1 - Python development framework for Ethereum

ChainlinkProject is the active project.

Running 'scripts\deploy.py::main'...
Transaction sent: 0xff88770bcbb810f092aafef6a59517541c0ce0a97265e72435e3ed9cd021761c
  Gas price: 40.212731713 gwei   Gas limit: 149009   Nonce: 3
  medicineNotebook.constructor confirmed   Block: 8484780   Gas used: 135463 (90.91%)
  medicineNotebook deployed at: 0xC3b33d3Fc9c4A9Fc587c2168Dc22a8ee9742fA5E

0xC3b33d3Fc9c4A9Fc587c2168Dc22a8ee9742fA5E
```
最初の`情報: 与えられたパターンのファイルが見つかりませんでした。`はよくわからない。
意味を知っている方は教えてほしい。いまのところは不都合ないのでいったん無視する。

`Transaction sent: 0xff88770bcbb810f092aafef6a59517541c0ce0a97265e72435e3ed9cd021761c`
はトランザクションハッシュである。
コントラクトをデプロイするというトランザクションに自分のプライベートキーで署名したものが
テストネットに送られたことを意味する...はず。

` medicineNotebook deployed at: 0xC3b33d3Fc9c4A9Fc587c2168Dc22a8ee9742fA5E`
は medicineNotebook コントラクトのコントラクトアドレスである。
Goerli EtherScan でトランザクションハッシュを検索するとコントラクトアドレスが一致しているはず。
最後にコントラクトアドレスが出力されているのは print 文で出力するようにしているからである。

### おわりに
- 今回はコントラクトを記述した sol ファイルをデプロイするところまで実施した。
- 次回以降、この medicineNotebook.sol に記録機能を付けたり情報をとってくる機能を付けたりしようと思う。