はじめに
- この記事では作成したコントラクトをGoerliテストネットへデプロイする流れを記載する
- 事前にInfulaやEtherScan、Metamaskなどに登録しておく必要がある
わからない方は下記の動画を見てみましょう。
Goerliテストネットへデプロイする流れ
Chainlink-mixを使おう
まずは Block2 で作成した medicineNotebook.sol を別の場所に避難し、ほかのファイルを全削除する。
以前 Block1 にて brownie init
を実施したが、その代わりに brownie bake chainlink-mix
を実行する。
すると何もないフォルダにBrownieでデプロイするときに使うフォルダやファイルが大量に作成される。
将来的に使うであろう Chainlinkのコントラクトも作成されており便利。
もともと空だったフォルダの中に chainlink というフォルダがあるのでそこで作業する。
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 ファイルから見つけてくれる。
from brownie import medicineNotebook
次に自分の所有する Metamask ウォレットと接続するために get_account 関数をインポートする。
これは同じ scripts フォルダ内の helpful_scripts.py に記載されている。
from brownie import medicineNotebook
from scripts.helpful_scripts import get_account
- get_account 関数を見てみよう
get_account関数とは何なのかについてはこちらを参照ください。
<後日作成するかも>
次に deploy 関数(と main 関数)を作成する。
まずは自分が使いたいウォレットのアカウントを取り込み、そのアカウントでコントラクトをデプロイする。
deploy 関数最後の print
文はコントラクトアドレスの確認のため書いただけなので意味はあまりない。
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>
は各自異なる。
export WEB3_INFURA_PROJECT_ID='<Infula の api-key>'
export PRIVATE_KEY='<自分のウォレットのプライベートキー>'
export ETHERSCAN_TOKEN='<EtherScan の api-key>'
私はテスト用に Infula アカウントやウォレットを作成しているため
ここに書いてもいいが、念のため書かないでおく。
特に自分が普段使いしているウォレットのプライベートキーとかは絶対にネット上に公開しないよう注意。
.env ファイルを作成して各情報を記載したが、
これだけだと brownie はどこから上記情報を読み込めよいかわからない。
そこで、 brownie-config.yamal に下記の記載を追記してやる。
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
で実施する。
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 に記録機能を付けたり情報をとってくる機能を付けたりしようと思う。