Solana プログラム開発を関西弁で解説!
おう、Solana のプログラム開発ってなんやねんって思てる?めっちゃおもろいで!ちょっと独特やけど、ようわかったら最強やから一緒に見ていこか!
駆け出しエンジニアの頃、ゆめたろうさんの解説記事をよく参考にしていました。
本記事は Qiita の伝統にのっとり、Solana の基本概念について関西弁で解説するシリーズです。
まず Solana のプログラムって何やねん?
Solana では「スマートコントラクト」とか言うとると思うけど、ここでは「プログラム」言うねん。これはオンチェーンで動く実行可能なコードのことやねん。
プログラム = スマートコントラクト = オンチェーンで動くコード
ちなみに、プログラムは「ステートレス」いうんや。つまり、プログラム自体は「コードだけ」で、データは別のアカウントに保存するねん。これが他のブロックチェーンと全然違うとこやで!
プログラム開発の流れ
1. 開発環境準備
まず、開発するには「Rust」いうプログラミング言語を使うねん。Rust は安全で速いけど、ちょっとクセがあんねん。
# Rustのインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
2. 開発手法を選ぶ
開発手法は大きく分けて 2 つあんねん:
-
Anchor フレームワーク:
めっちゃ便利!初心者はこっちがオススメやで! ボイラープレートコード(毎回書くめんどくさいコード)を減らせるねん。
-
ネイティブ Rust:
生のRustでゴリゴリ書く方法。 めっちゃ柔軟やけど、難しいわ。上級者向けやな。
Anchor でプログラム開発するで!
Anchor は超べんりやから、これで始めよか!
# Anchorのインストール
npm install -g @coral-xyz/anchor-cli
# またはcargoでインストール
cargo install --git https://github.com/coral-xyz/anchor anchor-cli
プロジェクト作成
# 新しいプロジェクト作成
anchor init めっちゃすごいプロジェクト
cd めっちゃすごいプロジェクト
プログラム書き方の基本
Anchor のプログラムは、こんな感じで書くねん:
use anchor_lang::prelude::*;
declare_id!("あなたのプログラムID");
#[program]
pub mod めっちゃすごいプログラム {
use super::*;
// これが命令(インストラクション)やで!
pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
// ここに処理を書くねん
Ok(())
}
}
// これがアカウントの定義やで
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(init, payer = user, space = 8 + 8)]
pub my_account: Account<'info, MyAccount>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
// アカウントに保存するデータの定義
#[account]
pub struct MyAccount {
pub data: u64,
}
PDAs ってなんやねん?
PDA(Program Derived Address)は、Solana の超重要な概念やねん!簡単に言うと:
PDAは、プログラムIDとシード(種)から決定的に導き出せるアドレスや!
秘密鍵がないから、プログラムしか署名できへんねん。
データを簡単に見つけるのにめっちゃ便利!
例えばユーザーごとのデータを保存したいとき:
// ユーザーのpubkeyをシードにしてPDAを生成
let (pda, bump) = Pubkey::find_program_address(
&[user.key().as_ref()],
program_id
);
CPI ってなんやねん?
CPI(Cross-Program Invocation)は、あるプログラムから別のプログラムを呼び出す仕組みやねん!
プログラムAがプログラムBの命令を呼び出すことができるねん。
署名権限も引き継がれるから超便利!
例えば、SystemProgram を呼び出してアカウント作成する例:
// SystemProgramを呼び出して新しいアカウントを作る
let cpi_context = CpiContext::new(
ctx.accounts.system_program.to_account_info(),
system_program::CreateAccount {
from: ctx.accounts.user.to_account_info(),
to: ctx.accounts.new_account.to_account_info(),
},
);
system_program::create_account(
cpi_context,
rent_lamports,
space as u64,
ctx.program_id,
)?;
トークンを作るには?
SPL トークン(Solana Program Library Token)を使って自分のトークンを作れるで!
ミントアカウント:トークンのタイプを表す
トークンアカウント:誰がどれだけトークン持ってるかを表す
関連トークンアカウント:特定のウォレットと特定のトークンの組み合わせでデフォルトで使うアカウント
トークン作成の流れ:
# トークン(ミントアカウント)作成
spl-token create-token
# トークンアカウント作成
spl-token create-account <トークンアドレス>
# トークンのミント(新規発行)
spl-token mint <トークンアドレス> <数量>
# トークン転送
spl-token transfer <トークンアドレス> <数量> <送り先アドレス>
テストとデプロイ
開発したら、テストしてデプロイせなあかんで:
# ローカルでテスト
anchor test
# devnetにデプロイ
solana config set --url https://api.devnet.solana.com
anchor deploy
デプロイしたらこんな感じで使うねん:
// フロントエンドからプログラムを呼び出す例
const tx = await program.methods
.initialize()
.accounts({
myAccount: myAccountPda,
user: wallet.publicKey,
})
.rpc();
Solana プログラム開発のポイント
-
アカウントモデルを理解せなあかん: データはすべてアカウントに保存されるねん。
-
所有権の概念が重要: アカウントを所有するプログラムだけがそのデータを変更できるねん。
-
PDAs を活用せな: データのアドレスを予測可能にして、簡単に見つけられるようにするねん。
-
計算予算を気にせな: Solana は速いけど、各トランザクションには計算ユニットの制限があるから注意やで。
-
デバッグはめっちゃ大事: エラーメッセージがわかりにくいから、じっくりデバッグせなあかん。
あかん!長くなってもうた。でも Solana のプログラム開発はほんまにおもろいから、ぜひ挑戦してみてな!わからんことあったらいつでも聞いてや!
【ARM3rd とは】
ARM3rd はグローバル L1/L2 の開発支援、App Chain 企画、キラーアプリケーション創出に特化した、Web3・AI のプロフェッショナルファームです。Arweave や Solana はじめグローバルの Tier 1 プロトコル、および日本のエンタープライズとの卓越した協業実績を有しています。