`solana deploy` 和 `solana program deploy` 的区别

Difference bewteen `solana deploy` and `solana program deploy`

我目前正在学习使用 Rust 进行 Solana 开发。我遵循了 hello-world 教程,想知道 运行 solana deploysolana program deploy.

之间有什么区别

我都使用 Solana Devnet 集群进行了测试。

Result of running solana deploy.

Result of running solana program deploy.

我的直觉告诉我 solana deploy 正在创建一个简单的 Solana 帐户,而另一个正在创建一个程序帐户。如果无法在其上调用交易,那么使用程序创建一个简单的 Solana 账户有什么意义?

我不确定确切的区别是什么,但我可以说 solana deploy 不会创建一个简单的 Solana 帐户。 因为你可以看到solana deploy部署的你账户的executable字段是YesAssigned Program Id字段是BPF Loader 2BPF Loader可以看作是其他编程语言的编译器,非程序账号的账号没有BPF Loader赋值。 我也会调查具体的区别。

它们都用于部署程序,但 solana program deploy 通常是推荐的路线。

solana deploy 是旧形式,使用 BPF Loader 2 来部署程序。以这种方式部署的程序永远是不可变的。 SPL 令牌程序使用此加载器:https://explorer.solana.com/address/TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA

solana program deploy 是较新的形式,并使用 Upgradeable BPF Loader 来部署程序。如果设置了升级权限,使用此加载程序的程序可以选择升级。否则,如果使用 --final 标志部署,它们也可以是不可变的,与旧的 solana deploy 相同。 SPL 权益池程序使用此加载器:https://explorer.solana.com/address/SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy

solana deploy 使用旧的 BPF 加载器,即 BPFLoader2111111111111111111111111111111111。它不允许更新已部署的程序。只要程序地址不同(提供或随机生成),它就允许同一程序的多次部署。

只要未提供 --final 标志,

solana program deploy 允许将同一(或其他程序)多次部署到同一地址。它使用 BPFLoaderUpgradeab1e11111111111111111111111 加载程序。

此外,solana deploy 使用程序 ID 标识的帐户存储程序二进制文件,而 solana program deploy 使用单独的帐户存储程序的二进制内容。

solana program deploy 的情况下,程序帐户和程序数据帐户都属于 BPF 加载程序 (BPFLoaderUpgradeab1e11111111111111111111111)。