
MetaMask環境として用意いただきたい事項の説明
MetaMaskについて補講が必要な方向けの案内
リスクやトラブル回避のため、このコース用に専用MetaMaskをご用意ください。
提供ソースコードと資料の案内をします
セクション目標
Hardhat環境構築
Hardhatを使ったスマートコントラクトの開発、テスト方法
NFTスマートコントラクト開発の基本
開発するDAppの概要説明
UIイメージ
開発するDAppの概要説明
DApp構成
開発するDAppの概要説明
開発するスマートコントラクト機能概要
このコースのDApp開発で使用する主な開発ツール類についての概要説明
Goerli
Infra/Alchemy
Etherscan
Hardhat
OpenZeppelin Contracts
NFT.STORAGE(IPFS/Filecoin)
Ethers.js
Mocha/Waffle/Chai
Next/React
TailwindCSS
このレクチャーではVScodeをインストールし、このコースで使う拡張機能をインストールし、vscodeエディタの起動確認するところまで行います。
不要な方はこのレクチャーを飛ばして次のレクチャーに進んでください。
このレクチャーでは、nodeとgitをインストールします。
nodeはLTS安定版のバージョン16を指定して使います。
すでにインストール済みの方や不要な方はこのレクチャーを飛ばして次のレクチャーに進んでください。
次のレクチャーで使うコマンドラインです。次のレクチャーに進んでください。
開発に入る前の環境構築としてHardhatプロジェクト作成とこのコースで使う関連パッケージ類インストールを行います
hardhat
ethers.js
hardhat-ethers
hardhat-waffle
ethereum-waffle
hardhat-etherscan
chai
dotenv
openzeppelin /contracts
次のレクチャーで使う内容です。次のレクチャーに進んでください。
GitHubリポジトリを作成しここまでやったことをプッシュして保存します
スマートコントラクトの開発、そして開発したコードのユニットテストに入る前にHardhat自体の設定を行います
スマートコントラクトのレイアウトを定義します
OpenZeppelinのContractsライブラリのインポートと継承、そしてconstructor定義まで行います
前のレクチャーでコンパイルエラーとなった4件の対応をしていきます
テストコードのレイアウトを作成するところまでを行います
constructorで定義した内容のテストを作成します
前のレクチャーで作ったテストの効率化を行います。
前のレクチャーでは、それぞれのテスト項目ごとに、MemberNFTをデプロイしました。この部分を毎回書くと非効率なので、テスト実行の前処理、として共通化して効率化します。このレクチャーでは、この共通化の方法を学んでいきます。
beforeEachというのもを使います。
MemberNFT.solにNFT 作成ファンクション定義を行います
NFT 作成ファンクションのテストを行います
イベント定義までを行います。
NFTを作成したタイミングでイベントを発行します。
NFT 作成時に発行されるはずのイベントのテストを行います。
コンパイルした際に新たに作成されたファイル群の説明をします
このセクションのまとめ
セクション目標
ローカルノードにデプロイする方法の習得
Ethereumテストネットにデプロイする方法の習得
コードをEtherscanに公開する方法の習得
デプロイコードを書いて、デプロイをします。
デプロイ先はHardhatが独自に用意してくれている一時的なブロックチェーンにデプロイします。
前のレクチャーとは少し違う方法でデプロイします。
ローカルのPC環境上にブロックチェーンノードを立ち上げてそのノードにスマートコントラクトをデプロイして、クエリやトランザクションを発行する、ということをやります。
プロバイダーであるAlchemyに接続してブロックチェーンと連携を取るために使うAPIKEYを作成します
前のレクチャーで作成したAPIkeyとMetaMaskのウォレットアドレスを使用してプログラムからトランザクションを発行するための秘密鍵を、環境変数に設定します。併せて、環境変数から値を取得して、EthereumテストネットにデプロイするためのHardhat設定を行います。
【お知らせ】NFT.STORAGEのUIが変更されレクチャー動画と異なります
CAR fileへのコンバートと複数ファイルのNFT.Storageへの一括アップロード
デプロイするためのスクリプトを作成
前のレクチャーの続きでスクリプトを完成させて、デプロイ実行するところまで行います。
デプロイ後の確認をEtherscanとOpenSeaで行います
Etherscanアカウント作成とAPIkey発行方法
Etherscanにコードを公開します。
そのためには、verifyというものを実行します。
Etherscanから簡単なクエリを発行して動作確認をしてみます。
このセクションのまとめ
セクション目標
ERC-20に近いトークンを扱うスマートコントラクトの開発方法習得
ERC-20とは何か概要とこのコースで作る機能の説明をします。最後に参考までですがERC-20の実際トークンの例も案内します。
contractのレイアウトと状態変数の定義を行います
トークンを別のアカウントに送ったり、預けたり引き出せる機能を持つのですが、それぞれ実行した後にイベントを発行するようにします
コントラクトがチェーンにデプロイされる際に実行するconstructorの定義を行います
onstructorで定義した内容を取得するファンクションを作成します
テストスクリプトのベース部分、具体的には
変数定義とbeforeEachによる前処理を作成します
constructorで定義した内容を取得するファンクションのテストを作成します
個人間でトークンを移転する処理を書いていきます
次のレクチャーで使うゼロアドレス定義です。次のレクチャーに進んでください。
個人間でトークンを移転する処理のテストを実装します。長くなるでレクチャーを分けながら少しずつ進めていきます
前のレクチャーの続きで、テストコードを書いていきます
前のレクチャーの続きで、テストコードを書いていきます
このセクションのまとめ
セクション目標
他のスマートコントラクトと接続・連携する方法の習得
TokenBankに預けたトークン数の取得機能を実装
預け入れ自体の機能を実装
TokenBankとの取引のテストを実装します
前のレクチャーの続きで、TokenBankとの取引のテストを実装します
TokenBankとのトークン取引である引き出し機能を実装します
TokenBankからの引き出し機能のテストを実装します
MemberNFTと連携させます。
具体的には、NFTを持っていない場合は銀行機能を実行できないという制限をかけるために連携します。制限については次のレクチャーで扱います。
制限を追加していきます。
具体的には、NFTを持っていない場合は銀行機能を実行できないという内容に制限をかけるために連携します。
またコントラクトオーナーは預入、引出を実行しても意味はないのでそもそも実行できないように明確に制限をかけます。
テストコードでMemberNFTとの連携部分を実装します。
MemberNFT連携と制御のテストを実装します
このセクションのまとめ
セクション目標
Constructor初期値をもつスマートコントラクトのVerify方法習得
デプロイスクリプトを作成します
デプロイ後の確認とEtherscanへのVerifyを実行しソースコードを公開します
このセクションのまとめ
セクション目標
MetaMaskと接続し、イベントに対応する方法の習得
フロントエンドアプリの画面イメージの再確認をサラリと行います
フロントエンドアプリを作るための環境準備を行います
NextとTailwindCSSをインストールして、ローカルPC上でNextデフォルトのページを表示するところまで進めていきます
Nextのindex.jsに各種インポートをするところまで進めます
次のレクチャーで使用するSVGです。次のレクチャーに進んでください。
タイトルや画像というページ共通部分であるタイトルと画像を表示させるところを進めます
次のレクチャーで使う定義です。次のレクチャーに進んでください。
MetaMaskがインストールされているか、接続しているチェーンがGoerliであるかをチェックする部分を作ります
MetaMaskでこのコースで使用するRinkebyテストネットワークが指定されているかどうかをチェックする機能を実装します
MetaMaskをサイトに接続する機能を実装します
前のレクチャーで実装したMetaMask接続機能をボタンとしてWebUIに表示して、ボタンを押したら接続するように実装していきます
MetaMaskアカウントとチェーン変更の対応する機能を実装します
このセクションのまとめ
セクション目標
フロントエンド含めた「DApp」開発を体験
スマートコントラクトへのクエリ・トランザクションを発行する方法の習得
TokenBankへのクエリを発行して残高などの情報を取得します
次のレクチャーで使うコードです。次のレクチャーに進んでください。
前のレクチャーで取得した残高などの情報をページに表示させます
MemberNFTクエリとNFT所有チェック機能を作ります
次のレクチャーで使うコードです。次のレクチャーに進んでください。
MemberNFTを持っているアカウント限定フォーム表示部分のうち、トークン移転用のフォームを表示させます
前のレクチャーで表示したフォームに宛先とトークン数を入力してボタンを押すと、トークンが移転される機能を実装します
前のレクチャーの続きを進めていきます。
ボタンを押した時に移転を実行する関数を作ります。
次のレクチャーで使うコードです。次のレクチャーに進んでください。
MemberNFTを持っているアカウント限定のトークン預入フォーム表示を作ります
前のレクチャーで作ったトークン預入機能の確認をします
次のレクチャーで使うコードです。次のレクチャーに進んでください。
MemberNFTを持っているアカウント限定のトークン引出フォーム表示を作ります
前のレクチャーで作ったトークン引き出し機能の確認をします
所有NFTの情報を取得する実装をします。
checkNFT関数の中に追記していきます
次のレクチャーで使うコードです。次のレクチャーに進んでください。
MemberNFTを持っているアカウントについては所有NFTを表示するようにします
開発したフロントエンドアプリをVercelというサービスにアップロードしてインターネットに公開させていきます。
前のレクチャーで公開したアプリを使って簡単な動作確認をします
このセクションのまとめ
このセクションは補講という位置付けです。必要な方のみ受講ください。
前回制作したコースから本コースの事前準備に該当する以下内容を抜粋していますので、多少本コースと文脈が合わない内容を話しているところがありますが、気にしないでください。
MetaMaskのインストール
アカウントを3つ作成(合計4アカウント)
テスト用ネットワークの表示
テスト用仮想通貨の取得
作成したアカウントへの振替送金(レクチャーでは1アカウントのみへの振り替えの内容ですが、追加作成した3アカウントに対してアカウント2と3には0.01ETH、さらにアカウント4だけは0.02ETHを振り替えしてください。)
MetaMaskとは
Chrome拡張版MetaMaskをインストールします
MetaMaskアカウントを3つ追加作成
アカウントの切り替え方法
MetaMaskテストネットの表示設定
接続先のチェーンを切り替える方法
Alchemyアカウント作成とテスト用仮想通貨取得
MetaMaskを使って自分のアカウント間でテスト仮想通貨の送金確認を行います
【注意事項】
コース制作時はEthereum のテストチェーンとして「Rinkeby」を使用していましたが、先般実施された大型アップデート「ETH Merge」にてRinkebyが廃止となったため「Goerli」読み替え、聞き替えをお願いします。動画レクチャーは順次アップデートしていきます。ご不便おかけしますが、よろしくお願いいたします。
NFTを所有している特別なアカウントのみが使える機能(トークン移転、預入、引出)を提供するDApp(分散アプリケーション)を開発していきます。
スマートコントラクトは2つ開発します。
1つは、NFTスマートコントラクトです。ERC-721に準拠したものをOpenZeppelinのContractsライブラリを使って開発します。
もう一つは、ERC-20に完全準拠はしていないもののERC-20の一部をスクラッチ開発していきます。さらに、銀行機能をイメージしたようなトークンの移転、預入、引出機能を開発します。
具体的に何をどのような順番で学んでいくかについては、以下と『コースの内容』をご参照ください。
開発の流れなど
開発する順番
NFTスマートコントラクト->FTスマートコントラクト->フロントエンド
スマートコントラクト開発
開発->ユニットテストを繰り返していくスタイルで開発していきます
ユニットテストは品質向上だけでなく、フロントエンドアプリからスマートコントラクトを操作するために使うEthers.jsの習熟も目的にしています。
開発が終わったら最終的にテストネットのGoerliにデプロイします
フロントエンドアプリ開発
大きく2セクションに分けています
MetaMaskを開発するサイトに接続する機能開発
スマートコントラクトに接続し、クエリやトランザクションを発行する機能開発
注意
Ethers.jsを使ったDApp開発に主眼を置いています
Next.js/TailWind CSSについては「学ぶ」というより「体験する」を重視しているため、深く解説することは行っていません
本コースで扱う主な技術・規格・サービス
開発言語 :Solidity (v0.8.9)
ライブラリ :OpenZeppelin(v4.7.0)
開発フレームワーク :Hardhat(v2.9.9)
クライアントライブラリ : Ethers.js(v5.6.9)
ユニットテスト : Waffle(v3.4.4)/Chai(4.3.6)
フロントエンドアプリ : Next(v12.2)
CSS : TrailWindCSS(v3.1.4)
ホスティングサービス : Vercel(フロントエンドのデプロイ先として使用)
Ethereum規格 :ERC-721,(ERC-20は参考程度)
ブロックチェーン(テスト用ネット):Ethereum Goerli
エクスプローラ :Etherscan
ウォレット :Metamask(ブラウザ:Chrome)
ソースコードリポジトリサービス :GitHub
NFTマーケットプレイス :OpenSea
分散型ストレージ :NFTStorage(IPFS/FileCoin)
注意事項
・本コース制作の中で発生したエラーやWarning、バグについて
本コースでは開発の中で出たエラーやWarning、バグなどについてあまり編集をせず残しています。
本コースは教材なので、あえてエラーを発生させ修正する方法学ぶ、というものも当然多くありますが、私自身意図していないエラーの発生やタイポなどお見せするのも恥ずかしいようなものも少し残しています。このような類のエラー、不具合は、ユニットテストなどテストで気づけることが多いので、テストの重要性をより強調するための意図で残すことにしました。あらかじめご了承ください。
・質問の受付について
コースで扱っているレクチャー内容やレクチャーを進めていくにあたり進められず詰まってしまったなどあれば質問をください。可能な限り回答するようにしますので活用ください!
また、講義に解説を追加して欲しい!というリクエストも随時受け付けていますので連絡ください。お待ちしています。
ただ1点、コースで扱っているレクチャー内容以外のご質問は基本的に受け付けていませんので予めご了承願います(コース関係ない内容だけどご自身が今開発してるコードのレビューなどはご勘弁ください)。
・本コースで扱うソースコードについて
本コースで扱う2つのスマートコントラクトとフロントエンドアプリのソースコードは学習目的のものですが、本コースの受講者か否かに限らず提供できるようパブリックリポジトリにし、コードもMITライセンスを採用しています。
(この形でスタートして何か問題が出て来ればそのタイミングで見直します。)
利用者の権利はMITライセンスの内容通りですので必ず確認をお願いします。また、ソースコードをそのまま使ったり、切り貼りしたりしてご自身のNFTコントラクトを開発し、Ethereumなどのメインネットワークにデプロイするのは推奨しません。
・免責事項
このコースで多くのサービスを使いながら学びますが、全て学習目的です。技術を学ぶためのコースであり、特定の銘柄や商品の投資や投機を促すものではありません。いかなる責任も賠償もできませんので予めご了承の上受講ください。