Развертывание программ
Это руководство предполагает знание следующих тем:
Loader-v3 и Loader-v4
В настоящее время происходит переход с loader-v3 (подкоманда program) на loader-v4 (подкоманда program -v4), так как loader-v3 устаревает.
Для новых развертываний используйте solana program-v4 deploy
вместо
solana program deploy
.
Для миграции существующей программы (что по сути является повторным развертыванием):
solana program migrate ./target/deploy/your_program-keypair.json
Подготовка
Сначала программу необходимо собрать (скомпилировать, связать, очистить).
cargo +solana build --target sbpf-solana-solana --release
Этот шаг должен выполняться перед каждым повторным развертыванием или первичным развертыванием.
Проверьте, что на аккаунте плательщика по умолчанию достаточно средств пропорционально размеру исполняемого файла:
du -h ./target/deploy/your_program.sosolana balance
Кроме того, каждая программа имеет аккаунт программы и ID программы, который является адресом этого аккаунта программы. Следующая команда генерирует keypair для аккаунта программы:
solana-keygen new -o ./target/deploy/your_program-keypair.json
Это нужно выполнить только один раз для каждой программы, и keypair будет повторно использоваться для повторных развертываний той же программы в дальнейшем.
Инструментарий содержал сокращенный путь, однако он постепенно выводится из эксплуатации / устаревает:
cargo-build-sbf
Первоначальное развертывание
Теперь исполняемый файл можно загрузить в аккаунт программы:
Loader-v3
Параметр называется program-id
, хотя он ожидает путь к файлу keypair:
solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json
Loader-v4
solana program-v4 deploy ./target/deploy/your_program.so --program-keypair ./target/deploy/your_program-keypair.json
Повторное развертывание
Загрузка другого исполняемого файла в тот же аккаунт программы снова перезапишет / заменит его. Однако для повторных развертываний требуется только ID программы (pubkey программного keypair), а не весь keypair, поскольку подписывающим является keypair с правами на обновление.
Loader-v3
Это точно так же, как и первоначальное развертывание:
solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json
Если старый исполняемый файл был короче нового, может потребоваться сначала увеличить аккаунт programdata:
solana program extend ./target/deploy/your_program.so <ADDITIONAL_BYTES>
Loader-v4
Обратите внимание, что при первоначальном развертывании использовался
program-keypair
, в то время как при повторном развертывании используется
program-id
:
solana program-v4 deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json
Приоритизация загрузки
В периоды перегрузки сети вы можете использовать несколько дополнительных флагов, которые помогут при развертывании программы:
--with-compute-unit-price
: установка цены вычислительной единицы для транзакции, с шагом 0.000001 lamports (микро-lamports) за вычислительную единицу. Используйте API приоритетных комиссий от Helius для получения оценки приоритетной комиссии.--use-rpc
: отправка транзакций записи на настроенный RPC вместо validator TPUs. Этот флаг требует взвешенного по стейку RPC-соединения, такого как Helius или Triton. Этот флаг также можно настроить по умолчанию с помощью:solana config set --url <RPC_URL>
.--max-sign-attempts
: максимальное количество попыток подписать или переподписать транзакции после истечения срока действия blockhash. Если какие-либо транзакции, отправленные во время развертывания программы, все еще не подтверждены после истечения срока действия изначально выбранного недавнего blockhash, эти транзакции будут переподписаны с новым недавним blockhash и отправлены повторно. Используйте этот параметр для настройки максимального количества итераций подписания транзакций. Каждый blockhash действителен примерно 60 секунд, что означает, что использование значения по умолчанию 5 приведет к отправке транзакций в течение как минимум 5 минут или до тех пор, пока все транзакции не будут подтверждены, в зависимости от того, что наступит раньше.
Возобновление загрузки
Возможно, что загрузка застрянет или будет прервана.
Loader-v3
Если развертывание программы не удается, останется висящий промежуточный
буферный аккаунт с ненулевым балансом. Чтобы вернуть этот баланс, вы можете
возобновить неудавшееся развертывание, предоставив тот же промежуточный буфер
для нового вызова deploy
.
При сбоях развертывания будет выведено сообщение об ошибке с указанием seed-фразы, необходимой для восстановления keypair сгенерированного промежуточного буфера:
==================================================================================Recover the intermediate account's ephemeral keypair file with`solana-keygen recover` and the following 12-word seed phrase:==================================================================================valley flat great hockey share token excess clever benefit traffic avocado athlete==================================================================================To resume a deploy, pass the recovered keypair asthe [BUFFER_SIGNER] to `solana program deploy` or `solana program write-buffer'.Or to recover the account's lamports, pass it as the[BUFFER_ACCOUNT_ADDRESS] argument to `solana program drain`.==================================================================================
Чтобы восстановить keypair:
solana-keygen recover -o ./target/deploy/buffer-keypair.json
Когда вас попросят, введите 12-словную seed-фразу.
Затем выполните новую команду deploy
и укажите буфер:
solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json --buffer ./target/deploy/buffer-keypair.json
Loader-v4
Возможно возобновить загрузку с указанного байтового смещения:
solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json --start-offset <BYTES_UPLOADED_SO_FAR>
Финализация
Это необратимое действие.
Программу можно сделать неизменяемой, удалив ее полномочия на обновление.
Loader-v3
solana program set-upgrade-authority ./target/deploy/your_program-keypair.json --final
Loader-v4
solana program finalize --program-id ./target/deploy/your_program-keypair.json
Вместо перезаписи программ также возможно предоставить пользователям выбор, какую версию программы они хотят использовать, построив связанный список финализированных программ:
solana program finalize --program-id ./target/deploy/your_program-keypair.json --next-version ../your_newer_program/target/deploy/your_newer_program-keypair.json
Закрытие
Для программ, развернутых с использованием loader-v3, можно вернуть только их аккаунт programdata, буферные аккаунты и средства, заблокированные в них. Аккаунт программы вместе с идентификатором программы и средствами, заблокированными конкретно в аккаунте программы, остаются недоступными.
Программы, развернутые с использованием loader-v4, могут быть закрыты вместе с их программным аккаунтом, при этом их program ID и заблокированные средства снова становятся доступными для других целей.
Loader-v3
Это необратимое действие для программ, развернутых с использованием loader-v3.
Обратите внимание, что после закрытия программы ее program ID не может быть использован повторно. Попытка развернуть программу с ранее закрытым program ID приведет к ошибке. Если вам нужно повторно развернуть программу после ее закрытия, вы должны сгенерировать новый файл keypair программы.
Чтобы закрыть один аккаунт programdata:
solana program close ./target/deploy/your_program-keypair.json
Чтобы закрыть все буферные аккаунты, связанные с текущими правами доступа:
solana program close --buffers
Loader-v4
solana program-v4 close --program-id ./target/deploy/your_program-keypair.json
Просмотр метаданных
Подкоманда show
отображает метаданные программы.
Пример вывода выглядит так:
Program Id: 3KS2k14CmtnuVv2fvYcvdrNgC94Y11WETBpMUGgXyWZLOwner: BPFLoaderUpgradeab1e11111111111111111111111ProgramData Address: EHsACWBhgmw8iq5dmUZzTA1esRqcTognhKNHUkPi4q4gAuthority: FwoGJNUaJN2zfVEex9BB11Dqb3NJKy3e9oY3KTh9XzCULast Deployed In Slot: 63890568Data Length: 5216 (0x1460) bytes
Program Id
- это адрес, который можно указать в полеprogram_id
инструкции при вызове программы.Owner
: загрузчик, с помощью которого была развернута эта программа.ProgramData Address
- это аккаунт programdata, связанный с аккаунтом программы, который содержит исполняемый код программы (только для loader-v3).Status
:retracted
,deployed
илиfinalized
(только для loader-v4).Authority
- это полномочия на обновление программы.Last Deployed In Slot
- это slot, в котором программа была развернута в последний раз.Data Length
- это размер пространства, зарезервированного для развертываний. Фактическое пространство, используемое текущей развернутой программой, может быть меньше.
Loader-v3
Для просмотра определенной программы:
solana program show ./target/deploy/your_program-keypair.json
Для просмотра списка программ, развернутых с правами доступа по умолчанию:
solana program show --programs
Чтобы показать все буферные аккаунты независимо от прав доступа:
solana program show --buffers --all
Чтобы указать другие права доступа:
solana program show --programs --buffer-authority ~/.config/solana/authority-keypair.jsonsolana program show --buffers --buffer-authority ~/.config/solana/authority-keypair.json
Loader-v4
Чтобы просмотреть конкретную программу:
solana program-v4 show --program-id ./target/deploy/your_program-keypair.json
Чтобы просмотреть список программ, развернутых с использованием владельца по умолчанию:
solana program-v4 show --all
Чтобы просмотреть список программ, развернутых с использованием определенного владельца:
solana program-v4 show --authority ~/.config/solana/authority-keypair.json
Загрузка исполняемого файла
Иногда полезно загрузить и сравнить программу, чтобы убедиться, что она содержит известный исполняемый файл. Загруженный файл можно обрезать, хешировать и сравнить с хешем исходного файла программы.
Loader-v3
solana program dump ./target/deploy/your_program-keypair.json ./target/deploy/your_program.so
Loader-v4
solana program download ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json
Продвинутый уровень: передача прав владения
Право изменять программу принадлежит ее владельцу. Это право можно передать другому keypair без изменения keypair программы, так что идентификатор программы останется прежним. Кроме того, один владелец может контролировать несколько аккаунтов программ.
Если владелец не указан явно при первоначальном развертывании, то в качестве владельца используется keypair по умолчанию. Именно поэтому повторное развертывание программы в шагах выше не требовало явного указания владельца.
Явное указание владельца полезно для офлайн-подписания и программ, управляемых несколькими организациями.
Сначала необходимо сгенерировать keypair для владельца:
solana-keygen new -o ~/.config/solana/authority-keypair.json
Loader-v3
Владелец может быть указан во время развертывания:
solana program deploy ./target/deploy/your_program.so --upgrade-authority ~/.config/solana/authority-keypair.json
Или после развертывания с использованием keypair по умолчанию в качестве текущего владельца:
solana program set-upgrade-authority ./target/deploy/your_program-keypair.json --new-upgrade-authority ~/.config/solana/authority-keypair.json
Или после развертывания с указанием текущего владельца:
solana program set-upgrade-authority ./target/deploy/your_program-keypair.json --upgrade-authority ~/.config/solana/authority-keypair.json --new-upgrade-authority ~/.config/solana/new_authority-keypair.json
Loader-v4
Права доступа можно указать во время развертывания:
solana program-v4 deploy ./target/deploy/your_program.so --program-keypair ./target/deploy/your_program-keypair.json --authority ~/.config/solana/authority-keypair.json
Или после развертывания, используя keypair по умолчанию в качестве текущего владельца:
solana program-v4 transfer-authority --program-id ./target/deploy/your_program-keypair.json --new-authority ~/.config/solana/authority-keypair.json
Или после развертывания с указанием текущего владельца:
solana program-v4 transfer-authority --program-id ./target/deploy/your_program-keypair.json --authority ~/.config/solana/authority-keypair.json --new-authority ~/.config/solana/new_authority-keypair.json
Продвинутый уровень: двухэтапное повторное развертывание с использованием буфера
Вместо загрузки непосредственно в аккаунт программы, исполняемый файл можно сначала загрузить в промежуточный буферный аккаунт, а затем перенести в аккаунт программы на втором этапе (фактическое повторное развертывание). Это полезно для офлайн-подписания и программ, управляемых несколькими организациями, например, при голосовании DAO за принятие или отклонение загруженного исполняемого файла перед фактическим повторным развертыванием.
Имейте в виду, что использование буферных аккаунтов примерно вдвое увеличивает количество средств, необходимых в процессе загрузки, поскольку два аккаунта одновременно содержат по одному исполняемому файлу.
Сначала необходимо создать keypair для буферного аккаунта:
solana-keygen new -o ~/.config/solana/buffer-keypair.json
Буферный аккаунт можно повторно использовать для различных загрузок, и он не привязан к какому-либо конкретному аккаунту программы.
Loader-v3
solana program write-buffer ./target/deploy/your_program.so --buffer ~/.config/solana/buffer-keypair.jsonsolana program deploy --program-id ./target/deploy/your_program-keypair.json --buffer ~/.config/solana/buffer-keypair.json
Loader-v4
solana program-v4 deploy ./target/deploy/your_program.so --buffer ~/.config/solana/buffer-keypair.jsonsolana program-v4 deploy --program-id ./target/deploy/your_program-keypair.json --buffer ~/.config/solana/buffer-keypair.json
Продвинутый уровень: офлайн-подписание
Некоторые модели безопасности требуют разделения процесса подписания и трансляции транзакций, чтобы ключи подписи могли быть полностью отключены от любой сети, что также известно как офлайн-подписание.
Обратите внимание, что только повторные развертывания могут выполняться в офлайн-режиме. Первоначальное развертывание программы должно выполняться с онлайн-устройства, и только последующие повторные развертывания программы могут использовать офлайн-подписание.
Типичная настройка состоит из двух разных подписывающих сторон:
- онлайн-подписант (плательщик комиссии и владелец буферного аккаунта)
- офлайн-подписант (владелец аккаунта программы)
Общий процесс представляет собой двухэтапное повторное развертывание с некоторыми дополнениями:
- (онлайн) создать новую программу
- (онлайн) передать полномочия офлайн-подписанту
- (онлайн) создать буфер и загрузить в него исполняемый файл
- (опционально) проверить содержимое буфера в блокчейне
- (офлайн) подписать транзакцию для повторного развертывания программы с
использованием буфера
--blockhash <VALUE> --sign-only
- (онлайн) использовать эту подпись для трансляции транзакции повторного
развертывания
--blockhash <VALUE> --signer <OFFLINE_SIGNER_PUBKEY>:<OFFLINE_SIGNER_SIGNATURE>
Найдите недавний blockhash
и вставьте его для генерации подписи
офлайн-транзакции. Срок действия blockhash
истекает примерно через 60 секунд.
Если вы не успели вовремя - просто получите другой свежий хеш и повторяйте пока
не добьетесь успеха, или рассмотрите возможность использования долговечных nonce
транзакций.
Is this page helpful?