本文深入介绍了Solana区块链的租赁机制,详细说明了如何计算账户的租金免除阈值,并提供了三种方法:使用Solana CLI、Solana Web3.js库和Anchor框架。文章结构清晰,包含代码示例和完整操作步骤,适合开发者理解和应用该机制。
租金是 Solana 区块链上确保区块链资源高效使用的机制。它要求账户保持与其在网络上存储的数据量成比例的最低余额。未能维持这一最低余额的账户将从账本中移除,以腾出存储空间。你可以把它想象成类似于银行账户。对于许多账户,如果你不保持最低余额,银行将会向你收费。如果你的余额低于所需的最低额,银行可能会收取费用或关闭你的账户。Solana 的租金就像最低余额要求,确保网络上的账户拥有足够的 lamports(一个 lamport 是一个 SOL 的十亿分之一)来覆盖网络存储成本。如果一个账户的余额低于 租金豁免阈值,该账户可能会被移除出网络。租金是可退还的。如果一个账户被关闭(从网络中移除),链上的数据将被删除,租金将退还给账户所有者(或其他已定义的账户)。
Solana 协议向账户所有者收取租金以:
因为租金是创建新账户的必要条件,所以在创建账户之前,你需要知道 租金豁免阈值。这样,你才能用足够的 lamports 来为账户提供最低资金。 在本指南中,你将学习三种计算账户租金豁免阈值的方法。
在本指南中,你将使用三种方法计算账户的租金豁免阈值:
请确保在继续之前已安装所需的依赖项:
租金豁免阈值是通过账户的字节大小来计算的。在这些示例中,我们将假设一个简单的账户大小为 16 字节,尽管你可以用任何你想要的账户大小来替换这个值。
计算租金豁免阈值最简单的方法是使用 Solana CLI。你可以使用 solana rent
命令来计算给定账户大小的租金豁免阈值。在你的终端中运行以下命令:
solana rent 16
这将计算一个数据为 16 字节的账户的租金豁免阈值。输出将如下所示:
租金豁免最低限额:0.00100224 SOL
这意味着一个数据为 16 字节的账户必须至少有 0.00100224 SOL,以避免账户被从网络中删除。你可以修改此查询以计算任意账户大小的租金豁免阈值。
要使用 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
干得好!
使用 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 结构表示正在创建的新账户的状态。在这种情况下,它只有一个类型为 u64 的 data
字段,占用 8 字节的存储空间。Initialize 结构中的空间约束为账户鉴别符分配了额外的空间(8 字节),因此账户的总大小为 16 字节。
当 Initialize 上下文传递给 initialize
函数时,Anchor 会自动确保 new_account
账户被初始化时拥有足够的 lamports,以满足一个数据为 16 字节账户的租金豁免阈值。这部分货款由交易的签名者支付。
做得好!现在你已经理解了 Solana 上的租金是如何工作的,你可以开始构建自己的程序和去中心化应用程序(dApps)!查看我们的其他指南,继续学习:
我们很想了解你正在构建的内容。请在 Discord 给我们留言,或关注我们的 Twitter,以获取最新信息!
如果你对本指南有任何反馈, 请告知我们。我们很想听到你的声音。
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!