light-protocol
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseLight Protocol Development Guide
Light Protocol 开发指南
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在Solana上构建可扩展、高成本效益的应用程序——这是一个支持免租金代币和账户的基础设施平台,兼具L1的性能与安全性。
Overview
概述
Light Protocol provides two complementary technologies:
- ZK Compression: Create rent-free compressed tokens and PDAs using zero-knowledge proofs. Uses Merkle trees and validity proofs to store state efficiently.
- Light Token Program: A high-performance token standard that reduces mint and token account costs by 200x compared to SPL tokens.
Light Protocol提供两种互补技术:
- ZK Compression:使用零知识证明创建免租金的压缩代币和PDA。利用默克尔树和有效性证明高效存储状态。
- Light Token Program:一种高性能代币标准,与SPL代币相比,可将铸造和代币账户成本降低200倍。
Key Benefits
核心优势
| 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) |
| 优势 | 描述 |
|---|---|
| 成本降低200倍 | 压缩代币账户成本约为5000 lamports,而SPL账户约为2,000,000 lamports |
| 免租金账户 | 代币或PDA无需预先支付租金豁免费用 |
| L1级安全性 | 所有执行和状态均保留在Solana主网 |
| 完全可组合性 | 可与现有Solana程序和钱包(Phantom、Backpack)兼容 |
Program IDs
程序ID
| Program | Address | Description |
|---|---|---|
| Light System Program | | Core system program |
| Light Token Program | | Compressed token operations |
| Account Compression | | Account compression program |
| 程序 | 地址 | 描述 |
|---|---|---|
| Light System Program | | 核心系统程序 |
| Light Token Program | | 压缩代币操作程序 |
| Account Compression | | 账户压缩程序 |
Quick Start
快速开始
Installation
安装
bash
undefinedbash
undefinedInstall TypeScript SDKs
安装TypeScript SDK
npm install @lightprotocol/stateless.js @lightprotocol/compressed-token
npm install @lightprotocol/stateless.js @lightprotocol/compressed-token
Install CLI for local development
安装用于本地开发的CLI
npm install -g @lightprotocol/zk-compression-cli
undefinednpm install -g @lightprotocol/zk-compression-cli
undefinedRPC Setup
RPC设置
Light Protocol requires a ZK Compression-enabled RPC. Use Helius:
typescript
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>"
);Light Protocol需要支持ZK Compression的RPC,可使用Helius:
typescript
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>"
);Basic Setup
基础设置
typescript
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());typescript
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 Compression
ZK Compression
ZK Compression enables rent-free compressed tokens using zero-knowledge proofs. Compressed accounts are stored in Merkle trees and verified using validity proofs.
ZK Compression借助零知识证明实现免租金的压缩代币。压缩账户存储在默克尔树中,并通过有效性证明进行验证。
Create Compressed Token Mint
创建压缩代币铸造账户
typescript
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);typescript
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);Mint Compressed Tokens
铸造压缩代币
typescript
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);typescript
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);Mint to Multiple Recipients
批量铸造给多个接收方
typescript
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)
);typescript
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, // 数量数组(长度必须与接收方数组一致)
);Transfer Compressed Tokens
转账压缩代币
typescript
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.
typescript
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);注意:压缩代币转账采用“消耗-创建”模式。输入账户会被消耗,同时创建更新余额后的新输出账户。
Compress SPL Tokens
压缩SPL代币
Convert existing SPL tokens to compressed format:
typescript
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代币转换为压缩格式:
typescript
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格式的数量
);Decompress to SPL Tokens
解压缩为SPL代币
Convert compressed tokens back to SPL format:
typescript
import { decompress } from "@lightprotocol/compressed-token";
const transactionSignature = await decompress(
rpc,
payer,
mint,
amount,
owner, // Compressed token owner (signer)
recipient, // SPL token recipient
);将压缩代币转换回SPL格式:
typescript
import { decompress } from "@lightprotocol/compressed-token";
const transactionSignature = await decompress(
rpc,
payer,
mint,
amount,
owner, // 压缩代币所有者(签名方)
recipient, // SPL代币接收方
);Query Compressed Accounts
查询压缩账户
typescript
// 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);typescript
// 获取所有者的所有压缩代币账户
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);Create Token Pool for Existing Mint
为现有铸造账户添加代币池
Add compression support to an existing SPL mint:
typescript
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
);为现有SPL铸造账户添加压缩支持:
typescript
import { createTokenPool } from "@lightprotocol/compressed-token";
// 为现有SPL铸造账户添加代币池
// 注意:不需要铸造权限
const transactionSignature = await createTokenPool(
rpc,
payer, // 费用支付方
existingMint, // 现有SPL铸造账户
);Light Token Program
Light Token Program
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.
Light Token Program是一个独立的高性能代币标准,无需ZK证明即可降低成本。它针对高频路径进行了优化,并提供与SPL代币的包装/解包装互操作性。
Key Differences from ZK Compression
与ZK Compression的核心差异
| 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 |
| 特性 | ZK Compression | Light Token Program |
|---|---|---|
| 技术 | 零知识证明 | 优化的代币标准 |
| 使用场景 | 压缩代币/PDA | 高性能代币 |
| 计算单元 | 较高(证明验证) | 较低(优化高频路径) |
| 互操作性 | 压缩/解压缩SPL | 包装/解包装SPL和Token-2022 |
Create Light Token Mint
创建Light Token铸造账户
typescript
import { createLightMint } from "@lightprotocol/light-token";
const { mint, transactionSignature } = await createLightMint(
rpc,
payer,
mintAuthority.publicKey,
9, // decimals
);
console.log("Light mint created:", mint.toBase58());typescript
import { createLightMint } from "@lightprotocol/light-token";
const { mint, transactionSignature } = await createLightMint(
rpc,
payer,
mintAuthority.publicKey,
9, // 小数位数
);
console.log("Light铸造账户已创建:", mint.toBase58());Mint to Light-ATA
铸造至Light ATA
typescript
import { mintToLightAta } from "@lightprotocol/light-token";
const transactionSignature = await mintToLightAta(
rpc,
payer,
mint,
recipient,
mintAuthority,
amount,
);typescript
import { mintToLightAta } from "@lightprotocol/light-token";
const transactionSignature = await mintToLightAta(
rpc,
payer,
mint,
recipient,
mintAuthority,
amount,
);Wrap SPL to Light Token
将SPL代币包装为Light Token
typescript
import { wrapSpl } from "@lightprotocol/light-token";
// Wrap SPL tokens to Light tokens
const transactionSignature = await wrapSpl(
rpc,
payer,
mint,
amount,
owner,
splTokenAccount,
);typescript
import { wrapSpl } from "@lightprotocol/light-token";
// 将SPL代币包装为Light Token
const transactionSignature = await wrapSpl(
rpc,
payer,
mint,
amount,
owner,
splTokenAccount,
);Unwrap Light Token to SPL
将Light Token解包装为SPL
typescript
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
);typescript
import { unwrapToSpl } from "@lightprotocol/light-token";
// 将Light Token解包装回SPL
const transactionSignature = await unwrapToSpl(
rpc,
payer,
mint,
amount,
owner,
recipient, // SPL代币账户
);JSON RPC Methods
JSON RPC方法
Light Protocol provides 21 specialized RPC methods for compressed accounts. Key methods:
| Method | Description |
|---|---|
| Get compressed account by address or hash |
| Get all compressed accounts for an owner |
| Get compressed token accounts for an owner |
| Get balance for a token account |
| Get all token balances for an owner |
| Get all holders of a compressed mint |
| Get ZK proof for compressed accounts |
| Batch fetch compressed accounts |
| Get transaction with parsed compression data |
| Check indexer status |
See resources/json-rpc-methods.md for complete documentation.
Light Protocol提供21种专门用于压缩账户的RPC方法。核心方法:
| 方法 | 描述 |
|---|---|
| 通过地址或哈希获取压缩账户 |
| 获取所有者的所有压缩账户 |
| 获取所有者的压缩代币账户 |
| 获取代币账户余额 |
| 获取所有者的所有代币余额 |
| 获取压缩铸造账户的所有持有者 |
| 获取压缩账户的ZK证明 |
| 批量获取压缩账户 |
| 获取包含解析后压缩数据的交易 |
| 检查索引器状态 |
完整文档请查看 resources/json-rpc-methods.md。
Best Practices
最佳实践
Transaction Limits
交易限制
- 4 compressed accounts per transaction: Split large operations into multiple transactions
- Compute unit budget: Add extra compute units for proof verification
typescript
import { ComputeBudgetProgram } from "@solana/web3.js";
// Add compute budget for complex transactions
const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({
units: 300_000,
});- 每笔交易最多4个压缩账户:将大型操作拆分为多笔交易
- 计算单元预算:为证明验证额外添加计算单元
typescript
import { ComputeBudgetProgram } from "@solana/web3.js";
// 为复杂交易添加计算预算
const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({
units: 300_000,
});Batch Operations
批量操作
typescript
// 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;
}typescript
// 分批处理多个接收方
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;
}Error Handling
错误处理
typescript
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;
}
}typescript
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;
}
}Delegation
委托
typescript
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,
);typescript
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,
);Resources
资源
Official Documentation
官方文档
GitHub Repositories
GitHub仓库
- Light Protocol - Main repository
- Example Node.js Client
- Example Web Client
- Light Protocol - 主仓库
- Example Node.js Client - Node.js客户端示例
- Example Web Client - Web客户端示例
Community
社区
- Discord - Light Protocol Discord
- Helius Discord - RPC provider support
- Discord - Light Protocol Discord社区
- Helius Discord - RPC提供商支持
Wallet Support
钱包支持
- Phantom - Native compressed token support
- Backpack - Native compressed token support
- Phantom - 原生支持压缩代币
- Backpack - 原生支持压缩代币
Skill Structure
技能结构
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 solutionslight-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 # 常见问题与解决方案