見出し画像

第2回 solidity学習会 講義ノート(2/26 AM8:00~)

こんにちは、CryptoGamesの高橋です。

クリスペの会社です。

また、こちらのCryptoMaidsのアンバサダーも務めさせていただいています。

今回は、2/26 AM8:00から次の場所で勉強会を行いますので、その講義ノートの公開です。

場所 https://meet.google.com/zme-pohq-hcm (前回と同じ場所)

予習や復習などに役立てていただければ幸いです。

はじめる前に
・実施はテストアカウントで行うことを推奨いたします。
Rinkebyというテストネットで実施を行いますが、操作を誤ってしまったときに実際のETHが使われないためです。

・ターゲット層としてプログラミングをやったことがない方を対象としています。そのため、既に経験がある方にとっては簡単な内容だと思いますのでご了承ください。

0 準備

前回と同様のコードを利用します。

こちらの記事を参考に、Remixにコードを貼り付けてそれを元に見て行きましょう。(ここを省いても記事は問題なく読めます。)

1 変数とは?

今回から、solidityのコードを少しずつ読み進めて行きたいと思います。基礎から行いますので、わかるところは飛ばして読んでください。

1ー1 数学の復習

変数は中学校の数学で習った次のようなやつです。

x = 1 
x + 3 = ??

懐かしいですね。

x には1が入っているので、x + 3 = 4ですね。

ちなみに、数学ではこんなこと起こりませんでしたね。

x = こんにちは
x + 3 = ??

もはや、意味不明ですね。「xには数字を入れてよー。」って思いますね。solidityもこれと同じです。

1ー2 uintとは?

では下の、27行目を見てください。

「maxSupply」という変数を用意したのですが、ここにはミントできる最大数を入れたいと思っています。

スクリーンショット 2022-02-19 16.01.10

ここには「いっぱい」という言葉「-500」個という負の整数「5.6」個という小数は入れたくありません。

「5」個というような0以上の整数を入れたいです。

これを表しているのが「uint」です。(256はいったんスルーです。)

1ー3 その他のデータ型(string・boolなど)

他にもURIのような文字列を入れる変数を作ったり、○か×かのような2択を入れたいケースもあります。

スクリーンショット 2022-02-19 15.36.39

そして、変数に文字列を入れたいときには「string」○か×かの2択を入れたい時には「bool」を書くことになります。

なお、○か×かについてはプログラミング上はtrue(○のこと)false(×のこと)で表現します。

なお、これらの型は「データ型」などと呼ばれます。

1ー4 public

public「修飾子」の1つです。修飾子動作を変更させることができるものです。

が、わかりにくいので、具体的に見てみましょう。

スクリーンショット 2022-02-19 16.22.36

このpublicが付くと外から直接アクセスすることができるようになります。

まだ抽象的ですね。Etherscanを見るとイメージがつきやすいと思います。

https://rinkeby.etherscan.io/address/0xa4ebaf212f2ba9816679798f2ab7b011d3b72322

スクリーンショット 2022-02-19 16.31.27

(参考)
Ether,weiの変換など
https://eth-converter.com/

このようにpublicがついているものは外(今回はEtherscan)から値にアクセスすることができます!

では、他にもコード内に「public」がついているところを見つけて、Etherscanでアクセスすることができそうかを見てみましょう。(Write Contractにもないか探してみてください。)

スクリーンショット 2022-02-19 16.36.34

ちなみに、内部の処理としましては、「public」があると「getter関数」という値を取得する関数が作られております。

これにより、外から直接アクセスができるようになります。頭の片隅に入れておいてください。

2 set~関数を見てみよう

2ー1 概要

下のコードを見てみましょう。

何やらset~という関数がたくさんありますね。

スクリーンショット 2022-02-19 17.14.38

どれもかたちが同じですね。全て何かの値をセットしているようです。

2ー2 onlyOwner

2ー2ー1 概要

onlyOwnerはとても大事な修飾子です。

例えば、cost(価格)をセットする関数があったとき、誰かが勝手にセットできては困りますね。

1ETHで売りたかったのに、誰かが勝手に0.01ETHできてしまったら0.01ETHで買われてしまいます。

そのため、このコントラクトのownerでしか処理をできなくするための修飾子がonlyOwnerです。

2ー2ー2 onlyOwnerはsolidity固有のもの?

しかし、実はこの便利なonlyOwnerはsolidityが独自に用意している修飾子ではありません。

