空投可让您一次向许多人发送代币。它们奖励早期支持者,吸引新用户,并帮助建立强大的社区。但每笔交易都需要支付费用,这意味着空投很快就会变得昂贵。在 Solana 上,您可能还需要为每个新持有者创建一个代币帐户,这会使成本更高。一旦您的地址超过几百个,这些费用可能会让原本令人兴奋的赠品变成预算难题。
在本指南中,我们将讨论:
如何进行传统的 Solana 空投
成本来自哪里
零知识 (ZK) 压缩如何解决这些问题
如何使用 AirShip 进行廉价、大规模空投
让我们开始吧。
传统空投:如何运作
标准的 Solana 空投需要每个接收者执行两个步骤:
如果收件人没有关联令牌账户 (ATA),请创建一个。
将令牌转移到该 ATA。
以下是使用@solana/web3.js 和@solana/spl-token 的简化代码示例:
代码
// Simple SPL token airdrop script that creates token accounts if they don't exist
import {
Connection,
PublicKey,
Keypair,
Transaction,
sendAndConfirmTransaction,
} from "@solana/web3.js";
import {
createTransferInstruction,
getOrCreateAssociatedTokenAccount,
} from "@solana/spl-token";
import bs58 from 'bs58';
// Configure these values
const TOKEN_MINT = new PublicKey("<YOUR_TOKEN_MINT_ADDRESS>");
const recipients = [
{ address: "<RECIPIENT_WALLET_ADDRESS>", amount: 0.05 }, // amount in tokens (not lamports)
// Add more recipients as needed
];
async function airdropTokens(connection: Connection, senderKeypair: Keypair) {
// First, get or create sender's token account
const senderATA = await getOrCreateAssociatedTokenAccount(
connection,
senderKeypair, // payer
TOKEN_MINT,
senderKeypair.publicKey
);
for (const recipient of recipients) {
try {
const recipientPubkey = new PublicKey(recipient.address);
// Get or create recipient's token account
const recipientATA = await getOrCreateAssociatedTokenAccount(
connection,
senderKeypair, // payer for account creation
TOKEN_MINT,
recipientPubkey
);
// Create transfer instruction
const transferIx = createTransferInstruction(
senderATA.address,
recipientATA.address,
senderKeypair.publicKey,
recipient.amount * 10 ** 9 // Assuming 9 decimals, adjust if different
);
// Send and confirm transaction
const tx = new Transaction().add(transferIx);
const signature = await sendAndConfirmTransaction(connection, tx, [
senderKeypair,
]);
console.log(`Sent ${recipient.amount} tokens to ${recipient.address}`);
console.log(`Token Account: ${recipientATA.address.toString()}`);
console.log(`Transaction: https://explorer.solana.com/tx/${signature}`);
} catch (err) {
console.error(`Failed to send to ${recipient.address}:`, err);
}
}
}
// Usage example
const connection = new Connection("<YOUR_HELIUS_ENDPOINT>");
// NEVER HARDCODE PRIVATE KEYS IN PRODUCTION!
// This is just for demonstration purposes
const secretKey = bs58.decode("<YOUR_BASE58_ENCODED_PRIVATE_KEY>");
const senderKeypair = Keypair.fromSecretKey(secretKey);
airdropTokens(connection, senderKeypair)
.then(() => console.log("Airdrop complete!"))
.catch(console.error);
空投成本
Solana 空投面临的一个主要挑战是每个用户地址都需要有自己的专用代币账户。关联代币账户 (ATA) 将用户的钱包地址链接到特定的代币铸币厂。如果某人没有给定代币的 ATA,则必须为他们创建一个。创建成本约为 0.002 SOL,因为您要支付租金以将数据存储在区块链上(即地址 X 持有此数量的代币 Y)。如果您只有几百个收件人,这可能不是什么大问题。但是如果您有数万个收件人,这些费用很快就会累积起来。
传统空投成本
基本交易费:每个地址 0.000005 SOL。
代币账户创建:每个新账户约 0.002 SOL。
让我们对10,000 名收件人进行一些快速计算:
使用新账户:您总共需要花费约20 SOL。1
SOL = 240 美元,相当于4,800 美元。
无新账户:您需要支付大约0.05 SOL(仅限转账)。
按照相同的兑换率,0.05 SOL相当于12 美元。
如果 SOL 的价格上涨或者您计划达到 100,000 或 100 万个地址,这些成本就会变得巨大——尤其是当我们意识到我们甚至还没有考虑优先费用时。
解决方案:ZK-压缩空投
使用 ZK 压缩,您无需为每个用户创建完整的链上帐户。相反,您可以将每个人的数据捆绑到由零知识证明支持的单个哈希(即 Merkle 根)中。这种方法:
无需支付个人代币账户的租金。
用一个链上根取代数千个链上账户。
对于同样的 10,000 名接收者,成本可能会降至总计约0.01 SOL——按当前汇率计算,0.01 SOL仅为2.40 美元。当您的规模超过这个数字时,节省的费用会更多,而且您仍然可以保持 Solana 的安全性。
提示:查看AirShip 计算器,了解 ZK 压缩可以降低多少空投成本。
ZK压缩如何降低空投成本?
本质上,ZK Compression将代币数据存储在链下,同时在链上保留一个小的“指纹”(哈希值)。此指纹引用账本数据,从而利用了 Solana 的安全性。但是,它避免为每个钱包创建一个标准的链上账户,从而将费用降低 95% 以上。
对于同样的 10,000 名接收者,ZK 压缩空投的成本约为0.01 SOL。
这与约 20 SOL 相比,成本大幅降低。
一旦扩展到数百万个地址,节省的费用就更加可观。
ZK 压缩如何工作?
让我们看几个术语来了解 ZK 压缩的工作原理。
1. Merkle 树
Merkle 树是一种数据结构,它将多条数据(例如数千个用户余额)组织成一个称为根的单一紧凑哈希值。
Merkle 树中的每个“叶子”都代表一段数据(例如压缩帐户)。您可以将叶子对组合(即哈希)以获得“父”哈希,然后将父哈希组合起来,直到得到最终哈希 — 根。这个根就是您验证存储在叶子中的任何单个数据(即帐户余额)是否真实且未更改所需的全部内容。
您无需将每个用户余额或代币账户存储在单独的链上账户中,只需将 Merkle 根存储在链上即可。底层数据(例如每个用户的代币余额)保存在 Solana 的账本中。此账本数据可得出当前状态,并且可通过 Merkle 根进行验证。
2. 链下存储
在这种情况下,“链下”意味着完整的数据(例如,每个用户的详细帐户信息)不存储在传统的链上帐户中。相反,数据以更具成本效益的形式记录在 Solana 的账本中。专门的索引器跟踪和管理这些数据,确保可以根据链上 Merkle 根高效地访问和验证这些数据。
我们如何信任“链下/分类账”数据?
由于 Merkle 根存储在链上,因此任何人都可以通过对照该根检查链下数据来验证链下数据。如果有人试图在链下更改用户的余额,更新后的余额将与链上 Merkle 根不匹配。证明将失败,并且运行时将拒绝交易。
这样,你就可以存储大量数据(例如数百万个帐户),而不必为每个帐户支付租金,同时仍然确保所有数据都是正确的。
3.零知识证明(ZKP)
零知识证明(ZKP) 可让您证明陈述而不透露其所有细节。想象一下,这就像向朋友展示您知道密封盒子里的东西而无需打开它。他们可以验证您的声明是否有效,而无需你们任何一个人打开盒子。在 Solana 上,这意味着您可以证明帐户的余额与 Merkle 根一致,而无需上传任何链上数据。
为什么要使用 ZK 证明?
原因如下:
证明大小小: Solana 上的 ZK 证明正变得越来越高效,许多证明现在都足够紧凑,可以满足 Solana 的交易大小限制(大约几百字节)。这种效率允许进行可扩展、低成本的验证,而不会导致网络过载。
减少链上负载:您无需将每个帐户更新都存储在链上,只需提交一个引用 Merkle 根的小证明即可。发生更新时,根会发生变化以反映新状态,但您仍可避免将所有详细数据直接存储在链上。
安全性:证明确认您的链下数据与链上根“指纹”相匹配。如果不匹配,则证明失败,交易将被拒绝。
ZK 证明将所有内容联系在一起。您只需将根保留在链上,并依靠证明来证明对链下数据的任何更改都是合法的。
ZK 压缩如何省钱?
ZK Compression 为 Solana 开发人员节省资金的主要方式有三种:
1. 每个钱包地址没有单独的代币账户
在标准的 Solana 空投中,每个用户通常都需要一个链上代币账户。该账户需要租金。使用 ZK 压缩,您无需创建数千个单独的账户。相反,您可以将它们批量放入单个 Merkle 树中。
2. 降低租金
区块链仅存储一个 Merkle 根,而不是每个用户的完整数据。因此,您的状态存储(即“租金”)会便宜很多。
ZK压缩空投示例
假设你有 10,000 名用户想要空投代币。以下是传统空投方法与使用 ZK 压缩的成本对比
传统方法:
您最多可以创建 10,000 个链上代币账户,并为每个账户支付租金。
每次创建账户都需要支付少量但明显的费用。
ZK 压缩方法:
您构建一个链下 Merkle 树来覆盖所有 10,000 个余额。
您在链上提交该树的单个“根”。
现在,您只需在每次空投行动中维护和更新一个根,这已由 ZK 证明证明。
即使你需要多个 Merkle 树来处理非常大的用户群,你在链上存储的数据仍然比为每个人设置单独的代币账户少得多。这就是节省大量成本的原因。
简而言之:
Merkle 树将大量账户压缩为单个哈希值(根)。
链下存储降低了链上租金成本。
ZK 证明保证链下数据有效,而无需将所有细节都放在链上。
这种组合使您无需为每个用户的帐户支付租金,从而使大规模空投或庞大的用户群在 Solana 上变得更加实惠。
如何使用 AirShip 进行 ZK 压缩空投代币
AirShip是一款免费的开源工具,专为 ZK 压缩空投而构建。它有两个主要选项:
Web UI:最简单的发送方式。它在您的浏览器中运行 — 无需设置。
CLI:它更快、更安全,并且在本地运行而不是在浏览器上运行。
两者都为您处理 ZK 压缩细节。它们与支持压缩令牌的 RPC 端点配合使用。您可以在helius.dev获取免费端点。
先决条件
一个 Solana 钱包,其中保存着您想要分发的代币。
足够的 SOL 来支付最低费用。
收件人地址列表(例如 CSV 文件、NFT 持有者或代币持有者)。我们建议使用DAS(数字资产标准)来高效获取资产持有者数据。有关更多详细信息,请访问Helius DAS API 文档。
支持 ZK 压缩和 DAS API 的 RPC。
使用 Web UI
1. 前往 AirShip 网站并点击“创建新空投”。
访问AirShip网站并点击“创建新空投”按钮。
使用 Airship 工具,您还可以计算空投的预期成本并解压钱包中的压缩代币。
2. 输入你的私钥和 RPC URL
使用类似https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY的 RPC 。
警告:使用为此空投任务明确创建的临时钱包。
私钥仅用于简化签署和发送交易的过程。它不会在任何地方存储或共享,从而确保您其他资产的安全。
3. 选择收件人
选择 NFT、代币或 Saga 持有者,或者上传您自己的 CSV 文件。
4.设置代币数量
指定您想要空投的代币数量或百分比。
5. 审核并确认
仔细检查摘要,然后确认空投。
AirShip 将在后台处理批量发送和 ZK 证明。用户界面可让您查看交易的流程以及完成时间。
使用 CLI
如果您喜欢在终端中工作,那么CLI更适合于较大的空投。
1.通过 pnpm 安装
代码
复制
npm install -g helius-airship
或者从源代码构建:
代码
git clone https://github.com/helius-labs/airship.git
cd airship
pnpm install && pnpm build
cd packages/cli
pnpm link --global
2. 运行 CLI:
代码
helius-airship \
--keypair /path/to/your_wallet.json \
--url "https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY"
3. 添加目标列表
如果您按照这些步骤操作,AirShip 将提示您输入目标收件人(CSV 等)和令牌金额。
AirShip 现在将向您的空投接收者发送批量交易。
结论
通过在 Solana 上使用 ZK 压缩,您可以节省大量资金。传统空投通常需要为 10,000 名接收者花费 20 SOL 或更多(由于创建了代币账户)。使用 ZK 压缩,它可以降至 0.01 SOL。AirShip 等工具可以轻松启动这些空投,而无需从头开始编写代码。