WEBアプリからNFTキャラクターを呼び出そう
👋 Web アプリケーションからスマートコントラクトを呼び出す
これまでのレッスンでは、スマートコントラクトのロジックの設定を行いました。
これからは、スマートコントラクトをWebアプリケーションから呼び出す機能を実装していきます。
下記のステップに沿って、Sepolia Test Networkにデプロイされたスマートコントラクトに、Webアプリケーションを接続させていきます。
1. デプロイされた最新のコントラクトアドレスをコピーし、Webアプリケーションに貼り付けます。
2. 最新のABIファイルをコピーして、Webアプリケーションのディレクトリに貼り付けます。ABIとは何かについては、のちほど詳しく説明します。
3. クライアント(=フロントエンド)からスマートコントラクト(=バックエンド)にアクセスするために、ethers.jsをインポートします。
🏠 最新のスマートコントラクトアドレスを取得する
あなたのスマートコントラクトのデプロイ先のアドレス(=スマートコントラクトアドレス)をApp.jsでも使用します。
deploy.jsスクリプトを実行するたびに、ターミナルに出力されていたアドレス(Contract deployed to: 0x..)を覚えていますか?
0x..が、あなたがデプロイしたスマートコントラクトアドレスになります。
ブロックチェーン上には、何百万ものコントラクトが存在しています。
クライアント(= Webアプリケーションのフロントエンド)に対して、どのコントラクトに接続するかを伝えるために、スマートコントラクトアドレスが必要です。
このアドレスは、さまざまなタイミングで使用する予定ですので、簡単にアクセスできるようにしましょう。
client/srcの中にconstants.jsファイルを作成し、以下のコードを追加してください。
const CONTRACT_ADDRESS = "YOUR_CONTRACT_ADDRESS_GOES_HERE";
export { CONTRACT_ADDRESS };
YOUR_CONTRACT_ADDRESS_GOES_HEREの部分にあなたのスマートコントラクトアドレスを貼り付けてください。
次に、App.jsファイルに戻り、ファイルの先頭に下記をインポートして、constants.jsにアクセスできるようにしましょう。
import { CONTRACT_ADDRESS } from "./constants";
📁 最新の ABI ファイルを取得します。
ABI(Application Binary Interface)はコントラクトの取り扱い説明書のようなものです。
Webアプリケーションがコントラクトと通信するために必要な情報が、ABIファイルに含まれています。
コントラクト1つ1つにユニークなABIファイルが紐づいており、その中には下記の情報が含まれています。
1. そのコントラクトに使用されている関数の名前
2. それぞれの関数にアクセスするために必要なパラメータとその型
3. 関数の実行結果に対して返るデータ型の種類
ABIファイルは、コントラクトがコンパイルされた時に生成され、contract/artifactsディレクトリに自動的に格納されます。
ターミナルでcontractディレクトリに移動し、lsを実行しましょう。
artifactsディレクトリの存在を確認してください。
ABIファイルの中身は、MyEpicGame.jsonというファイルに格納されいます。
下記を実行して、ABIファイルをコピーしましょう。
1. ターミナル上でcontractにいることを確認する(もしくは移動する)。
2. ターミナル上で下記を実行する。
code artifacts/contracts/MyEpicGame.sol/MyEpicGame.json
3. VS CodeでMyEpicGame.jsonファイルが開かれるので、中身をすべてコピーしましょう。
※ VS Codeのファインダーを使って、直接 MyEpicGame.json を開くことも可能です。
次に、下記を実行して、ABIファイルをWebアプリケーションから呼び出せるようにしましょう。
1. ターミナル上でclientにいることを確認する(もしくは移動する)。
2. 下記を実行して、client/src/の中にutilsディレクトリを作成する。
mkdir src/utils
3. 下記を実行して、utilsディレクトリにMyEpicGame.jsonファイルを作成する。
touch src/utils/MyEpicGame.json
4. 下記を実行して、MyEpicGame.jsonファイルをVS Codeで開く。
code client/src/utils/MyEpicGame.json
5. 先ほどコピーしたcontract/artifacts/contracts/MyEpicGame.sol/MyEpicGame.jsonの中身を新しく作成したclient/src/utils/MyEpicGame.jsonの中に貼り付けてください。
ABIファイルの準備ができたので、App.jsにインポートしましょう。
下記をApp.jsの1行目に追加しましょう。
import myEpicGame from "./utils/MyEpicGame.json";
ここでは、先ほど取得した、ABIファイルを含むMyEpicGame.jsonファイルをインポートしています。
🚨 コントラクトを再びデプロイする際の注意点
コントラクトの中身を更新する場合、必ず下記3つのステップを実行することを忘れないようにしましょう。
1. 再度、コントラクトをデプロイする。
yarn contract deployを実行する必要があります。
2. フロントエンド(App.js)のCONTRACT_ADDRESSを更新する。
3. ABIファイルを更新する。
contract/artifacts/contracts/MyEpicGame.sol/MyEpicGame.jsonの中身を新しく作成するclient/src/utils/MyEpicGame.jsonの中に貼り付ける必要があります。
コントラクトを更新する際、必ずこの 3 つのステップを実行してください。
-
一度デプロイされたスマートコントラクトを変更することはできません。
-
コントラクトを変更するには、完全に再デプロイする必要があります。
-
新しくデプロイされたスマートコントラクトは、ブロックチェーン上で新しいコントラクトとして扱われるため、すべての変数はリセットされます。
-
つまり、コントラクトのコードを更新したい場合、すべての NFT データが失われます。