OpenZeppelinさんという会社がこのコードを提供してくれています。

これから何度もお世話になると思います。

そのため、OpenZeppelinさんが作ったコードを取り入れる必要があります。それがこちらです。

スクリーンショット 2022-02-19 17.23.22

この19行目はOpenZeppelinさんが作った「Ownable.sol」というコードを取りいている箇所です。

実は、コードを見てみると、下のように、Ownable.solを既に取り込んでいることがわかります。

スクリーンショット 2022-02-19 17.31.52

2ー2ー3 onlyOwnerを体験しよう。

では、実際にonlyOwnerを体験してみましょう。

こちらのコントラクトの「Write Connect」からウォレット接続をしてみてください。

https://rinkeby.etherscan.io/address/0xa0092d257278d5d7cb2a247091aed51e69d0179f

スクリーンショット 2022-02-19 17.38.14

こちらのコントラクト、私がownerなので、私は「setmaxMintAmount」が実行できます。

スクリーンショット 2022-02-19 17.39.10

しかし、みなさんが実行しようとすると、このように警告が出ると思います。

スクリーンショット 2022-02-19 17.40.01

これは、この関数にはonlyOwner修飾子がついており、owner以外は実行することができないためです。

このように実行ができなければ、こちらの実験は完了です。

補足

ちなみに、下は価格を1etherに設定したつもりなのですが、何かおかしいところはないでしょうか??

スクリーンショット 2022-02-24 18.52.50

実はこれは1wei(1etherの10の18乗分の1)が設定されてしまっています。

スクリーンショット 2022-02-24 18.53.04

Ethereumの最小単位はこの「wei」になりますので、十分ご注意ください。

2ー3 引数について

2ー3ー1 概要

まずは、こんな二つの関数があるとします。

関数1 「おはよう!」と表示してくれる
関数2 もらった値を2倍にして返してくれる

関数1は処理をお願いしたら、必ず「おはよう!」と返してくれます。

一方、関数2はどうでしょう?

1を渡せば2が返ってきます。2を渡せば4が返ってきます。

このように関数2は必ず何かの値を渡してあげる必要があります。

このように関数に渡す値を引数と言います。

また、関数1のように引数を必要としない関数もあります。

2ー3ー2 実際の引数を見てみよう

下のsetmaxMintAmountという関数を見てみるとかっこの中に

uint256 _newmaxMintAmount

と書いてあります。これが引数です。

スクリーンショット 2022-02-19 17.58.37

このように、

関数名の後の()の中に引数を渡します。()の中に何もなければ、引数を必要としない関数になります。

つまり、setmaxMintAmountという関数に0以上の整数である「_newmaxMintAmount」という引数を渡しているということがわかりました。

2ー3ー3 補足

ちなみに引数に「_newmaxMintAmount」のように先頭が「アンダースコア(_)」がついていますね。

引数で使われるパラメータは、どこでも呼び出せるグローバル変数(初期パラメータのイメージですが次回以降説明します。)と区別するために(_)をつけるのが通例です。

ただし、これは必須ではありません。

2ー4 処理を見てみよう

では、改めて処理を見てみましょう。

「=」はいわゆるイコールの意味ではなく、代入の意味になります。

スクリーンショット 2022-02-19 17.58.37

そのため、「_newmaxMintAmount」が5である場合、「maxMintAmount」は5が代入され、10である場合は10が代入されます。

2ー5 他の関数も見てみよう

他の下の二つも見てみましょう。

スクリーンショット 2022-02-19 18.16.33

これらも引数で渡された値を代入しているという関数ですね。

memoryについては次回以降扱おうと思いますが、大まかに

memory(メモリ)    : 一時保存
storage(ストレージ): 永続保存

のイメージです。

3 コンストラクタを見てみよう

では、以上を踏まえてコンストラクタを見てみましょう。

コンストラクタはデプロイ時に最初に一度だけ行われる処理でしたね。

スクリーンショット 2022-02-19 18.26.57

見てみると、上のようになっています。

「_initBaseURI」にセットされた値が引数としてsetBaseURIという関数に渡されていますね。

渡されたことでこの値を「baseURI」に代入しています。

今回は「ipfs://QmYJhYes1kzp2soWYEYKzvA84V8YivL8BCpsnN773xyufr/」を「_initBaseURI」にセットするので、この値が「baseURI」にセットされます。

このように、このコンストラクタは値の設定を行なっていたのですね。

