見出し画像

【完全保存版】Astar のWASMコントラクト用のフロントエンドを作ろう!


0 はじめに

今回は、「true」と「false」が入れ替わるだけの「flipper」コントラクトを作成し、その内容をフロントエンドで読み取ります。

なお、「flipper」コントラクトにつきましては、こちらの記事をご確認ください。

1 準備を行う

1 git cloneを行う

まずは、下のように、git cloneを行います。

git clone https://github.com/ytakahashi2020/wasm_front_end_basic.git

2 コントラクトをコンパイルする

次に、コントラクトをコンパイルします。

こちらもご参照ください。

下のように、ディレクトリを移動して、ビルドを行います。

cd wasm_front_end_basic/contracts/flipper_test/contracts/flipper 
cargo contract build

すると、下のように、コンパイルが完了しました。

デプロイ時には、「flipper.contract」を使用します。

3 デプロイする

デプロイはこちらの記事の第1章第3節をご確認ください。

ちなみに、こちらが、できたコントラクトアドレスです。

2 フロントを立ち上げる

1 依存関係のインストール

下のように、フロントエンドのディレクトリに移動し、「yarn install」を行います。

cd ../../../../wasm-test1/
yarn install

2 立ち上げる

では、立ち上げてみましょう。

yarn dev

localhost:3000を確認すると、立ち上がっていることが確認できると思います。

http://localhost:3000/

3 操作してみよう

1 コントラクトの接続

では、コントラクトの接続をしてみましょう。

第1章第3節でできた、コントラクトアドレスを貼り付け、「GetContract」を押します。

下のように、「OK」となりました。

2 関数の操作の確認

では、コントラクトの「get」関数で、「flipper」コントラクトの現在の状態を確認します。

「Get Contract Information」ボタンを押すと、「false」が取れました。

次に、第1章第3節で作った「flipper」コントラクトをSubstrateで操作してみましょう。

フロントで操作するのは、また今度にしようと思います。)

下のように、「flip」関数を実行すると、中身が「true」になるはずです。

下のように、ボタンを押すと、「true」になっていることが確認できました。

4 ソースコードを確認しよう

では、フロントエンドのコードを確認してみましょう。

1 apiの取得

まず、プロバイダーを取得し、それをもとに、apiを取得しています。

この部分は毎回同じなので、このまま覚えてしまってもいいかもしれません。

なお、具体的には、こちらのPolkadot{.js}の公式に記載されています。

https://polkadot.js.org/docs/api/start/create

2 コントラクトの取得

次は、コントラクトの取得です。

「ContractPromise」を使い、必要なのは、①api②メタデータ③コントラクトアドレスの3つです。

なお、メタデータは第1章第2節でコンパイルを行った時にできた、「flipper.json」が該当しています。

なお、公式の該当箇所はこちらです。

これにより、コントラクトのデータの読み取りと、トランザクションの実行が可能になります。

https://polkadot.js.org/docs/api-contract/start/contract.read

3 コントラクトのデータの取得

では、どうやって、データを取得しているのかを確認しましょう。

下のように、「contract.query.['関数名']」で取得しています。

ここでは、「flipper」コントラクトのget関数を使っています。

次に、中身の確認です。

①で誰が行うのかを指定し、②でgasLimitなどを指定しています。

は今回ありませんが、関数に必要な引数があれば、こちらに入ります。

なお、get関数の場合は、ガスが消費されないため、①の誰が行うか重要ではありません。

そのため、下のように、空文字でも動きます。

4 gasLimitについて

次は、gasLimitを見てみましょう。

まずは、大まかには、「WeightV2」というタイプで、ガスの上限を定めています。

そして、もう少し具体的に見ると、「api?.registry.createType」「WeightV2」というタイプのインスタンスを作成しています。

そして、この「WeightV2」の構成としては、「refTime」「proofSize」で構成されています。

つまり、このようなイメージでした。

ちなみに、「RefTime Limit」トランザクションに要するとされる最大時間です。

一方、「ProofSize Limit」はトランザクションで使用される、最大のStorageスペースの容量です。

なお、今回は、こちらの値が設定されています。

ちなみに、Polkadot.jsの公式は昔のものになっておりますので、ご注意ください。

https://polkadot.js.org/docs/api-contract/start/contract.read


数字が大きいので、BNを使用しています。

また、「isub」を用いて、「5_000_000_000_000」から「BN_ONE(1)」引いています。

5 StorageDepositLimitについて


次は、StorageDepositLimitについてです。

こちらは、データの保存時などに使用する、ストレージにかかるガスの上限を表します。

これにより、想定以上にガス代がかかることを防ぎます。

特に、上限を指定しない場合は、下のように、「null」を設定します。

なお、取得した値は、このように、セットしています。

追記 コントラクトのコンパイルがうまくいかないときは

コントラクトのコンパイルがうまくいかないものの、フロントエンドとの繋ぎ込みの部分だけでもやりたいケースもあると思います。

1 フォルダの作成

まずは、「flipper」フォルダに「target」、「ink」フォルダを下のように作成して下さい。

フォルダ名を間違わないようにご注意ください。

2 ファイルのダウンロード

次に、こちらのGithubの下の部分から、この3つのファイルをダウンロードします。

3 ファイルの設定

最後に、下のように、ファイルを設定します。

また、デプロイ時には、こちらの「flipper.contract」を使用することでデプロイが可能です。

今回は以上です。


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