Solana 程序通过 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 时自动执行。
对于习惯 Solidity 的开发者来说,Solana 程序没有构造函数可能显得反常。Rust 本身没有传统意义上的类或对象,因此 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...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!