#solana
Вопрос:
В настоящее время я изучаю разработку Solana с помощью Rust.
Я пытаюсь понять, почему у нас есть Учетная запись Программы и Учетная запись исполняемых данных программы. Я уже знаю, что Учетная запись Программы содержит ссылку на Учетную запись исполняемых данных программы, и что последняя содержит фактический код.
Мой вопрос в том, почему мы должны разделить фактический код из учетной записи Программы на отдельную учетную запись? Мои первоначальные мысли были:
- Возможно, это связано с возможностью обновления программного кода. Возможно, при обновлении вашей программы создается новая учетная запись исполняемых данных и обновляется ссылка в учетной записи программы.
Это не так, поскольку после обновления программы ссылка (адрес) на учетную запись исполняемых данных остается прежней.
- Возможно, это связано с владением учетными записями. Возможно, одна учетная запись принадлежит разработчику, а другая-программе BPF.
Это не так, потому что обе учетные записи принадлежат программе BPF, а разработчик является всего лишь органом по обновлению
Зачем нам нужны 2 учетные записи для программы? Почему бы не сохранить фактический код в слоте данных учетной записи Программы?
Я надеюсь, что в этом есть смысл.
Ответ №1:
Я не уверен на 100%, что это причина, но это может быть связано с неизменностью учетных записей программ. Среда выполнения обеспечивает, чтобы учетные записи программ были полностью неизменяемыми, но при обновлении программы данные, конечно, меняются. Поместив все это в отдельную обновленную учетную запись, вы сможете обойти это ограничение.
Если исходная учетная запись указывала на другую учетную запись данных, и мы поменяли учетные записи данных при обновлении, то принудительное исполнение во время выполнения нарушится, так как открытый ключ будет изменен.
Комментарии:
1. Это имеет смысл, было бы неплохо, если бы кто-нибудь более опытный мог это подтвердить!
Ответ №2:
Учетная запись программы (ключ) — это адрес исполняемого файла Программы. Исполняемый файл программы находится там, где находится код BPF, и он неизменен, если владелец не развернут с помощью обновляемого загрузчика BPF:
solana program deploy ...
Владелец может обновить программу, используя тот же адрес
против
solana deploy ...
При обновлении вы используете другой адрес. Это означает, что исходная программа все еще существует. Я полагаю, что этот подход к развертыванию рассматривается на предмет удаления
Каким бы способом вы ни развертывали Программу, она не содержит никаких других данных и, конечно, не может изменять свой собственный байтовый код программы. Однако Программы могут работать с данными учетных записей пользователей, если учетная запись пользователя была создана с идентификатором программы «владелец».