0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

関西弁で解説するSolana入門: スマートコントラクト開発

Posted at

Solana プログラム開発を関西弁で解説!

おう、Solana のプログラム開発ってなんやねんって思てる?めっちゃおもろいで!ちょっと独特やけど、ようわかったら最強やから一緒に見ていこか!

駆け出しエンジニアの頃、ゆめたろうさんの解説記事をよく参考にしていました。
本記事は Qiita の伝統にのっとり、Solana の基本概念について関西弁で解説するシリーズです。

まず Solana のプログラムって何やねん?

Solana では「スマートコントラクト」とか言うとると思うけど、ここでは「プログラム」言うねん。これはオンチェーンで動く実行可能なコードのことやねん。

プログラム = スマートコントラクト = オンチェーンで動くコード

ちなみに、プログラムは「ステートレス」いうんや。つまり、プログラム自体は「コードだけ」で、データは別のアカウントに保存するねん。これが他のブロックチェーンと全然違うとこやで!

プログラム開発の流れ

1. 開発環境準備

まず、開発するには「Rust」いうプログラミング言語を使うねん。Rust は安全で速いけど、ちょっとクセがあんねん。

# Rustのインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

2. 開発手法を選ぶ

開発手法は大きく分けて 2 つあんねん:

  1. Anchor フレームワーク

    めっちゃ便利!初心者はこっちがオススメやで!
    ボイラープレートコード(毎回書くめんどくさいコード)を減らせるねん。
    
  2. ネイティブ 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 プログラム開発のポイント

  1. アカウントモデルを理解せなあかん: データはすべてアカウントに保存されるねん。

  2. 所有権の概念が重要: アカウントを所有するプログラムだけがそのデータを変更できるねん。

  3. PDAs を活用せな: データのアドレスを予測可能にして、簡単に見つけられるようにするねん。

  4. 計算予算を気にせな: Solana は速いけど、各トランザクションには計算ユニットの制限があるから注意やで。

  5. デバッグはめっちゃ大事: エラーメッセージがわかりにくいから、じっくりデバッグせなあかん。

あかん!長くなってもうた。でも Solana のプログラム開発はほんまにおもろいから、ぜひ挑戦してみてな!わからんことあったらいつでも聞いてや!

【ARM3rd とは】
ARM3rd はグローバル L1/L2 の開発支援、App Chain 企画、キラーアプリケーション創出に特化した、Web3・AI のプロフェッショナルファームです。Arweave や Solana はじめグローバルの Tier 1 プロトコル、および日本のエンタープライズとの卓越した協業実績を有しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?