Solana 学习开发之旅

2025年04月03日更新 36 人订阅
原价: ¥ 28 限时优惠
专栏简介 【Solana】使用 CLI 创建 SPL 标准的 Token 以及基础使用 【Solana】完善 SPL Token 名称和 Logo 【Solana】创建 SPL 标准的 NFT 以及完善 metadata 【Solana】一些基本的js脚本 【Solana】Anchor 框架使用笔记 【Solana】Anchor 示例:通过 CPI 实现 Sol 转账与手续费收取 Solana Hello World: 安装与开发指南 Solana 与 Rust 算术入门—从 Solidity 到 Anchor Solana Anchor 程序接口定义语言(IDL) Solana Anchor 框架下的 Require 与自定义错误 Solana 程序:支持升级与无构造函数实现 Solidity 开发者必知的 Rust 语法基础 Rust 的独特语法解析 Rust 类函数宏解析 Rust 结构体、属性宏与自定义派生宏 Rust 与 Solana 中的可见性及模块化复用 Solana 中的时钟与其他区块变量 Solana 系统变量详解 Solana 日志、事件日志与历史交易查询 Solana 中的Tx.origin、msg.sender 和 onlyOwner Solana 计算单元与交易费用概述 Solana 与 Anchor 中的账户初始化 Solana 计数器教程:账户数据的读写 使用 Solana Web3.js 和 Anchor 读取账户数据 在 Solana 中实现映射表与嵌套映射表 Solana 存储成本、最大容量与账户调整 在 Anchor 中读取账户余额:Solana 的 address(account).balance Solana 中的函数修饰符与 Fallback 函数:为何不存在 Solana 中的 SOL 转移与分割:取代 msg.value 的设计 使用不同签名者修改账户:Solana 中的权限控制 PDA 与密钥对账户:Solana 中的地址与权限模型 Anchor 中的 init_if_needed 与重新初始化攻击防范 Solana 中的 Multicall:批处理交易和交易大小的限制 Solana 中的 Owner 和 Authority 删除和关闭 Solana 中的账户和程序 在 Anchor 中的 #[derive(Accounts)] 不同类型的账户 在链上读取另一个 Anchor 程序的账户数据 Anchor 中的跨程序调用

Solana 程序:支持升级与无构造函数实现

  • 0xE
  • 发布于 2025-03-22 09:23
  • 阅读 1306

Solana 程序通过 Anchor 部署无需构造函数,默认可升级且可转为不可变,简化了状态管理与升级流程。

Anchor 初始化与程序部署

当你运行 anchor init deploy_tutorial 时,Anchor 会生成一个默认的测试文件:

describe("deploy_tutorial", () => {
  // Configure the client to use the local cluster.
  anchor.setProvider(anchor.AnchorProvider.env());

  const program = anchor.workspace.DeployTutorial as Program<DeployTutorial>;

  it("Is initialized!", async () => {
    // Add your test here.
    const tx = await program.methods.initialize().rpc();
    console.log("Your transaction signature", tx);
  });
});

对应的程序代码如下:

use anchor_lang::prelude::*;

declare_id!("A5Y9992TvbUD8Q7bmaCY9j9wztwgcFweUBV5y1JXEyjo");

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

    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
        msg!("Greetings from: {:?}", ctx.program_id);
        Ok(())
    }
}

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

那么,这个程序究竟在何时何地被部署呢?

乍看之下,测试文件中的这行代码似乎与部署有关:

const program = anchor.workspace.DeployTutorial as Program<DeployTutorial>;

但这显然不是部署的实际位置,因为它只是定义了一个程序实例,而非异步部署操作。实际上,Anchor 在后台默默完成了程序的部署工作,通常在运行 anchor test 时自动执行。

Solana 程序没有构造函数

对于习惯 Solidity 的开发者来说,Solana 程序没有构造函数可能显得反常。Rust 本身没有传统意义上的类或对象,因此 Solana 程序的部署逻辑也与以太坊智能合约截然不同。

在以太坊中,构造函数用于初始化存储、设置字节码或定义不可变变量。而在 Solana 中,“部署步骤”又是如何实现的呢?

手动部署 Solana 程序

让我们通过一个实验来验证部署过程。创建一个名为 deploy 的新 Anchor 项目,并确保在后台运行 solana-test-validator 和 solana logs。

运行 anchor build 编译程序后,跳过 anchor test,直接在终端执行:

anchor deploy

输出日志如下:


Transaction executed in slot 465:
  Signature: 5SNBgNimNvRQRanTXrriHoWsmXmu1NFtXLqGU4KLRGuAFeQApvbZPbGCifAffbkCpB7V94hh3gvHrkYy5ozMFUtX
  Status: Ok
  Log Messages:
    Program 11111111111111111111111111111111 invoke [1]
    Program 1111111111111111111111111...

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

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

0 条评论

请先 登录 后评论