4 デプロイ時に全てミントされるコントラクトを作ってみよう

4ー1 概要

コントラクト作成後に全てミントを行う予定であるならば、デプロイ後にわざわざミントを行うのは手間です。

なんとか、デプロイ時に全てミントをしてくれないでしょうか。。

そう、デプロイ時にやってくれる処理といえば、コンストラクタですね!

4ー2 実装してみよう

mintという関数はミントする個数を引数に取ります。(ここは次回以降、見て行きましょう。)

ということは最大供給量であるmaxSupplyを下のように引数で渡してみましょう。

スクリーンショット 2022-02-19 19.29.19

ちなみに、コンストラクタに渡した引数はこちらになります。

・_NAME(名前) 
 ⇨ PurpleEye
・_SYMBOL(シンボル)
 ⇨ PE
・_INITBASEURI(公開後URI)
 ⇨ ipfs://QmYJhYes1kzp2soWYEYKzvA84V8YivL8BCpsnN773xyufr/
・_INITNOTREVEALEDURI(公開前URI)
 ⇨ ipfs://QmVgBb7rK8RDsWa44pRBDSdyXU47qix8QayLMFmRVye8Fp

コンストラクタはデプロイ時に最初に1度だけ行われる処理なので、これでデプロイ時に20個ミントされるはずです。

と、思ったのですが。。何か失敗したようです。

スクリーンショット 2022-02-19 19.29.28

何が悪かったのでしょうか??

そういえば、maxMintAmountは1度にできるミント数でした。

スクリーンショット 2022-02-19 19.32.04

一度にできるミント数が3なのに、一度に20個もミントをしようとしたので、エラーが出たのですね。

スクリーンショット 2022-02-19 19.34.00

今回はとりあえず、一度にミントできる数を20個にしてみました。

OpenSeaのテストネットを見ると、無事、下のように自動で20個のミントができていました。

スクリーンショット 2022-02-19 19.38.49

5 Etherscanをverifyをしよう

コントラクトをデプロイしただけでは、Etherscanの画面は下のようになっています。

スクリーンショット 2022-02-19 21.07.19

この状態からコードを見たり、「Read Contract」・「Write Contract」ができるようになるためにも、verifyを行います。

5ー1 EtherscanのAPIキーを取得しよう

Etherscanのverifyを行うためには、あらかじめEtherscanのAPIキーを取得すると便利です。

ここでは、次のように取得してみましょう。

https://etherscan.io/

画像22

画像23

必要情報を入力しましょう。

スクリーンショット 2022-02-26 6.51.15

「Create an Accont」を押すと、メールが届いている旨が表示されます。

スクリーンショット 2022-02-26 6.52.55

メールを開くと、次のように確認リンクがありますので、選択します。

スクリーンショット 2022-02-26 6.53.12

これで確認が完了しました。

画像28

「API Keys」に行き、「+Add」を選択します。

スクリーンショット 2022-02-26 6.55.38

任意の名前をつけ、「Create New API Key」を選択します。

画像21

これでAPIキーができました!

画像26

5ー2 Remixのプラグインを使おう

ちなみに、私はこのプラグインを、BlockBaseオオキマキさんから教わりました。(私にとっては、心から尊敬している憧れの技術者の方です。)

左下のプラグインのアイコンを選択し、「Etherscan-contract verification」を検索しましょう。

ありましたら、下のように「Activate」として有効にします。

スクリーンショット 2022-02-19 20.48.51

こちらに先ほど取得したAPIキーを入れて、「Save API key」で保存します。

スクリーンショット 2022-02-19 20.49.06

5ー3 引数情報を取得しよう

verifyにはコントラクトに渡した引数も設定する必要があります。

下の箇所を選択し、コピーを行なってください。

スクリーンショット 2022-02-19 20.50.53

そして、メモ帳などの任意のツールに貼り付けてください。

こちらの下の0以降の箇所引数として必要な箇所になります。この部分をコピーしてください。

スクリーンショット 2022-02-19 20.51.09

5ー4 verifyを実行しよう

5ー3でコピーしたものを「Constructor Argument」に貼り付けましょう。

その他の「Contract」「Contract Address」も設定し、「Verify Contract」を押します。

スクリーンショット 2022-02-19 21.07.03

下のように「Contract verified correctly」となれば成功です!

Etherscanを見るとこのようにverifyがされていました。

スクリーンショット 2022-02-19 21.30.53

今回は以上となります。

最後まで、ありがとうございました!

サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