如何创建一个不可变的Solana程序

  • QuickNode
  • 发布于 2025-01-30 16:25
  • 阅读 19

本文详细介绍了如何在Solana平台上创建和部署一个不可变的程序,强调了不可变性的重要性及其实现步骤,包括使用Anchor框架、更新程序配置以及最终移除更新权限。文章结构清晰,包含了必要的操作命令和指引,适合开发者用于快速入门和实践。

概述

程序是 Solana 相当于智能合约的概念。Solana 程序默认为可变,因为它们可以被程序的“更新权限”更新,该公共密钥由程序部署者定义。在 Solana 程序中实现不可变性是一种标准最佳实践,因为它确保用户知道程序永远不会被恶意行为者更新或修改。在本指南中,你将部署一个本地 Solana Anchor 程序,并学习如何让它永久不可变。

TLDR

通过以下命令,使任何 Solana 程序不可变,移除更新权限:

solana program set-upgrade-authority <PROGRAM_ID> -u <YOUR_QUICKNODE_ENDPOINT> --final

警告 此过程是不可逆的。一旦你移除更新权限,程序将无法再更改。

你将做什么

  • 运行本地验证器
  • 使用 Anchor 部署 Solana 程序到你的本地计算机
  • 移除 Solana 程序的更新权限

你将需要的

或者:

使用 Anchor 将 Solana 程序部署到你的本地主机

在本节中,你将使用 Anchor 将 Solana 程序部署到你的本地主机(你可以使用相同的步骤将 Solana 程序部署到 Devnet 或 Mainnet)。

创建一个新的 Anchor 项目

对 Anchor 不熟悉?

Anchor 是一个流行的开发框架,用于在 Solana 上构建程序。 要入门,请查看我们的 Anchor 入门指南

在终端中创建一个新的项目目录,输入以下命令:

mkdir immutable-demo
cd immutable-demo

使用以下命令创建一个新的 Anchor 项目:

anchor init solana-immutable-program

因为我们只是测试如何更新程序的权限,所以不会更改 lib.rs 中的默认“初始化”程序。

更新程序配置

在部署程序之前,我们需要更新程序的配置。打开 Anchor.toml 文件,并将 provider.cluster 字段更新为 localhost

[provider]
cluster = "Localnet"
wallet = "~/.config/solana/id.json"

请双重检查你的钱包路径是否正确。你可以使用任何 .json 密钥(查看我们的 创建 Solana 自定义地址指南)。

继续构建你的程序。在终端中输入:

cd solana-immutable-program
anchor build

第一次构建可能需要几分钟。稍等片刻。

你应该会看到以下输出:

   Compiling anchor-lang v0.26.0
   Compiling solana-immutable-program v0.1.0 (~/immutable-demo/solana-immutable-program/programs/solana-immutable-program)
    warning: unused variable: `ctx`
        --> programs/solana-immutable-program/src/lib.rs:9:23
        |
        9 |     pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
        |                       ^^^ help: if this is intentional, prefix it with an underscore: `_ctx`
        |
        = note: `#[warn(unused_variables)]` on by default

        warning: `solana-immutable-program` (lib) generated 1 warning
    Finished release [optimized] target(s) in 1m 22s

关于警告无需担心,因为它们不会影响我们的演示内容。

很好,你现在有一个可以部署到本地主机的编译程序。

启动本地验证器

在部署程序之前,我们需要启动本地验证器。在另一个终端中,通过使用以下命令启动本地验证器:

solana-test-validator -r

-r 标志将在存在时将分类帐重置为创世块(而不是从先前实例恢复)

有关如何运行本地验证器的更多信息,请查看 Solana CLI 文档,或者在终端中输入以下命令以打开帮助菜单:

solana-test-validator --help

你应该会看到验证器开始产生区块:

本地验证器运行

设置你的 Solana CLI 配置

在部署程序之前,你需要将 Solana CLI 配置设置为 localhost 和在 Anchor.toml 中引用的相同钱包。你可以使用以下命令设置 Solana CLI 配置:

solana config set --url localhost --keypair ~/.config/solana/id.json

你应该会看到以下输出:

