light-protocol について
Light Protocol を使った Solana アプリ開発のスキル兼ガイドです。ZK 圧縮アカウントとトークン、Light Token Program、SDK の設定、RPC 操作を扱います。
主な機能
- 01圧縮トークンの作成と送金
- 02SPL トークンの圧縮と展開
- 03Light Token Program の利用
- 04RPC による圧縮アカウントの照会
- 05TypeScript SDK の統合
活用シーン
- 01レンタント不要の圧縮アカウントを使う Solana アプリの構築
- 02アプリへの圧縮トークン操作の追加
- 03圧縮アカウントとトークンデータの照会
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sendaifun/ skills --skill light-protocolインストール後、Claude Code で/light-protocolを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
docs/troubleshooting.mdexamples/advanced/batch-operations.tsdelegation.tsexamples/light-token-program/create-light-mint.tsmint-light-tokens.tswrap-unwrap.tsexamples/querying/fetch-accounts.tsexamples/setup/example.tsexamples/zk-compression/compress-spl.tscreate-mint.tsdecompress.tsmint-tokens.tstransfer-tokens.tsresources/github-repos.mdjson-rpc-methods.mdprogram-addresses.mdsdk-reference.mdtemplates/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 Program | SySTEM1eSU2p4BGQfQpimFEWWSC1XDFeun3Nqzz3rT7 | コアシステムプログラム |
| Light Token Program | cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m | 圧縮トークン操作 |
| Account Compression | compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq | アカウント圧縮プログラム |
クイックスタート
インストール
# 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 リポジトリ
- Light Protocol - メインリポジトリ
- Node.js クライアントの例
- Web クライアントの例
コミュニティ
- Discord - Light Protocol の Discord
- Helius Discord - RPC プロバイダーのサポート
ウォレットのサポート
- 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