mcpField
L
light-protocol

light-protocol

github.com/sendaifun開発130171 回インストール13 週間前に更新
リポジトリ

light-protocol について

Light Protocol を使った Solana アプリ開発のスキル兼ガイドです。ZK 圧縮アカウントとトークン、Light Token Program、SDK の設定、RPC 操作を扱います。

主な機能

  1. 01圧縮トークンの作成と送金
  2. 02SPL トークンの圧縮と展開
  3. 03Light Token Program の利用
  4. 04RPC による圧縮アカウントの照会
  5. 05TypeScript SDK の統合

活用シーン

  1. 01レンタント不要の圧縮アカウントを使う Solana アプリの構築
  2. 02アプリへの圧縮トークン操作の追加
  3. 03圧縮アカウントとトークンデータの照会

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sendaifun/skills --skill light-protocol

インストール後、Claude Code で/light-protocolを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

docs/
troubleshooting.md
examples/advanced/
batch-operations.ts
delegation.ts
examples/light-token-program/
create-light-mint.ts
mint-light-tokens.ts
wrap-unwrap.ts
examples/querying/
fetch-accounts.ts
examples/setup/
example.ts
examples/zk-compression/
compress-spl.ts
create-mint.ts
decompress.ts
mint-tokens.ts
transfer-tokens.ts
resources/
github-repos.md
json-rpc-methods.md
program-addresses.md
sdk-reference.md
templates/
setup.ts

詳細

Light Protocol 開発ガイド

Light Protocol を使用して Solana 上にスケーラブルでコスト効率の高いアプリケーションを構築しましょう。Light Protocol は、L1 のパフォーマンスとセキュリティを備えた、手数料無料のトークンとアカウントを実現するインフラストラクチャプラットフォームです。

概要

Light Protocol は、相互に補完する次の 2 つの技術を提供します。

  • ZK 圧縮:ゼロ知識証明を使用して、手数料無料の圧縮トークンと PDA を作成します。Merkle ツリーと有効性証明を利用して、状態を効率的に保存します。
  • Light Token Program:SPL トークンと比較して、ミントとトークンアカウントのコストを 200 倍削減する、高性能なトークン規格です。
主なメリット
メリット説明
コストを 200 倍削減圧縮トークンアカウントのコストは約 5,000 lamports で、SPL の約 2,000,000 と比べて低くなります
手数料無料のアカウントトークンや PDA に事前のレンタル免除費用は不要です
L1 セキュリティすべての実行と状態は Solana メインネット上に保持されます
完全なコンポーザビリティ既存の Solana プログラムやウォレット(Phantom、Backpack)と連携します

プログラム ID

プログラムアドレス説明
Light System ProgramSySTEM1eSU2p4BGQfQpimFEWWSC1XDFeun3Nqzz3rT7コアシステムプログラム
Light Token ProgramcTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m圧縮トークン操作
Account Compressioncompr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVqアカウント圧縮プログラム

クイックスタート

インストール
# Install TypeScript SDKs
npm install @lightprotocol/stateless.js @lightprotocol/compressed-token

# Install CLI for local development
npm install -g @lightprotocol/zk-compression-cli
RPC の設定

Light Protocol には ZK 圧縮に対応した RPC が必要です。Helius を使用します。

import { Rpc, createRpc } from "@lightprotocol/stateless.js";

// Mainnet
const rpc = createRpc(
  "https://mainnet.helius-rpc.com?api-key=<YOUR_API_KEY>",
  "https://mainnet.helius-rpc.com?api-key=<YOUR_API_KEY>"
);

// Devnet
const devnetRpc = createRpc(
  "https://devnet.helius-rpc.com?api-key=<YOUR_API_KEY>",
  "https://devnet.helius-rpc.com?api-key=<YOUR_API_KEY>"
);
基本設定
import { Rpc, createRpc } from "@lightprotocol/stateless.js";
import {
  createMint,
  mintTo,
  transfer,
} from "@lightprotocol/compressed-token";
import { Keypair, PublicKey } from "@solana/web3.js";

// Initialize RPC connection
const rpc = createRpc(process.env.RPC_ENDPOINT!, process.env.RPC_ENDPOINT!);

// Load wallet
const payer = Keypair.fromSecretKey(
  Uint8Array.from(JSON.parse(process.env.PRIVATE_KEY!))
);

console.log("Connected to Light Protocol");
console.log("Wallet:", payer.publicKey.toBase58());

ZK 圧縮

ZK 圧縮では、ゼロ知識証明を使用して手数料無料の圧縮トークンを実現します。圧縮アカウントは Merkle ツリーに保存され、有効性証明を使用して検証されます。

圧縮トークンミントを作成する
import { createMint } from "@lightprotocol/compressed-token";
import { Keypair } from "@solana/web3.js";

const payer = Keypair.generate();
const mintAuthority = payer;

// Create mint with token pool for compression
const { mint, transactionSignature } = await createMint(
  rpc,
  payer,           // Fee payer
  mintAuthority.publicKey,  // Mint authority
  9,               // Decimals
);

