重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
light-protocol by sendaifun/skills
npx skills add https://github.com/sendaifun/skills --skill light-protocol使用 Light Protocol 在 Solana 上构建可扩展、高性价比的应用程序——这是一个基础设施平台,能够实现免租金的代币和账户,同时具备 L1 性能和安全性。
Light Protocol 提供两项互补的技术:
| 优势 | 描述 |
|---|---|
| 成本降低 200 倍 | 压缩代币账户成本约 5,000 lamports,而 SPL 账户约 2,000,000 |
| 免租金账户 | 代币或 PDA 无需预先支付租金豁免 |
| L1 安全性 | 所有执行和状态都保留在 Solana 主网上 |
| 完全可组合性 | 与现有的 Solana 程序和钱包(Phantom, Backpack)兼容 |
| 程序 | 地址 | 描述 |
|---|
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| Light System Program | SySTEM1eSU2p4BGQfQpimFEWWSC1XDFeun3Nqzz3rT7 | 核心系统程序 |
| Light Token Program | cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m | 压缩代币操作 |
| Account Compression | compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq | 账户压缩程序 |
# 安装 TypeScript SDK
npm install @lightprotocol/stateless.js @lightprotocol/compressed-token
# 为本地开发安装 CLI
npm install -g @lightprotocol/zk-compression-cli
Light Protocol 需要支持 ZK 压缩的 RPC。使用 Helius:
import { Rpc, createRpc } from "@lightprotocol/stateless.js";
// 主网
const rpc = createRpc(
"https://mainnet.helius-rpc.com?api-key=<YOUR_API_KEY>",
"https://mainnet.helius-rpc.com?api-key=<YOUR_API_KEY>"
);
// 开发网
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";
// 初始化 RPC 连接
const rpc = createRpc(process.env.RPC_ENDPOINT!, process.env.RPC_ENDPOINT!);
// 加载钱包
const payer = Keypair.fromSecretKey(
Uint8Array.from(JSON.parse(process.env.PRIVATE_KEY!))
);
console.log("已连接到 Light Protocol");
console.log("钱包地址:", payer.publicKey.toBase58());
ZK 压缩利用零知识证明实现免租金的压缩代币。压缩账户存储在默克尔树中,并使用有效性证明进行验证。
import { createMint } from "@lightprotocol/compressed-token";
import { Keypair } from "@solana/web3.js";
const payer = Keypair.generate();
const mintAuthority = payer;
// 创建带有代币池的铸造账户以支持压缩
const { mint, transactionSignature } = await createMint(
rpc,
payer, // 费用支付者
mintAuthority.publicKey, // 铸造权限
9, // 小数位数
);
console.log("铸造账户已创建:", mint.toBase58());
console.log("交易签名:", transactionSignature);
import { mintTo } from "@lightprotocol/compressed-token";
const recipient = new PublicKey("...");
const amount = 1_000_000_000; // 1 个代币(9 位小数)
const transactionSignature = await mintTo(
rpc,
payer, // 费用支付者
mint, // 带有代币池的铸造账户
recipient, // 接收者地址
mintAuthority, // 铸造权限(签名者)
amount, // 铸造数量
);
console.log("已铸造:", 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, // 接收者数组
mintAuthority,
amounts, // 数量数组(必须与接收者数量匹配)
);
import { transfer } from "@lightprotocol/compressed-token";
const recipient = new PublicKey("...");
const amount = 500_000_000; // 0.5 个代币
const transactionSignature = await transfer(
rpc,
payer, // 费用支付者
mint, // 带有代币池的铸造账户
amount, // 转移数量
sender, // 代币所有者(签名者)
recipient, // 目标地址
);
console.log("已转移:", transactionSignature);
注意 :压缩代币转移采用消费-创建模型。输入账户被消费,新的输出账户以更新后的余额被创建。
将现有的 SPL 代币转换为压缩格式:
import { compress, compressSplTokenAccount } from "@lightprotocol/compressed-token";
// 将特定数量压缩给接收者
const transactionSignature = await compress(
rpc,
payer,
mint,
amount,
owner, // SPL 代币所有者
recipient, // 压缩代币接收者
tokenAccount, // 源 SPL 代币账户
);
// 压缩整个 SPL 代币账户(回收租金)
const tx = await compressSplTokenAccount(
rpc,
payer,
mint,
owner,
tokenAccount,
// 可选:保留在 SPL 格式中的数量
);
将压缩代币转换回 SPL 格式:
import { decompress } from "@lightprotocol/compressed-token";
const transactionSignature = await decompress(
rpc,
payer,
mint,
amount,
owner, // 压缩代币所有者(签名者)
recipient, // SPL 代币接收者
);
// 获取所有者所有的压缩代币账户
const tokenAccounts = await rpc.getCompressedTokenAccountsByOwner(
owner.publicKey,
{ mint }
);
console.log("代币账户数量:", tokenAccounts.items.length);
// 计算总余额
const totalBalance = tokenAccounts.items.reduce(
(sum, account) => sum + BigInt(account.parsed.amount),
BigInt(0)
);
console.log("总余额:", totalBalance.toString());
// 获取压缩账户余额
const balance = await rpc.getCompressedTokenAccountBalance(accountHash);
// 获取交易的有效性证明
const proof = await rpc.getValidityProof(compressedAccountHashes);
为现有的 SPL 铸造账户添加压缩支持:
import { createTokenPool } from "@lightprotocol/compressed-token";
// 向现有 SPL 铸造账户添加代币池
// 注意:不需要铸造权限
const transactionSignature = await createTokenPool(
rpc,
payer, // 费用支付者
existingMint, // 现有的 SPL 铸造账户
);
Light Token 程序是一个独立的高性能代币标准,无需 ZK 证明即可降低成本。它针对热路径进行了优化,并提供与 SPL 代币的封装/解封装互操作性。
| 特性 | ZK 压缩 | Light Token 程序 |
|---|---|---|
| 技术 | 零知识证明 | 优化的代币标准 |
| 用例 | 压缩代币/PDA | 高性能代币 |
| 计算单元 | 较高(证明验证) | 较低(优化的热路径) |
| 互操作性 | 压缩/解压 SPL | 封装/解封装 SPL 和 Token-2022 |
import { createLightMint } from "@lightprotocol/light-token";
const { mint, transactionSignature } = await createLightMint(
rpc,
payer,
mintAuthority.publicKey,
9, // 小数位数
);
console.log("Light 铸造账户已创建:", mint.toBase58());
import { mintToLightAta } from "@lightprotocol/light-token";
const transactionSignature = await mintToLightAta(
rpc,
payer,
mint,
recipient,
mintAuthority,
amount,
);
import { wrapSpl } from "@lightprotocol/light-token";
// 将 SPL 代币封装为 Light 代币
const transactionSignature = await wrapSpl(
rpc,
payer,
mint,
amount,
owner,
splTokenAccount,
);
import { unwrapToSpl } from "@lightprotocol/light-token";
// 将 Light 代币解封装回 SPL
const transactionSignature = await unwrapToSpl(
rpc,
payer,
mint,
amount,
owner,
recipient, // SPL 代币账户
);
Light Protocol 为压缩账户提供了 21 种专门的 RPC 方法。关键方法:
| 方法 | 描述 |
|---|---|
getCompressedAccount | 通过地址或哈希获取压缩账户 |
getCompressedAccountsByOwner | 获取所有者所有的压缩账户 |
getCompressedTokenAccountsByOwner | 获取所有者的压缩代币账户 |
getCompressedTokenAccountBalance | 获取代币账户余额 |
getCompressedTokenBalancesByOwner | 获取所有者所有的代币余额 |
getCompressedMintTokenHolders | 获取压缩铸造账户的所有持有者 |
getValidityProof | 获取压缩账户的 ZK 证明 |
getMultipleCompressedAccounts | 批量获取压缩账户 |
getTransactionWithCompressionInfo | 获取包含已解析压缩数据的交易 |
getIndexerHealth | 检查索引器状态 |
完整文档请参阅 resources/json-rpc-methods.md。
每笔交易 4 个压缩账户 :将大型操作拆分为多笔交易
计算单元预算 :为证明验证添加额外的计算单元
import { ComputeBudgetProgram } from "@solana/web3.js";
// 为复杂交易添加计算预算 const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({ units: 300_000, });
// 分批处理多个接收者
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("成功:", signature);
} catch (error) {
if (error.message.includes("TokenPool not found")) {
// 首先创建代币池
await createTokenPool(rpc, payer, mint);
} else if (error.message.includes("Insufficient balance")) {
// 转移前检查余额
const accounts = await rpc.getCompressedTokenAccountsByOwner(sender.publicKey, { mint });
console.log("可用余额:", accounts.items);
} else {
throw error;
}
}
import { approve, transferDelegated } from "@lightprotocol/compressed-token";
// 批准委托
const approveSig = await approve(
rpc,
payer,
mint,
amount,
owner, // 代币所有者
delegate, // 委托公钥
);
// 作为委托者进行转移
const transferSig = await transferDelegated(
rpc,
payer,
mint,
amount,
delegate, // 委托者(签名者)
recipient,
);
light-protocol/
├── SKILL.md # 此文件
├── resources/
│ ├── program-addresses.md # 程序 ID、状态树、RPC 端点
│ ├── json-rpc-methods.md # 所有 21 个 RPC 方法文档
│ ├── sdk-reference.md # TypeScript SDK 参考
│ └── github-repos.md # 官方仓库
├── examples/
│ ├── setup/
│ │ └── example.ts # 基本设置
│ ├── zk-compression/
│ │ ├── create-mint.ts # 创建压缩铸造账户
│ │ ├── mint-tokens.ts # 铸造压缩代币
│ │ ├── transfer-tokens.ts # 转移压缩代币
│ │ ├── compress-spl.ts # 压缩 SPL 代币
│ │ └── decompress.ts # 解压为 SPL
│ ├── light-token-program/
│ │ ├── create-light-mint.ts
│ │ ├── mint-light-tokens.ts
│ │ └── wrap-unwrap.ts
│ ├── querying/
│ │ └── fetch-accounts.ts # 查询压缩账户
│ └── advanced/
│ ├── batch-operations.ts # 多接收者操作
│ └── delegation.ts # 批准和委托转移
├── templates/
│ └── setup.ts # 完整的入门模板
└── docs/
└── troubleshooting.md # 常见问题及解决方案
每周安装量
56
仓库
GitHub Stars
70
首次出现
Jan 24, 2026
安全审计
安装于
gemini-cli52
opencode51
codex50
github-copilot48
cursor47
amp46
Build scalable, cost-efficient applications on Solana with Light Protocol - the infrastructure platform enabling rent-free tokens and accounts with L1 performance and security.
Light Protocol provides two complementary technologies:
| Benefit | Description |
|---|---|
| 200x Cost Reduction | Compressed token accounts cost ~5,000 lamports vs ~2,000,000 for SPL |
| Rent-Free Accounts | No upfront rent-exemption required for tokens or PDAs |
| L1 Security | All execution and state remains on Solana mainnet |
| Full Composability | Works with existing Solana programs and wallets (Phantom, Backpack) |
| Program | Address | Description |
|---|---|---|
| Light System Program | SySTEM1eSU2p4BGQfQpimFEWWSC1XDFeun3Nqzz3rT7 | Core system program |
| Light Token Program | cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m | Compressed token operations |
| Account Compression | compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq | Account compression program |
# Install TypeScript SDKs
npm install @lightprotocol/stateless.js @lightprotocol/compressed-token
# Install CLI for local development
npm install -g @lightprotocol/zk-compression-cli
Light Protocol requires a ZK Compression-enabled RPC. Use 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 Compression enables rent-free compressed tokens using zero-knowledge proofs. Compressed accounts are stored in Merkle trees and verified using validity proofs.
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 : Compressed token transfers use a consume-and-create model. Input accounts are consumed and new output accounts are created with updated balances.
Convert existing SPL tokens to compressed format:
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
);
Convert compressed tokens back to SPL format:
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);
Add compression support to an existing SPL mint:
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
);
The Light Token Program is a separate high-performance token standard that reduces costs without ZK proofs. It's optimized for hot paths and provides wrap/unwrap interoperability with SPL tokens.
| Feature | ZK Compression | Light Token Program |
|---|---|---|
| Technology | Zero-knowledge proofs | Optimized token standard |
| Use Case | Compressed tokens/PDAs | High-performance tokens |
| Compute Units | Higher (proof verification) | Lower (optimized hot paths) |
| Interop | Compress/decompress SPL | Wrap/unwrap SPL & Token-2022 |
import { createLightMint } from "@lightprotocol/light-token";
const { mint, transactionSignature } = await createLightMint(
rpc,
payer,
mintAuthority.publicKey,
9, // decimals
);
console.log("Light mint created:", mint.toBase58());
import { mintToLightAta } from "@lightprotocol/light-token";
const transactionSignature = await mintToLightAta(
rpc,
payer,
mint,
recipient,
mintAuthority,
amount,
);
import { wrapSpl } from "@lightprotocol/light-token";
// Wrap SPL tokens to Light tokens
const transactionSignature = await wrapSpl(
rpc,
payer,
mint,
amount,
owner,
splTokenAccount,
);
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
);
Light Protocol provides 21 specialized RPC methods for compressed accounts. Key methods:
| Method | Description |
|---|---|
getCompressedAccount | Get compressed account by address or hash |
getCompressedAccountsByOwner | Get all compressed accounts for an owner |
getCompressedTokenAccountsByOwner | Get compressed token accounts for an owner |
getCompressedTokenAccountBalance | Get balance for a token account |
getCompressedTokenBalancesByOwner | Get all token balances for an owner |
getCompressedMintTokenHolders |
See resources/json-rpc-methods.md for complete documentation.
4 compressed accounts per transaction : Split large operations into multiple transactions
Compute unit budget : Add extra compute units for proof verification
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,
);
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
Weekly Installs
56
Repository
GitHub Stars
70
First Seen
Jan 24, 2026
Security Audits
Gen Agent Trust HubWarnSocketPassSnykWarn
Installed on
gemini-cli52
opencode51
codex50
github-copilot48
cursor47
amp46
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
125,600 周安装
自动解决PR机器人审查:AI辅助修复Copilot、Cursor Bugbot、CodeRabbit等发现的问题
107 周安装
Databricks Python SDK 开发指南:SDK、Connect、CLI 与 REST API 完整教程
104 周安装
英文转中文翻译器:保留句子结构的AI翻译工具,支持.txt/.md文件翻译
107 周安装
review-pr 代码审查技能:AI 辅助本地代码审查与 PR 移交指南
108 周安装
Apple HIG技术指南:Siri、支付、健康、AR、AI等13项核心技术开发原则
107 周安装
Solana Agent Kit:构建自主执行60多种区块链操作的AI智能体开发工具包
107 周安装
| Get all holders of a compressed mint |
getValidityProof | Get ZK proof for compressed accounts |
getMultipleCompressedAccounts | Batch fetch compressed accounts |
getTransactionWithCompressionInfo | Get transaction with parsed compression data |
getIndexerHealth | Check indexer status |