Кратко
Программы, развёрнутые через loader-v3, могут быть обновлены, если назначен управляющий обновлением. Отзыв полномочий делает программу неизменяемой. Описан механизм обновления из 9 шагов, все 9 инструкций loader-v3, проверка сборки и 5 типов загрузчиков.
Развёртывание программ
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-аккаунта в Buffer с указанным владельцем. Не сработает, если уже инициализирован. |
Write | Записывает байты по заданному смещению в buffer-аккаунте. Необходима подпись владельца. |
DeployWithMaxDataLen | Создаёт новую программу: вычисляет адрес ProgramData, создаёт аккаунт ProgramData через CPI к System Program, проверяет и деплоит ELF из буфера, устанавливает состояние Program-аккаунта и помечает его как исполняемый. |
Upgrade | Заменяет байткод в существующем аккаунте ProgramData программы из буфера. |
SetAuthority | Меняет владельца Buffer- или ProgramData-аккаунта. Установка None для ProgramData делает программу неизменяемой. Для Buffer нельзя установить владельца None. |
SetAuthorityChecked | Аналогично SetAuthority, но требует, чтобы новый владелец также подписал транзакцию. |
Close | Закрывает buffer-, неинициализированный или ProgramData-аккаунт, переводя его лампорты получателю. При закрытии ProgramData также записывает tombstone Closed в кэш программы. Нельзя закрыть программу, развернутую в текущем slot. |
ExtendProgramChecked | Увеличивает выделение памяти для аккаунта ProgramData на дополнительные байты, оплачивая дополнительную rent с плательщика. |
Migrate | Мигрирует программу loader-v3 на loader-v4, передавая владение аккаунтом программы и копируя байткод. Требует подпись миграционного или upgrade-владельца программы. Loader-v4 ещё не выпущен в mainnet. |
Проверка программ
Solana поддерживает проверяемые сборки, которые позволяют пользователям убедиться, что байткод программы в блокчейне соответствует её открытому исходному коду. Фреймворк Anchor предоставляет встроенную поддержку проверяемых сборок.
Чтобы проверить статус верификации развернутой программы, найдите её идентификатор (program ID) в Solana Explorer или используйте CLI-инструмент Ellipsis Labs Solana Verifiable Build CLI для независимой проверки программ в блокчейне.
Загрузчики программ
| Загрузчик | Адрес | Возможность обновления | Описание |
|---|---|---|---|
| Встроенный загрузчик | NativeLoader1111111111111111111111111111111 | Только через обновление ПО validator | Владеет встроенными программами (System, Vote, Stake) и другими загрузчиками |
| BPF Loader (v1) | BPFLoader1111111111111111111111111111111111 | Нет (управление отключено) | Устаревшие программы |
| BPF Loader (v2) | BPFLoader2111111111111111111111111111111111 | Нет (управление отключено) | Устаревшие программы |
| BPF Loader Upgradeable | BPFLoaderUpgradeab1e11111111111111111111111 | Да, если назначен authority | Владеет всеми новыми развернутыми программами |
| Loader-v4 | LoaderV411111111111111111111111111111111111 | Да, если назначен authority | Пока не выпущен в основной сети |
Is this page helpful?