Config File: ~/.config/solana/cli/config.yml
RPC URL: http://localhost:8899
WebSocket URL: ws://localhost:8900/ (computed)
Keypair Path: ~/.config/solana/id.json
Commitment: confirmed

最后,让我们确保你的钱包在本地集群上有一些 SOL。你可以使用以下命令空投一些 SOL:

solana airdrop 100

注意:本地主机的空投不像 Devnet 和 Testnet 服务器那样有限制,因此你可以一次空投超过 1 或 2 个 SOL。

我们应该准备好了!现在将程序部署到本地主机。

部署程序

在你的本地验证器正在运行的情况下,你可以使用以下命令部署程序:

anchor deploy

你应该会看到以下输出:

quicknode solana-immutable-program % anchor deploy
Deploying workspace: http://localhost:8899
Upgrade authority: ~/.config/solana/id.json
Deploying program "solana-immutable-program"...
Program path: <PATH>/solana-immutable-program/target/deploy/solana-immutable-program.so...
Program Id: TESTxAHSs72DNFzhxmWhD9cVJjYqcgH2kHuDsq2NzEz

Deploy success

干得好!你已经成功将程序部署到本地主机。确保复制该程序 ID,因为我们在下一步中需要它。

移除 Solana 程序的更新权限

我们的程序当前是可变的。要将其更改为永久不可变,你可以使用以下命令移除更新权限(确保替换与前一步中复制的程序 ID):

solana program set-upgrade-authority <PROGRAM_ID> -u localhost --final

关于我们的命令,有几点需要注意:

  • PROGRAM_ID 是你要使其不可变的程序的程序 ID
  • -u localhost 将我们正在处理的集群的 URL 设置为 localhost(这与 --url localhost 标志相同)。如果你已经将 Solana CLI 配置设置为 localhost,则无需设置 URL。然而,在做出重大更改时,我们喜欢这样做,以确保我们在正确的集群上工作。
  • --final 是去除更新权限的标志(使程序不可变)

你应该会看到以下输出:

Account Type: Program
Authority: none

太棒了!你成功移除了 Solana 程序的更新权限,使其不可变。如果你想验证程序是否不可变,你可以尝试使用以下命令更新程序:

anchor upgrade --program-id <PROGRAM_ID> <PATH_TO/solana-immutable-program>

确保使用在前一步中使用的相同的程序 ID 以及正确的程序路径。

你应该会看到以下输出:

Error: Program <PROGRAM_ID> is no longer upgradeable
There was a problem deploying: Output { status: ExitStatus(unix_wait_status(256)), stdout: "", stderr: "" }.

你还可以使用 Solana Explorer 检查程序的权限。将你的 Program_ID 替换到以下 URL 中,并在浏览器中打开:

https://explorer.solana.com/address/<PROGRAM_ID>?cluster=custom&customUrl=http://localhost:8899

你应该会看到程序的“可升级”字段被设置为“否”:

程序权限

使用 QuickNode 部署到 Mainnet

准备好后,你可以将相同的步骤应用到 Mainnet 上的程序。请小心!一旦你移除了程序的更新权限,它就不可变。删除更新权限后,你无法再更新程序。

将程序部署到 mainnet 是一个密集的过程——如果你希望实现 8 倍更快的响应时间,可以将繁重的工作交给我们处理。

查看为什么超过 50% 的 Solana 项目选择 QuickNode,并在 这里 注册一个免费账户。要在本指南中使用你的 QuickNode 端点,只需在 -u 和 --url 标志中将 localhost 替换为你的 QuickNode 端点,例如:

solana program set-upgrade-authority <PROGRAM_ID> -u <YOUR_QUICKNODE_ENDPOINT> --final

总结

干得好!你已成功将不可变的 Solana 程序部署到本地主机。你可以在验证器终端中输入 ctrl (或 cmd) + c 关闭本地验证器。

有问题了吗?或者只是想分享你正在做的事情?在 QuickNode DiscordTwitter 与我们联系,我们将乐意帮助你!

我们 ❤️ 反馈!

如果你对本指南有任何反馈或问题,请在此告知我们! 我们很乐意听取你的意见!

  • 原文链接: quicknode.com/guides/sol...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。