見出し画像

Solanaで簡単なゲーム用コントラクトを作ってみよう!

0 はじめに

本日は、「Solana Playground」「Tiny Adventure」について解説していきたいと思います。

この記事は、下の「Counter PDA チュートリアル」をやった後に行うことを想定しています。

デプロイの仕方などは同じなので、この記事では、コードの内容を見ていきます。

1 概要

概要としては、実行すると、(キャラクターを想定した)位置が右や左に移動するものになります。

2 コントラクトのコードを見てみよう

では、前回行っていないところを中心に見てみましょう

1 initialize関数について

「mod」からプログラムが始まり、その中で、初期化を行う、「initialize」関数が定義されています。

Contextとして、「Initialize」が指定されています。

2 データの割当量について

では、データ検証部分で、Initaializeを見てみましょう。

まずは、下で、割り当てるデータ量の話をしています。

最初の8バイがデフォルトのアカウント識別子の分で、後の1つが実際のデータに使用される分のようです。

3 シードについて

では、シードの部分を見てみましょう。

文字列リテラルの前に、bのプレフィックスがついています。

これにより、バイト列として表現しています。

4 init_if_neededについて

次に、「init_if_needed」を見てみましょう。

こちらは、アカウントがまだ存在しない場合にのみ初期化を行う機能です。

アカウントの再初期化攻撃に対して適切な保護措置を講じる必要があるため、注意して使用する必要があります。

具体的には、アカウント初期化する関数と使用する関数を分けることが推奨されています。

https://docs.rs/anchor-lang/latest/anchor_lang/derive.Accounts.html

5 データ構成の確認

アカウントのデータ構成はこちらに記載されています。

「u8」型の「player_position」を持っています。

6 初期設定について

では、関数の中身を見てみましょう。

まずは、初期化時に、アカウントの「player_position」を「0」に設定しています。

7 move_left関数について

次に、「move_left」関数も見てみましょう。

まずは、「&mut」を用いて、「game_data_account」というアカウントに対して、可変参照を行っています。

その上で、「player_position」の値に応じて、if分岐を行っています。

ちなみに、中で使われている「print_player」関数は、下のように、「player_position」の値に応じて、if分岐を行っています。

3 コントラクト実行コードを見てみよう

では、次にスクリプトを見てみましょう。

1 PDA(プログラム派生アドレス)について

まずは「findProgramAddressSync」を用いて、PDAの取得しています。

シードの部分も見てみましょう。

「Buffer.from」の部分で、「level1」という文字列を「UTF-8」のバイト列に変換しています。

2 アカウントデータの取得について

次に、取得したPDAの公開鍵を元に、fetch関数を使ってアカウントのデータを取得しています。

3 インストラクションの実行

こちらの部分で、「initialize」関数を実行しています。

4 getLatestBlockhash関数について

ちなみに、この次に控えている、「logTransaction」関数を見てみましょう。

まずは、「getLatestBlockhash」関数で、ブロックハッシュ最新の有効なブロック高を取得しています。

5 confirmTransaction関数について

上で取得した2つと、トランザクションハッシュを使ってトランザクションの確認を行っています。

ただ、個人的には、これでは確認ができないのではと思ったので、下のように、返り値を取得して、表示させるのが良いのではと思いました。

こちらでは、アカウント内のデータを取得して、現在の位置を表示しています。

こちらでは、switch文を使って分岐しています。

今回は以上です。

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