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

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

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

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

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

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

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

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

## プログラム開発の流れ

### 1. 開発環境準備

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

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

### 2. 開発手法を選ぶ

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

1. **Anchor フレームワーク**：

   ```
   めっちゃ便利！初心者はこっちがオススメやで！
   ボイラープレートコード（毎回書くめんどくさいコード）を減らせるねん。
   ```

2. **ネイティブ Rust**：
   ```
   生のRustでゴリゴリ書く方法。
   めっちゃ柔軟やけど、難しいわ。上級者向けやな。
   ```

## Anchor でプログラム開発するで！

Anchor は超べんりやから、これで始めよか！

```bash
# Anchorのインストール
npm install -g @coral-xyz/anchor-cli
# またはcargoでインストール
cargo install --git https://github.com/coral-xyz/anchor anchor-cli
```

### プロジェクト作成

```bash
# 新しいプロジェクト作成
anchor init めっちゃすごいプロジェクト
cd めっちゃすごいプロジェクト
```

### プログラム書き方の基本

Anchor のプログラムは、こんな感じで書くねん：

```rust
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とシード（種）から決定的に導き出せるアドレスや！
秘密鍵がないから、プログラムしか署名できへんねん。
データを簡単に見つけるのにめっちゃ便利！
```

例えばユーザーごとのデータを保存したいとき：

```rust
// ユーザーのpubkeyをシードにしてPDAを生成
let (pda, bump) = Pubkey::find_program_address(
    &[user.key().as_ref()],
    program_id
);
```

## CPI ってなんやねん？

CPI（Cross-Program Invocation）は、あるプログラムから別のプログラムを呼び出す仕組みやねん！

```
プログラムAがプログラムBの命令を呼び出すことができるねん。
署名権限も引き継がれるから超便利！
```

例えば、SystemProgram を呼び出してアカウント作成する例：

```rust
// 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）を使って自分のトークンを作れるで！

```
ミントアカウント：トークンのタイプを表す
トークンアカウント：誰がどれだけトークン持ってるかを表す
関連トークンアカウント：特定のウォレットと特定のトークンの組み合わせでデフォルトで使うアカウント
```

トークン作成の流れ：

```bash
# トークン（ミントアカウント）作成
spl-token create-token

# トークンアカウント作成
spl-token create-account <トークンアドレス>

# トークンのミント（新規発行）
spl-token mint <トークンアドレス> <数量>

# トークン転送
spl-token transfer <トークンアドレス> <数量> <送り先アドレス>
```

## テストとデプロイ

開発したら、テストしてデプロイせなあかんで：

```bash
# ローカルでテスト
anchor test

# devnetにデプロイ
solana config set --url https://api.devnet.solana.com
anchor deploy
```

デプロイしたらこんな感じで使うねん：

```javascript
// フロントエンドからプログラムを呼び出す例
const tx = await program.methods
  .initialize()
  .accounts({
    myAccount: myAccountPda,
    user: wallet.publicKey,
  })
  .rpc();
```

## Solana プログラム開発のポイント

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

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

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

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

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

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

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

- [Website](http://arm3rd.com/)
- [Founder Twitter](https://x.com/kyohei_nft/)
  :::