![見出し画像](https://assets.st-note.com/production/uploads/images/72610364/rectangle_large_type_2_c51d971aab3f26870ee92f3b3ff4e3d5.png?width=1200)
第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」という変数を用意したのですが、ここにはミントできる最大数を入れたいと思っています。
ここには「いっぱい」という言葉や「-500」個という負の整数、「5.6」個という小数は入れたくありません。
「5」個というような0以上の整数を入れたいです。
これを表しているのが「uint」です。(256はいったんスルーです。)
1ー3 その他のデータ型(string・boolなど)
他にもURIのような文字列を入れる変数を作ったり、○か×かのような2択を入れたいケースもあります。
そして、変数に文字列を入れたいときには「string」、○か×かの2択を入れたい時には「bool」を書くことになります。
なお、○か×かについてはプログラミング上はtrue(○のこと)とfalse(×のこと)で表現します。
なお、これらの型は「データ型」などと呼ばれます。
1ー4 public
publicは「修飾子」の1つです。修飾子は動作を変更させることができるものです。
が、わかりにくいので、具体的に見てみましょう。
このpublicが付くと外から直接アクセスすることができるようになります。
まだ抽象的ですね。Etherscanを見るとイメージがつきやすいと思います。
https://rinkeby.etherscan.io/address/0xa4ebaf212f2ba9816679798f2ab7b011d3b72322
(参考)
Ether,weiの変換など
https://eth-converter.com/
このようにpublicがついているものは外(今回はEtherscan)から値にアクセスすることができます!
では、他にもコード内に「public」がついているところを見つけて、Etherscanでアクセスすることができそうかを見てみましょう。(Write Contractにもないか探してみてください。)
ちなみに、内部の処理としましては、「public」があると「getter関数」という値を取得する関数が作られております。
これにより、外から直接アクセスができるようになります。頭の片隅に入れておいてください。
2 set~関数を見てみよう
2ー1 概要
下のコードを見てみましょう。
何やらset~という関数がたくさんありますね。
どれもかたちが同じですね。全て何かの値をセットしているようです。
2ー2 onlyOwner
2ー2ー1 概要
onlyOwnerはとても大事な修飾子です。
例えば、cost(価格)をセットする関数があったとき、誰かが勝手にセットできては困りますね。
1ETHで売りたかったのに、誰かが勝手に0.01ETHできてしまったら0.01ETHで買われてしまいます。
そのため、このコントラクトのownerでしか処理をできなくするための修飾子がonlyOwnerです。
2ー2ー2 onlyOwnerはsolidity固有のもの?
しかし、実はこの便利なonlyOwnerはsolidityが独自に用意している修飾子ではありません。
OpenZeppelinさんという会社がこのコードを提供してくれています。
これから何度もお世話になると思います。
そのため、OpenZeppelinさんが作ったコードを取り入れる必要があります。それがこちらです。
この19行目はOpenZeppelinさんが作った「Ownable.sol」というコードを取りいている箇所です。
実は、コードを見てみると、下のように、Ownable.solを既に取り込んでいることがわかります。
2ー2ー3 onlyOwnerを体験しよう。
では、実際にonlyOwnerを体験してみましょう。
こちらのコントラクトの「Write Connect」からウォレット接続をしてみてください。
https://rinkeby.etherscan.io/address/0xa0092d257278d5d7cb2a247091aed51e69d0179f
こちらのコントラクト、私がownerなので、私は「setmaxMintAmount」が実行できます。
しかし、みなさんが実行しようとすると、このように警告が出ると思います。
これは、この関数にはonlyOwnerの修飾子がついており、owner以外は実行することができないためです。
このように実行ができなければ、こちらの実験は完了です。
補足
ちなみに、下は価格を1etherに設定したつもりなのですが、何かおかしいところはないでしょうか??
実はこれは1wei(1etherの10の18乗分の1)が設定されてしまっています。
Ethereumの最小単位はこの「wei」になりますので、十分ご注意ください。
2ー3 引数について
2ー3ー1 概要
まずは、こんな二つの関数があるとします。
関数1 「おはよう!」と表示してくれる
関数2 もらった値を2倍にして返してくれる
関数1は処理をお願いしたら、必ず「おはよう!」と返してくれます。
一方、関数2はどうでしょう?
1を渡せば2が返ってきます。2を渡せば4が返ってきます。
このように関数2は必ず何かの値を渡してあげる必要があります。
このように関数に渡す値を引数と言います。
また、関数1のように引数を必要としない関数もあります。
2ー3ー2 実際の引数を見てみよう
下のsetmaxMintAmountという関数を見てみるとかっこの中に
uint256 _newmaxMintAmount
と書いてあります。これが引数です。
このように、
関数名の後の()の中に引数を渡します。()の中に何もなければ、引数を必要としない関数になります。
つまり、setmaxMintAmountという関数に0以上の整数である「_newmaxMintAmount」という引数を渡しているということがわかりました。
2ー3ー3 補足
ちなみに引数に「_newmaxMintAmount」のように先頭が「アンダースコア(_)」がついていますね。
引数で使われるパラメータは、どこでも呼び出せるグローバル変数(初期パラメータのイメージですが次回以降説明します。)と区別するために(_)をつけるのが通例です。
ただし、これは必須ではありません。
2ー4 処理を見てみよう
では、改めて処理を見てみましょう。
「=」はいわゆるイコールの意味ではなく、代入の意味になります。
そのため、「_newmaxMintAmount」が5である場合、「maxMintAmount」は5が代入され、10である場合は10が代入されます。
2ー5 他の関数も見てみよう
他の下の二つも見てみましょう。
これらも引数で渡された値を代入しているという関数ですね。
memoryについては次回以降扱おうと思いますが、大まかに
memory(メモリ) : 一時保存
storage(ストレージ): 永続保存
のイメージです。
3 コンストラクタを見てみよう
では、以上を踏まえてコンストラクタを見てみましょう。
コンストラクタはデプロイ時に最初に一度だけ行われる処理でしたね。
見てみると、上のようになっています。
「_initBaseURI」にセットされた値が引数としてsetBaseURIという関数に渡されていますね。
渡されたことでこの値を「baseURI」に代入しています。
今回は「ipfs://QmYJhYes1kzp2soWYEYKzvA84V8YivL8BCpsnN773xyufr/」を「_initBaseURI」にセットするので、この値が「baseURI」にセットされます。
このように、このコンストラクタは値の設定を行なっていたのですね。
4 デプロイ時に全てミントされるコントラクトを作ってみよう
4ー1 概要
コントラクト作成後に全てミントを行う予定であるならば、デプロイ後にわざわざミントを行うのは手間です。
なんとか、デプロイ時に全てミントをしてくれないでしょうか。。
そう、デプロイ時にやってくれる処理といえば、コンストラクタですね!
4ー2 実装してみよう
mintという関数はミントする個数を引数に取ります。(ここは次回以降、見て行きましょう。)
ということは最大供給量であるmaxSupplyを下のように引数で渡してみましょう。
ちなみに、コンストラクタに渡した引数はこちらになります。
・_NAME(名前)
⇨ PurpleEye
・_SYMBOL(シンボル)
⇨ PE
・_INITBASEURI(公開後URI)
⇨ ipfs://QmYJhYes1kzp2soWYEYKzvA84V8YivL8BCpsnN773xyufr/
・_INITNOTREVEALEDURI(公開前URI)
⇨ ipfs://QmVgBb7rK8RDsWa44pRBDSdyXU47qix8QayLMFmRVye8Fp
コンストラクタはデプロイ時に最初に1度だけ行われる処理なので、これでデプロイ時に20個ミントされるはずです。
と、思ったのですが。。何か失敗したようです。
何が悪かったのでしょうか??
そういえば、maxMintAmountは1度にできるミント数でした。
一度にできるミント数が3なのに、一度に20個もミントをしようとしたので、エラーが出たのですね。
今回はとりあえず、一度にミントできる数を20個にしてみました。
OpenSeaのテストネットを見ると、無事、下のように自動で20個のミントができていました。
5 Etherscanをverifyをしよう
コントラクトをデプロイしただけでは、Etherscanの画面は下のようになっています。
この状態からコードを見たり、「Read Contract」・「Write Contract」ができるようになるためにも、verifyを行います。
5ー1 EtherscanのAPIキーを取得しよう
Etherscanのverifyを行うためには、あらかじめEtherscanのAPIキーを取得すると便利です。
ここでは、次のように取得してみましょう。
必要情報を入力しましょう。
「Create an Accont」を押すと、メールが届いている旨が表示されます。
メールを開くと、次のように確認リンクがありますので、選択します。
これで確認が完了しました。
「API Keys」に行き、「+Add」を選択します。
任意の名前をつけ、「Create New API Key」を選択します。
これでAPIキーができました!
5ー2 Remixのプラグインを使おう
ちなみに、私はこのプラグインを、BlockBaseのオオキマキさんから教わりました。(私にとっては、心から尊敬している憧れの技術者の方です。)
独自コントラクトでNFTを開発したい、という方向けに
— オオキマキ@NFT開発情報 (@ookimaki_news) February 7, 2022
- 独自コントラクトの開発、デプロイ
- 独自コントラクトのOpenSea登録
をまとめました!
Contract WizardとRemixというオンラインのツールを使って初めての方でもお手軽に試せる方法です。
ぜひ試してみてください!https://t.co/3xfWcqNqtJ
左下のプラグインのアイコンを選択し、「Etherscan-contract verification」を検索しましょう。
ありましたら、下のように「Activate」として有効にします。
こちらに先ほど取得したAPIキーを入れて、「Save API key」で保存します。
5ー3 引数情報を取得しよう
verifyにはコントラクトに渡した引数も設定する必要があります。
下の箇所を選択し、コピーを行なってください。
そして、メモ帳などの任意のツールに貼り付けてください。
こちらの下の0以降の箇所が引数として必要な箇所になります。この部分をコピーしてください。
5ー4 verifyを実行しよう
5ー3でコピーしたものを「Constructor Argument」に貼り付けましょう。
その他の「Contract」「Contract Address」も設定し、「Verify Contract」を押します。
下のように「Contract verified correctly」となれば成功です!
Etherscanを見るとこのようにverifyがされていました。
今回は以上となります。
最後まで、ありがとうございました!
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