Резюме
Программы, развернутые через loader-v3, могут быть обновлены, если установлен авторитет обновления. Отзыв авторитета делает программу неизменяемой. Охватывает механизм обновления, инструкции развертывания и обновления loader-v3, верификацию сборки и доступные программы-загрузчики.
Развёртывание программ
Native Rust
Развёртывание с помощью Solana CLI с solana program deploy.
Anchor
Развёртывание с помощью фреймворка Anchor с anchor deploy.
Обновление программ
Чтобы обновить программу, аккаунт должен обладать полномочиями управляющего
обновлением (обычно это аккаунт, который изначально
развёрнул программу). Во время развёртывания или
обновления новый байткод загружается во временный буферный аккаунт, затем
записывается в аккаунт programdata. Назначение управляющего обновлением
None делает программу неизменяемой и навсегда предотвращает дальнейшие
обновления.
Механизм обновления
Когда
UpgradeableLoaderInstruction::Upgrade
обрабатывается, рантайм:
- Проверяет, что аккаунт Program доступен для записи и принадлежит loader-v3.
- Проверяет, что Buffer аккаунт содержит состояние
Bufferс правильными полномочиями. - Проверяет, что аккаунт ProgramData с
upgrade_authority_addressсовпадает и не являетсяNone. - Проверяет, что программа не была уже развёрнута в текущем слоте
(
clock.slot != slot). - Загружает и проверяет новые ELF-байты из буфера.
- Копирует новый байткод из буфера в аккаунт ProgramData и обнуляет оставшиеся байты.
- Обеспечивает аккаунт ProgramData арендной неуязвимостью.
- Опустошает буферный аккаунт (устанавливает lamports в 0) и обрезает его данные.
- Новая версия вступает в силу в следующем слоте (
deployment_slot + 1).
Сам аккаунт Program (его состояние и указатель programdata_address) не
изменяется во время обновления. Обновляются только байткод аккаунта
ProgramData и метаданные slot.
Справочник инструкций Loader-v3
Loader-v3 (BPF Loader Upgradeable) — это текущий загрузчик по умолчанию для деплоя программ в Solana.
| Инструкция | Описание |
|---|---|
InitializeBuffer | Устанавливает состояние аккаунта буфера в Buffer с указанным авторитетом. Завершается неудачей, если уже инициализирован. |
Write | Записывает байты по указанному смещению в аккаунте буфера. Авторитет должен подписать. |
DeployWithMaxDataLen | Создает новую программу: выводит адрес ProgramData, создает аккаунт ProgramData через CPI к System Program, верифицирует и развертывает ELF из буфера, устанавливает состояние аккаунта программы и помечает его как исполняемый. |
Upgrade | Заменяет байткод в аккаунте ProgramData существующей программы из буфера. |
SetAuthority | Изменяет авторитет аккаунта Buffer или ProgramData. Установка в None для ProgramData делает программу неизменяемой. Авторитет буфера не может быть установлен в None. |
SetAuthorityChecked | Как SetAuthority, но требует, чтобы новый авторитет также подписал транзакцию. |
Close | Закрывает аккаунт буфера, неинициализированный или ProgramData аккаунт, переводя его lamport получателю. Закрытие ProgramData также записывает надгробие Closed в кеш программы. Невозможно закрыть программу, развернутую в текущем слоте. |
ExtendProgramChecked | Расширяет выделение аккаунта ProgramData на дополнительные байты, финансируя дополнительную ренту от плательщика. |
Проверка программ
Solana поддерживает верифицируемые сборки, которые позволяют пользователям подтвердить, что ончейн-байткод программы соответствует ее публичному исходному коду. Фреймворк Anchor предоставляет встроенную поддержку верифицируемых сборок.
Чтобы проверить статус верификации развернутой программы, найдите её program ID в Solana Explorer или используйте Solana Verifiable Build CLI от Ellipsis Labs для независимой верификации onchain-программ.
Загрузчики программ
| Загрузчик | Адрес | Обновляемый | Описание |
|---|---|---|---|
| Native Loader | NativeLoader1111111111111111111111111111111 | Только через обновление ПО validator | Владеет встроенными программами (System, Vote, Stake) и другими загрузчиками |
| BPF Loader (v1) | BPFLoader1111111111111111111111111111111111 | Нет (управление загрузчиком отключено) | Устаревшие программы |
| BPF Loader (v2) | BPFLoader2111111111111111111111111111111111 | Нет (управление загрузчиком отключено) | Устаревшие программы |
| BPF Loader Upgradeable | BPFLoaderUpgradeab1e11111111111111111111111 | Да, если установлен upgrade authority | Владеет всеми недавно развернутыми программами |
Is this page helpful?