本文详细介绍了如何在Solana平台上创建和部署一个不可变的程序,强调了不可变性的重要性及其实现步骤,包括使用Anchor框架、更新程序配置以及最终移除更新权限。文章结构清晰,包含了必要的操作命令和指引,适合开发者用于快速入门和实践。
程序是 Solana 相当于智能合约的概念。Solana 程序默认为可变,因为它们可以被程序的“更新权限”更新,该公共密钥由程序部署者定义。在 Solana 程序中实现不可变性是一种标准最佳实践,因为它确保用户知道程序永远不会被恶意行为者更新或修改。在本指南中,你将部署一个本地 Solana Anchor 程序,并学习如何让它永久不可变。
TLDR
通过以下命令,使任何 Solana 程序不可变,移除更新权限:
solana program set-upgrade-authority <PROGRAM_ID> -u <YOUR_QUICKNODE_ENDPOINT> --final
警告 此过程是不可逆的。一旦你移除更新权限,程序将无法再更改。
或者:
在本节中,你将使用 Anchor 将 Solana 程序部署到你的本地主机(你可以使用相同的步骤将 Solana 程序部署到 Devnet 或 Mainnet)。
对 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 配置设置为 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,因为我们在下一步中需要它。
我们的程序当前是可变的。要将其更改为永久不可变,你可以使用以下命令移除更新权限(确保替换与前一步中复制的程序 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
你应该会看到程序的“可升级”字段被设置为“否”:
准备好后,你可以将相同的步骤应用到 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 Discord 或 Twitter 与我们联系,我们将乐意帮助你!
如果你对本指南有任何反馈或问题,请在此告知我们! 我们很乐意听取你的意见!
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!