什么是Solana上的租金以及如何计算它

  • QuickNode
  • 发布于 2025-01-30 21:41
  • 阅读 13

本文深入介绍了Solana区块链的租赁机制,详细说明了如何计算账户的租金免除阈值,并提供了三种方法:使用Solana CLI、Solana Web3.js库和Anchor框架。文章结构清晰,包含代码示例和完整操作步骤,适合开发者理解和应用该机制。

概述

租金是 Solana 区块链上确保区块链资源高效使用的机制。它要求账户保持与其在网络上存储的数据量成比例的最低余额。未能维持这一最低余额的账户将从账本中移除,以腾出存储空间。你可以把它想象成类似于银行账户。对于许多账户,如果你不保持最低余额,银行将会向你收费。如果你的余额低于所需的最低额,银行可能会收取费用或关闭你的账户。Solana 的租金就像最低余额要求,确保网络上的账户拥有足够的 lamports(一个 lamport 是一个 SOL 的十亿分之一)来覆盖网络存储成本。如果一个账户的余额低于 租金豁免阈值,该账户可能会被移除出网络。租金是可退还的。如果一个账户被关闭(从网络中移除),链上的数据将被删除,租金将退还给账户所有者(或其他已定义的账户)。

Solana 协议向账户所有者收取租金以:

  • 鼓励通过移除不再活跃使用的账户来高效利用存储空间。
  • 补偿验证者在存储账户数据时提供的资源。

因为租金是创建新账户的必要条件,所以在创建账户之前,你需要知道 租金豁免阈值。这样,你才能用足够的 lamports 来为账户提供最低资金。 在本指南中,你将学习三种计算账户租金豁免阈值的方法。

你将要做的事情

在本指南中,你将使用三种方法计算账户的租金豁免阈值:

  1. Solana CLI
  2. Solana Web3.js 库
  3. Anchor 的空间约束

你需要的准备

请确保在继续之前已安装所需的依赖项:

  • Solana 基础知识 的基本了解
  • 已安装 Solana CLI 最新版本
  • 已安装 Node.js(版本 16.15 或更高)
  • 基础的 JavaScript 经验
  • 现代网页浏览器(例如,Google Chrome
  • 具备 Anchor 经验会对本指南的某一部分有帮助,但并非必需

如何计算租金豁免阈值

租金豁免阈值是通过账户的字节大小来计算的。在这些示例中,我们将假设一个简单的账户大小为 16 字节,尽管你可以用任何你想要的账户大小来替换这个值。

方法 1 - Solana CLI

计算租金豁免阈值最简单的方法是使用 Solana CLI。你可以使用 solana rent 命令来计算给定账户大小的租金豁免阈值。在你的终端中运行以下命令:

solana rent 16

这将计算一个数据为 16 字节的账户的租金豁免阈值。输出将如下所示:

租金豁免最低限额:0.00100224 SOL

这意味着一个数据为 16 字节的账户必须至少有 0.00100224 SOL,以避免账户被从网络中删除。你可以修改此查询以计算任意账户大小的租金豁免阈值。

方法 2 - Solana Web3.js 库

要使用 Solana-Web3.js 计算租金,请使用 getMinimumBalanceForRentExemption 方法。此方法接受字节大小作为参数,并返回以 lamports 表示的租金豁免阈值。让我们创建一个新的 Node.js 项目,并安装 Solana-Web3.js 库:

mkdir solana-rent
cd solana-rent
npm init -y # 或 yarn init -y
npm install @solana/web3.js@1 # 或 yarn add @solana/web3.js@1
echo > index.js

这将创建一个新的 Node.js 项目,并安装 Solana-Web3.js 库。接下来,让我们将以下代码添加到 index.js 中:

const { Connection, clusterApiUrl, LAMPORTS_PER_SOL } = require('@solana/web3.js');
const connection = new Connection(clusterApiUrl('mainnet-beta'), 'confirmed');

(async () => {
    const dataSize = 16; // 用所需的字节大小替换
    const minBalance = await connection.getMinimumBalanceForRentExemption(dataSize);
    console.log(`租金豁免最低限额:${minBalance / LAMPORTS_PER_SOL} SOL`);
})();

我们在这里建立了与 Solana 主网集群的连接,然后调用 getMinimumBalanceForRentExemption 方法。此方法接受字节大小作为参数,并返回以 lamports 表示的租金豁免阈值。然后,我们将结果除以 LAMPORTS_PER_SOL 将 lamports 转换为 SOL,并将结果记录到控制台。

在你的终端中,运行以下命令以执行脚本:

node index.js

输出应如下所示:

租金豁免最低限额:0.00100224 SOL

干得好!

方法 3 - Anchor 中的空间约束

使用 Anchor 框架,你可以使用 space 约束来自动计算新账户所需的租金豁免阈值。space 约束被用于指定字节中的账户大小。

示例 Hello World 程序 在 Solana Playground 上是一个如何使用 space 约束的好例子。

如果你想运行它,整个程序链接在上面,但让我们重点关注 Initialize 结构:

#[derive(Accounts)]
pub struct Initialize<'info> {
    #[account(init, payer = signer, space = 8 + 8)]
    pub new_account: Account<'info, NewAccount>,
    #[account(mut)]
    pub signer: Signer<'info>,
    pub system_program: Program<'info, System>,
}

#[account]
pub struct NewAccount {
    data: u64
}

Initialize 结构定义了 initialize 函数的上下文。它包含了成功执行该函数所需的必要账户和程序引用。space 约束应用于 Initialize 结构中的 new_account 字段,以指定新的 NewAccount 的字节大小。

NewAccount 结构表示正在创建的新账户的状态。在这种情况下,它只有一个类型为 u64data 字段,占用 8 字节的存储空间。Initialize 结构中的空间约束为账户鉴别符分配了额外的空间(8 字节),因此账户的总大小为 16 字节。

Initialize 上下文传递给 initialize 函数时,Anchor 会自动确保 new_account 账户被初始化时拥有足够的 lamports,以满足一个数据为 16 字节账户的租金豁免阈值。这部分货款由交易的签名者支付。

总结

做得好!现在你已经理解了 Solana 上的租金是如何工作的,你可以开始构建自己的程序和去中心化应用程序(dApps)!查看我们的其他指南,继续学习:

我们很想了解你正在构建的内容。请在 Discord 给我们留言,或关注我们的 Twitter,以获取最新信息!

我们 ❤️ 反馈!

如果你对本指南有任何反馈, 请告知我们。我们很想听到你的声音。

  • 原文链接: quicknode.com/guides/sol...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。