Solana 60 天课程

2025年02月27日更新 66 人订阅
原价: ¥ 28 限时优惠
专栏简介 开始 Solana - 安装与故障排除 Solana 和 Rust 中的算术与基本类型 Solana Anchor 程序 IDL Solana中的Require、Revert和自定义错误 Solana程序是可升级的,并且没有构造函数 Solidity开发者的Rust基础 Rust不寻常的语法 Rust 函数式过程宏 Rust 结构体与属性式和自定义派生宏 Rust 和 Solana 中的可见性与“继承” Solana时钟及其他“区块”变量 Solana 系统变量详解 Solana 日志、“事件”与交易历史 Tx.origin、msg.sender 和 onlyOwner 在 Solana 中:识别调用者 Solana 计算单元与交易费用介绍 在 Solana 和 Anchor 中初始化账户 Solana 计数器教程:在账户中读写数据 使用 Solana web3 js 和 Anchor 读取账户数据 在Solana中创建“映射”和“嵌套映射” Solana中的存储成本、最大存储容量和账户调整 在 Solana 中读取账户余额的 Anchor 方法:address(account).balance 功能修饰符(view、pure、payable)和回退函数在 Solana 中不存在的原因 在 Solana 上实现 SOL 转账及构建支付分配器 使用不同签名者修改账户 PDA(程序派生地址)与 Solana 中的密钥对账户 理解 Solana 中的账户所有权:从PDA中转移SOL Anchor 中的 Init if needed 与重初始化攻击 Solana 中的多重调用:批量交易与交易大小限制 Solana 中的所有者与权限 在Solana中删除和关闭账户与程序 在 Anchor 中:不同类型的账户 在链上读取另一个锚点程序账户数据 在 Anchor 中的跨程序调用(CPI)

Solana中的存储成本、最大存储容量和账户调整

  • RareSkills
  • 发布于 2024-03-01 23:18
  • 阅读 977

文章详细介绍了Solana区块链中账户存储空间租金的计算方式及其相关概念,包括租金豁免、存储成本比较、账户大小限制和调整、以及部署程序的成本预估。

Solana 账户租赁 在分配存储空间时,付款方必须支付每字节分配一定数量的SOL。

Solana称之为“租赁”。这个名称有点误导,因为它暗示需要每月充值,但情况并非总是如此。一旦租金支付,就不再需要支付,即使两年过去了。当支付了两年的租金后,账户被认为是“免租”的。

这个名称来源于Solana最初按字节每年的形式向账户收费。如果你只支付了半年的租金,那么你的账户将在六个月后被删除。如果你提前支付了两年的租金,账户就会“免租”。该账户将不再需要支付租金。如今,所有账户都必须是免租的;你不能支付少于两年的租金。

虽然租金是按照“每字节”计算的,但零数据的账户不是免费的;Solana仍需要对其进行索引并存储与之相关的元数据。

当账户初始化时,所需租金的数量会在后台计算;你无需明确计算租金

然而,你确实想要能够预测存储的成本,以便能够恰当地设计你的应用程序。

如果你想要一个快速的估算,运行 solana rent <字节数> 在命令行中会给出快速的答案:solana rent 32

如前所述,分配零字节是非免费的:solana rent 0

让我们看看这个费用是如何计算的。

Anchor Rent Module给我们提供了一些与租金相关的常量:

  • ACCOUNT_STORAGE_OVERHEAD:该常量的值为128(字节),顾名思义,一个空账户有128字节的开销。
  • DEFAULT_EXEMPTION_THRESHOLD:该常量的值为2.0(浮点数64),指的是提前支付两年的租金使得账户免于支付进一步的租金。
  • DEFAULT_LAMPORTS_PER_BYTE_YEAR:该常量的值为3,480,意味着每字节每年需要3,480 lamports。由于我们需要支付两年, 每字节将花费6,960 lamports。

以下Rust程序打印出一个空账户将花费的金额。请注意,结果与上面的 solana rent 0 截图相符:

use anchor_lang::prelude::*;
use anchor_lang::solana_program::rent as rent_module;

declare_id!("BfMny1VwizQh89rZtikEVSXbNCVYRmi6ah8kzvze5j1S");

#[program]
pub mod rent {
    use super::*;

    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
        let cost_of_empty_acc = rent_module:: ACCOUNT_STORAGE_OVERHEAD as f64 * 
                                rent_module::DEFAULT_LAMPORTS_PER_BYTE_YEAR as f64 *
                                rent_module::DEFAULT_EXEMPTION_THRESHOLD; 

        msg!("创建空账户的成本: {}", cost_of_empty_acc);
        // 890880

        Ok(())
    }
}

#[derive(Accounts)]
pub struct Initialize {}

如果我们想计算一个非空账户的费用,那么我们只需将字节数加入到空账户的费用中,如下所示:


use anchor_lang::prelude::*;
use anchor_lang::solana_program::rent as rent_module;

declare_id!("BfMny1VwizQh89rZtikEVSXbNCVYRmi6ah8kzvze5j1S");

#[program]
pub mod rent {
    use super::*;

    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
        let cost_of_empty_acc = rent_module:: ACCOUNT_STORAGE_OVERHEAD as f64 * 
                                rent_module::DEFAULT_LAMPORTS_PER_BYTE_YEAR as f64 *
                                rent_module::DEFAULT_EXEMPTION_THRESHOLD;

        msg!(...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论