本文介绍了在Solana网络上进行低成本空投的方法,特别是通过零知识(ZK)压缩技术来大幅降低空投成本。传统空投需要为每个接收者创建关联代币账户(ATA),而ZK压缩技术通过将数据整合到单个哈希中来避免这一成本,显著降低了费用。
10分钟阅读
2025年1月30日
空投让你可以一次性向许多人发送代币。它们奖励早期支持者,吸引新用户,并帮助建立强大的社区。但是每笔交易都有需要支付的费用,这意味着空投可能会迅速变得昂贵。在Solana上,你可能还需要为每个新的持有者创建一个代币账户,这进一步提高了成本。一旦超出几百个地址,这些费用可能会使本来很兴奋的赠品变成预算的噩梦。
在本指南中,我们将看看:
让我们开始吧。
标准的Solana空投对每个接收者需要两个步骤:
以下是使用@solana/web3.js和@solana/spl-token的简化代码示例:
代码
// 简单的SPL代币空投脚本,如果代币账户不存在则创建之
import {
Connection,
PublicKey,
Keypair,
Transaction,
sendAndConfirmTransaction,
} from "@solana/web3.js";
import {
createTransferInstruction,
getOrCreateAssociatedTokenAccount,
} from "@solana/spl-token";
import bs58 from 'bs58';
// 配置这些值
const TOKEN_MINT = new PublicKey("<YOUR_TOKEN_MINT_ADDRESS>");
const recipients = [\
{ address: "<RECIPIENT_WALLET_ADDRESS>", amount: 0.05 }, // 代币金额(不是lamports)\
// 根据需要添加更多接收者\
];
async function airdropTokens(connection: Connection, senderKeypair: Keypair) {
// 首先,获取或创建发送者的代币账户
const senderATA = await getOrCreateAssociatedTokenAccount(
connection,
senderKeypair, // 付款人
TOKEN_MINT,
senderKeypair.publicKey
);
for (const recipient of recipients) {
try {
const recipientPubkey = new PublicKey(recipient.address);
// 获取或创建接收者的代币账户
const recipientATA = await getOrCreateAssociatedTokenAccount(
connection,
senderKeypair, // 付款人,用于账户创建
TOKEN_MINT,
recipientPubkey
);
// 创建转账指令
const transferIx = createTransferInstruction(
senderATA.address,
recipientATA.address,
senderKeypair.publicKey,
recipient.amount * 10 ** 9 // 假设9个小数位,若不同请调整
);
// 发送并确认交易
const tx = new Transaction().add(transferIx);
const signature = await sendAndConfirmTransaction(connection, tx, [\
senderKeypair,\
]);
console.log(`向 ${recipient.address} 发送了 ${recipient.amount} 个代币`);
console.log(`代币账户: ${recipientATA.address.toString()}`);
console.log(`交易: https://explorer.solana.com/tx/${signature}`);
} catch (err) {
console.error(`向 ${recipient.address} 发送失败:`, err);
}
}
}
// 使用示例
const connection = new Connection("<YOUR_HELIUS_ENDPOINT>");
// 切勿在生产环境中硬编码私钥!
// 这仅用于演示目的
const secretKey = bs58.decode("<YOUR_BASE58_ENCODED_PRIVATE_KEY>");
const senderKeypair = Keypair.fromSecretKey(secretKey);
airdropTokens(connection, senderKeypair)
.then(() => console.log("空投完成!"))
.catch(console.error);
在Solana上,空投的一个主要挑战是,每个用户地址都需要其自己的专用代币账户。一个关联代币账户(ATA)将用户的钱包地址与特定代币铸造相关联。如果某人没有某个代币的ATA,你就不得不为他们创建一个。那个创建费用大约为0.002 SOL,因为你是在支付存储数据在区块链上的租金(即,地址X持有该数量的代币Y)。如果你只有几百个接收者,这可能没什么大不了的。但如果你有成千上万个,这些费用会迅速累加。
我们快速计算一下10,000个接收者的费用:
以1 SOL = 240美元计算,这相当于4,800美元。
按相同的汇率,0.05 SOL是12美元。
如果SOL的价格上涨,或者你计划达到100,000或1,000,000个地址,这些成本会变得巨大的,尤其是当我们意识到我们甚至还没有考虑_优先费用_时。
使用ZK压缩时,你不为每个用户创建完整的链上账户。相反,你将每个人的数据打包成一个单一的哈希(即,Merkle根),该哈希由零知识证明支持。这种方法:
对于同样的10,000个接收者,费用可能降至大约0.01 SOL,在当前汇率下,0.01 SOL仅为2.40美元。当你扩大规模超出这个数字时,节省会更大,而且你仍然可以保持Solana的安全性。
提示: 查看AirShip计算器以查看ZK压缩能为你节省多少空投成本。
本质上,ZK压缩在链外存储代币数据,同时在链上保留一个小的“指纹”(哈希)。这个指纹引用账本数据,利用Solana的安全性。然而,它避免为每个钱包创建标准的链上账户,从而降低了超过95%的费用。
对于同样的10,000个接收者,ZK压缩空投的成本约为~0.01 SOL。
这相比于约20 SOL的成本,有了巨大的降低。
一旦你扩展到数百万个地址,节省将更为显著。
让我们看看一些术语,以理解ZK压缩的工作原理。
一个Merkle树是一个数据结构,将许多数据片段(如数千个用户余额)组织成一个称为_根_的单一紧凑哈希。
Merkle树中的每个“叶子”代表一片数据(例如,一个压缩账户)。你将成对的叶子组合(即哈希)生成一个“父”哈希,然后组合父哈希,直到得到一个最终哈希——根。这根是验证存储在叶子中的任何单个数据(即,账户余额)真实性和未改变状态所需的全部。
与你在个别链上账户中存储每个用户余额或代币账户的方式不同,你在链上仅存储Merkle根。基础数据,如每个用户的代币余额,存储在Solana的账本中。这个账本数据推导当前状态,并通过Merkle根保持可验证。
在这种情况下,“链外”意味着完整的数据(例如,每个用户的详细账户信息)并未存储在传统的链上账户中。相反,这些数据以更具成本效益的形式记录在Solana的账本中。专门的索引器跟踪和管理这些数据,确保它们可以通过链上的Merkle根高效访问和验证。
因为Merkle根存储在链上,任何人都可以通过与该根对照来验证链外数据。如果有人试图在链外改变用户的余额,更新的余额将与链上的Merkle根不匹配。证明将失败,运行时将拒绝该交易。
这让你可以存储大量数据(如数百万个账户),而不需为每一个支付租金,同时确保它们都是正确的。
零知识证明(ZKPs)让你能够在不揭示所有细节的情况下证明一个陈述。想象一下,像向朋友展示你知道一个密封盒子里面有什么,而不打开它。他们可以验证你的说法有效,而你们谁也不需要打开盒子。在Solana上,这意味着你可以证明一个账户的余额符合Merkle根,而不需要将任何数据上传至链上。
原因有几个:
ZK证明将所有内容联系在一起。你只需将根保存在链上,并依靠证明来显示链外数据的任何更改是合法的。
ZK压缩为Solana开发者节省开支的主要方式有三种:
每个用户通常需要在标准Solana空投中拥有一个链上代币账户。这一账户是需要支付租金的。使用ZK压缩后,你无需创建成千上万个单独的账户,而是将它们批量集中为一个Merkle树。
区块链仅存储一个Merkle根,而不是每个用户的完整数据。因此,你的状态存储(即“租金”)显著减少。
想象一下,你有10,000个用户,你想向他们空投代币。以下是传统空投方法与使用ZK压缩的成本对比:
传统方法:
ZK压缩方法:
即使你需要多个Merkle树来处理非常大的用户群,你仍然在链上存储的数据远少于为每个人单独的代币账户。因此,显著节省就在这里。
简而言之:
这种组合让你不用为每个用户的账户支付租金,使大规模空投或庞大用户群体在Solana上变得更加实惠。
AirShip是一个免费的开源工具,专为ZK压缩空投而构建。它有两个主要选项:
这两者都会处理ZK压缩的详细信息。它们可以使用支持压缩代币的RPC端点。你可以在helius.dev获得一个免费的端点。
访问AirShip网站,点击“创建新空投”按钮。
使用Airship工具,你还可以计算预期的空投成本,并在你的钱包中解压缩压缩代币。
使用RPC,如https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY。
警告: 使用一个专门为这个空投任务创建的临时钱包。
私钥仅用于简化签名和发送交易。它不会存储在任何地方,也不会与其他资产共享,确保你的其他资产的安全。
选择NFT、代币或Saga持有者,或上传自己的CSV文件。
指定你想空投的代币数量或比例。
仔细检查摘要,然后确认空投。
AirShip会处理批量发送和ZK证明的背后逻辑。该UI让你可查看交易的处理过程以及完成情况。
CLI更适合进行更大规模的空投或喜欢在终端工作的用户。
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
helius-airship \
--keypair /path/to/your_wallet.json \
--url "https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY"
如果你按照步骤操作,AirShip会提示你输入目标接收者(CSV等)和代币数量。
就这样!
AirShip现在将批量向你的空投接收者发送交易。
通过在Solana上使用ZK压缩,你可以节省很多钱。传统空投对于10,000个接收者的成本通常为20 SOL或更多(由于代币账户创建)。通过ZK压缩,成本可以降到0.01 SOL。像AirShip这样的工具使得进行这些空投变得简单,无需从头开始编写代码。
ZK压缩使得你可以在不耗尽财库的情况下奖励你的社区或增长用户群。它保持低成本,同时保留Solana的安全性和速度。这是大规模代币分发的巨大进步。
- 原文链接: helius.dev/blog/solana-a...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,在这里修改,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!