console.log("Mint created:", mint.toBase58());
console.log("Transaction:", transactionSignature);
圧縮トークンをミントする
import { mintTo } from "@lightprotocol/compressed-token";

const recipient = new PublicKey("...");
const amount = 1_000_000_000; // 1 token with 9 decimals

const transactionSignature = await mintTo(
  rpc,
  payer,           // Fee payer
  mint,            // Mint with token pool
  recipient,       // Recipient address
  mintAuthority,   // Mint authority (signer)
  amount,          // Amount to mint
);

console.log("Minted:", transactionSignature);
複数の受取人にミントする
const recipients = [
  new PublicKey("recipient1..."),
  new PublicKey("recipient2..."),
  new PublicKey("recipient3..."),
];

const amounts = [
  1_000_000_000,
  2_000_000_000,
  3_000_000_000,
];

const transactionSignature = await mintTo(
  rpc,
  payer,
  mint,
  recipients,      // Array of recipients
  mintAuthority,
  amounts,         // Array of amounts (must match recipients length)
);
圧縮トークンを転送する
import { transfer } from "@lightprotocol/compressed-token";

const recipient = new PublicKey("...");
const amount = 500_000_000; // 0.5 tokens

const transactionSignature = await transfer(
  rpc,
  payer,           // Fee payer
  mint,            // Mint with token pool
  amount,          // Amount to transfer
  sender,          // Token owner (signer)
  recipient,       // Destination address
);

console.log("Transferred:", transactionSignature);

Note:圧縮トークンの転送では、消費して作成するモデルを使用します。入力アカウントは消費され、残高を更新した新しい出力アカウントが作成されます。

SPL トークンを圧縮する

既存の SPL トークンを圧縮形式に変換します。

import { compress, compressSplTokenAccount } from "@lightprotocol/compressed-token";

// Compress specific amount to a recipient
const transactionSignature = await compress(
  rpc,
  payer,
  mint,
  amount,
  owner,           // SPL token owner
  recipient,       // Compressed token recipient
  tokenAccount,    // Source SPL token account
);

// Compress entire SPL token account (reclaim rent)
const tx = await compressSplTokenAccount(
  rpc,
  payer,
  mint,
  owner,
  tokenAccount,
  // Optional: amount to keep in SPL format
);
SPL トークンに伸長する

圧縮トークンを SPL 形式に戻します。

import { decompress } from "@lightprotocol/compressed-token";

const transactionSignature = await decompress(
  rpc,
  payer,
  mint,
  amount,
  owner,           // Compressed token owner (signer)
  recipient,       // SPL token recipient
);
圧縮アカウントを照会する
// Get all compressed token accounts for an owner
const tokenAccounts = await rpc.getCompressedTokenAccountsByOwner(
  owner.publicKey,
  { mint }
);

console.log("Token accounts:", tokenAccounts.items.length);

// Calculate total balance
const totalBalance = tokenAccounts.items.reduce(
  (sum, account) => sum + BigInt(account.parsed.amount),
  BigInt(0)
);
console.log("Total balance:", totalBalance.toString());

// Get compressed account balance
const balance = await rpc.getCompressedTokenAccountBalance(accountHash);

// Get validity proof for transaction
const proof = await rpc.getValidityProof(compressedAccountHashes);
既存のミント用にトークンプールを作成する

既存の SPL ミントに圧縮のサポートを追加します。

import { createTokenPool } from "@lightprotocol/compressed-token";

// Add token pool to existing SPL mint
// Note: Does NOT require mint authority
const transactionSignature = await createTokenPool(
  rpc,
  payer,           // Fee payer
  existingMint,    // Existing SPL mint
);

Light Token Program

Light Token Program は、ZK 証明を使用せずにコストを削減する、独立した高性能なトークン規格です。ホットパス向けに最適化されており、SPL トークンとのラップ/アンラップ相互運用性を提供します。

ZK 圧縮との主な違い
機能ZK 圧縮Light Token Program
技術ゼロ知識証明最適化されたトークン規格
ユースケース圧縮トークン/PDA高性能トークン
コンピュートユニット多い(証明の検証)少ない(ホットパスの最適化)
相互運用性SPL を圧縮/伸長SPL と Token-2022 をラップ/アンラップ
Light Token ミントを作成する
import { createLightMint } from "@lightprotocol/light-token";

const { mint, transactionSignature } = await createLightMint(
  rpc,
  payer,
  mintAuthority.publicKey,
  9,  // decimals
);

console.log("Light mint created:", mint.toBase58());
Light-ATA にミントする
import { mintToLightAta } from "@lightprotocol/light-token";

const transactionSignature = await mintToLightAta(
  rpc,
  payer,
  mint,
  recipient,
  mintAuthority,
  amount,
);
SPL を Light Token にラップする
import { wrapSpl } from "@lightprotocol/light-token";

