【问题标题】:Solana Program Executable Data AccountSolana 程序可执行数据帐户
【发布时间】:2021-11-12 20:39:02
【问题描述】:

我目前正在学习使用 Rust 进行 Solana 开发。

我试图了解为什么我们有一个程序帐户和一个程序可执行数据帐户。我已经知道 Program Account 包含对 Program Executable Data Account 的引用,而后者包含实际代码。

我的问题是为什么我们必须将程序帐户中的实际代码拆分到一个单独的帐户中?我最初的想法是:

  1. 也许这与能够升级您的程序代码有关。也许当您升级程序时,会创建一个新的可执行数据帐户并更新程序帐户中的引用。

情况并非如此,因为在升级程序后,可执行数据帐户的引用(地址)是相同的。

  1. 可能这与帐户所有权有关。也许一个帐户归开发者所有,另一个帐户归 BPF 计划所有。

事实并非如此,因为这两个帐户都归 BPF 计划所有,而开发者只是升级机构

为什么一个程序需要 2 个帐户?为什么不将实际代码存储在程序帐户的数据槽中?

我希望这是有道理的。

【问题讨论】:

    标签: solana


    【解决方案1】:

    我不能 100% 确定这是否是原因,但这可能与程序帐户的不变性有关。运行时强制程序帐户是完全不可变的,但是当您升级程序时,数据当然会发生变化。通过将其全部放在一个单独的更新帐户中,您可以绕过该限制。

    如果原始帐户指向不同的数据帐户,并且我们在升级时交换了数据帐户,则运行时强制将中断,因为公钥会被修改。

    【讨论】:

    • 这很有道理,如果有经验的人能证实这一点,那就太好了!
    【解决方案2】:

    程序帐户(密钥)是程序可执行文件的地址。 Program 可执行文件是 BPF 代码所在的位置,并且它是不可变的,除非所有者使用可升级的 BPF 加载器部署:

    solana program deploy ... 所有者可以使用相同的地址升级程序

    solana deploy ... 当您升级时,您使用的是不同的地址。这意味着原始程序仍然存在。我相信正在考虑删除这种部署方法

    无论您以何种方式部署,该程序都不包含任何其他数据,当然它也不能修改自己的程序字节码。然而;当用户帐户被创建时,程序可以对用户帐户的数据进行操作,程序 ID 为“所有者”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 2022-10-24
      • 2022-11-10
      • 2022-11-12
      • 2022-07-31
      • 1970-01-01
      • 2022-07-13
      相关资源
      最近更新 更多