Solana 学习开发之旅

2025年04月03日更新 39 人订阅
原价: ¥ 28 限时优惠
专栏简介

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

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

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 条评论

请先 登录 后评论