// Wrap SPL tokens to Light tokens
const transactionSignature = await wrapSpl(
  rpc,
  payer,
  mint,
  amount,
  owner,
  splTokenAccount,
);
Light Token を SPL にアンラップする
import { unwrapToSpl } from "@lightprotocol/light-token";

// Unwrap Light tokens back to SPL
const transactionSignature = await unwrapToSpl(
  rpc,
  payer,
  mint,
  amount,
  owner,
  recipient,  // SPL token account
);

JSON RPC メソッド

Light Protocol は、圧縮アカウント向けに特化した RPC メソッドを 21 種類提供します。主なメソッドは次のとおりです。

メソッド説明
getCompressedAccountアドレスまたはハッシュで圧縮アカウントを取得します
getCompressedAccountsByOwner所有者のすべての圧縮アカウントを取得します
getCompressedTokenAccountsByOwner所有者のすべての圧縮トークンアカウントを取得します
getCompressedTokenAccountBalanceトークンアカウントの残高を取得します
getCompressedTokenBalancesByOwner所有者のすべてのトークン残高を取得します
getCompressedMintTokenHolders圧縮ミントのすべての保有者を取得します
getValidityProof圧縮アカウントの ZK 証明を取得します
getMultipleCompressedAccounts圧縮アカウントを一括取得します
getTransactionWithCompressionInfo解析済みの圧縮データとともにトランザクションを取得します
getIndexerHealthインデクサーの状態を確認します

詳細なドキュメントについては、resources/json-rpc-methods.md を参照してください。


ベストプラクティス

トランザクションの制限
  • トランザクションあたり 4 件の圧縮アカウント:大規模な操作は複数のトランザクションに分割してください
  • コンピュートユニットの予算:証明の検証に必要な追加のコンピュートユニットを確保してください
import { ComputeBudgetProgram } from "@solana/web3.js";

// Add compute budget for complex transactions
const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({
  units: 300_000,
});
バッチ操作
// Process multiple recipients in batches
async function batchMint(
  recipients: PublicKey[],
  amounts: number[],
  batchSize = 4
) {
  const results = [];

  for (let i = 0; i < recipients.length; i += batchSize) {
    const batchRecipients = recipients.slice(i, i + batchSize);
    const batchAmounts = amounts.slice(i, i + batchSize);

    const sig = await mintTo(
      rpc,
      payer,
      mint,
      batchRecipients,
      mintAuthority,
      batchAmounts,
    );

    results.push(sig);
  }

  return results;
}
エラー処理
try {
  const signature = await transfer(rpc, payer, mint, amount, sender, recipient);
  console.log("Success:", signature);
} catch (error) {
  if (error.message.includes("TokenPool not found")) {
    // Create token pool first
    await createTokenPool(rpc, payer, mint);
  } else if (error.message.includes("Insufficient balance")) {
    // Check balance before transfer
    const accounts = await rpc.getCompressedTokenAccountsByOwner(sender.publicKey, { mint });
    console.log("Available balance:", accounts.items);
  } else {
    throw error;
  }
}
委任
import { approve, transferDelegated } from "@lightprotocol/compressed-token";

// Approve delegate
const approveSig = await approve(
  rpc,
  payer,
  mint,
  amount,
  owner,           // Token owner
  delegate,        // Delegate public key
);

// Transfer as delegate
const transferSig = await transferDelegated(
  rpc,
  payer,
  mint,
  amount,
  delegate,        // Delegate (signer)
  recipient,
);

リソース

公式ドキュメント
GitHub リポジトリ
コミュニティ
ウォレットのサポート
  • Phantom - 圧縮トークンをネイティブサポート
  • Backpack - 圧縮トークンをネイティブサポート

スキルの構成

light-protocol/
├── SKILL.md                    # This file
├── resources/
│   ├── program-addresses.md    # Program IDs, state trees, RPC endpoints
│   ├── json-rpc-methods.md     # All 21 RPC methods documented
│   ├── sdk-reference.md        # TypeScript SDK reference
│   └── github-repos.md         # Official repositories
├── examples/
│   ├── setup/
│   │   └── example.ts          # Basic setup
│   ├── zk-compression/
│   │   ├── create-mint.ts      # Create compressed mint
│   │   ├── mint-tokens.ts      # Mint compressed tokens
│   │   ├── transfer-tokens.ts  # Transfer compressed tokens
│   │   ├── compress-spl.ts     # Compress SPL tokens
│   │   └── decompress.ts       # Decompress to SPL
│   ├── light-token-program/
│   │   ├── create-light-mint.ts
│   │   ├── mint-light-tokens.ts
│   │   └── wrap-unwrap.ts
│   ├── querying/
│   │   └── fetch-accounts.ts   # Query compressed accounts
│   └── advanced/
│       ├── batch-operations.ts # Multi-recipient operations
│       └── delegation.ts       # Approve and delegate transfers
├── templates/
│   └── setup.ts                # Complete starter template
└── docs/
    └── troubleshooting.md      # Common issues and solutions

コメント