Solanaプログラムを作成しよう!
👶 基本的なプログラムを作成する
⚠️ 注意
Windows 環境の場合は以下の手順をすべて WSL 上で行うことになります。
WSL にインストールされたファイル等は、
windows キー + R
でRUN
ボックスを開き、\\wsl $ \ Ubuntu
を入力すると確認できます。
home
フォルダ下のusername
フォルダ内にmyepicproject
があるはずです。
VS Codeでmyepicproject
を開きましょう。
そして、programs/myepicproject/src/lib.rs
とtests/myepicproject.js
の中身を 削除 します。
実際にファイルを削除するのではなく、ファイルの中のコードだけを削除してください。
そして、以下のとおりlib.rs
ファイルの中身を追 加します。
use anchor_lang::prelude::*;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod myepicproject {
use super::*;
pub fn start_stuff_off(ctx: Context<StartStuffOff>) -> Result <()> {
Ok(())
}
}
#[derive(Accounts)]
pub struct StartStuffOff {}
Rustが分からなくても大丈夫です。
以下で簡単に説明していきます。
use anchor_lang::prelude::*;
use
宣言はSolidityのimport
文のようなものです。
Solanaプログラムを書きやすくするために、Anchorが提供してくれる優秀なツールをインポートしています。
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
これは、Anchorが自動生成した「プログラムID」と呼ばれるものです。
SolanaがWebアプリケーションを実行するため の情報を持っています。
あとで変更するので、詳細はその時に説明します。
#[program]
この記述により、フロントエンドからフェッチリクエストを経由してSolanaプログラムを実際に呼び出すことができるようになります。
これはマクロと呼ばれるもので、基本的にはモジュールにコードを追加するものです。
クラスを継承するイメージで使います。
pub mod myepicproject {
use super::*;
pub fn start_stuff_off(ctx: Context<StartStuffOff>) -> Result <()> {
Ok(())
}
}
pub mod
により、以下の記述がRustのmoduleであると宣言できます。
これは、関数や変数のコレクションを定義する最も簡単な方法です。
ちなみに、今回宣言したモジュールの名前はmyepicproject
と定義しています。
myepicproject
モジュールの中では、start_stuff_off
関数を定義し、Context
を受け取り、Result <()>
を出力しています。
Result
タイプについての詳細は、こちらで確認してみてください。
この関数はOk(())
を呼び出す以外は何もしていません。
つまり、start_stuff_off
関数は、他の誰かが呼び出すことができる関数なのです。
今は何もしませんが、後ほど変更を加えます。
#[derive(Accounts)]
pub struct StartStuffOff {}
これは別の「マクロ」で、アカウントの制約を指定できます。
実際にこれらを実行してみて、何が起こるか見てみましょう。
💎 スクリプトを記述してローカルで機能することを確認する
プログラムをどのように実行し、どの関数を呼び出したいかをAnchorに指示する必要があります。
そのために、tests/myepicproject.js
を以下のとおり変更します。
const anchor = require("@coral-xyz/anchor");
const main = async () => {
console.log("🚀 Starting test...");
anchor.setProvider(anchor.AnchorProvider.env());
const program = anchor.workspace.Myepicproject;
const tx = await program.rpc.startStuffOff();
console.log("📝 Your transaction signature", tx);
};
const runMain = async () => {
try {
await main();
process.exit(0);
} catch (error) {
console.error(error);
process.exit(1);
}
};
runMain();
以下でコードの中身を説明していきます。
anchor.setProvider(anchor.AnchorProvider.env());
const program = anchor.workspace.Myepicproject;
const tx = await program.rpc.startStuffOff();
まず、anchor.setProvider
でsolana config get
からAnchorにプロバイダーを設定するように指示します。
このように記述することで、Anchorはプログラムをローカル上で実行することができるようになります(devnetでコードをテストできるようになります)。
次に、anchor.workspace.Myepicproject
を取得します。
これは、Anchorが提供している非常に優れた機能で、lib.rs
でコードを自動的にコンパイルし、ローカル上のバリデータがデプロイしてくれるというものです。
最後に、program.rpc.startStuffOff()
関数を呼び出し、ローカル上のバリデータが命令を「マイニング」するのを待ちます。