Документация SolanaРазработка программ

Развёртывание программ

В этом руководстве предполагается знание следующих тем:

ЗадачаКоманда
Сборка программыcargo build-sbf
Развернуть новую программуsolana program deploy <path_to_program.so>
Обновить существующую программуsolana program deploy <path_to_program.so> (то же, что и развертывание)
Показать информацию о программеsolana program show <program-id>
Передать права на программуsolana program set-upgrade-authority <program-id> --new-upgrade-authority <path_to_keypair>
Сделать программу неизменяемойsolana program set-upgrade-authority <program-id> --final
Закрыть программуsolana program close <program-id> --bypass-warning
Проверить баланс кошелькаsolana balance
Запросить airdrop (devnet/localhost)solana airdrop 2

В настоящее время происходит переход от 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.so
solana balance

Кроме того, каждая программа имеет аккаунт программы и ID программы, который является адресом этого аккаунта программы. Следующая команда создаёт keypair для аккаунта программы:

solana-keygen new -o ./target/deploy/your_program-keypair.json
Terminal
$
solana-keygen new

По умолчанию создаётся keypair по адресу ~/.config/solana/id.json.

cargo-build-sbf

Первоначальное развёртывание

Теперь исполняемый файл можно загрузить в аккаунт программы:

Выберите, в каком кластере Solana развернуть программу. Используйте команду solana config get, чтобы проверить текущую конфигурацию:

Terminal
$
solana config get
solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json
Terminal
$
solana config set --url mainnet-beta
$
solana config set --url devnet
$
solana config set --url localhost
$
solana config set --url testnet
$
solana config set --url "https://your-rpc-url.com"
solana program-v4 deploy ./target/deploy/your_program.so --program-keypair ./target/deploy/your_program-keypair.json

Повторное развертывание

Загрузка другого исполняемого файла в тот же аккаунт программы снова перезапишет / заменит его. Однако для повторного развертывания требуется только идентификатор программы (pubkey аккаунта ключей программы), а не весь keypair, так как подписывающим является keypair полномочий на обновление.

Loader-v3

Для devnet или localhost пополните кошелёк с помощью команды solana airdrop:

Terminal
$
solana airdrop 2

Если старый исполняемый файл был короче нового, может потребоваться сначала увеличить аккаунт programdata:

Terminal
$
solana balance

Loader-v4

Обратите внимание, что при первоначальном развертывании использовался program-keypair, а при повторном развертывании используется program-id:

solana program-v4 deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json

Приоритет загрузки

Для сборки программы используйте команду cargo build-sbf:

Terminal
$
cargo build-sbf

Возобновление загрузки

Загрузка может быть прервана или остановлена.

Loader-v3

Если развертывание программы завершилось неудачей, останется зависший промежуточный буферный аккаунт с ненулевым балансом. Чтобы вернуть этот баланс, вы можете возобновить неудачное развертывание, предоставив тот же промежуточный буфер для нового вызова deploy.

Чтобы восстановить keypair:

Соберите свою программу с помощью команды cargo build-sbf:

Terminal
$
cargo build-sbf

В результате будут созданы два важных файла в target/deploy/:

  1. hello_world-keypair.json: Файл keypair, публичный ключ которого будет использоваться как Program ID
  2. hello_world.so: Скомпилированный исполняемый файл программы
solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json --start-offset <BYTES_UPLOADED_SO_FAR>

Завершение

Это действие необратимо.

Программа может быть сделана неизменяемой путем удаления полномочий на её обновление.

Terminal
$
wc -c < ./target/deploy/hello_world.so
solana program set-upgrade-authority ./target/deploy/your_program-keypair.json --final
Terminal
$
solana rent 18504
solana program finalize --program-id ./target/deploy/your_program-keypair.json

Вместо перезаписи программ также можно предоставить пользователям возможность выбора версии программы, которую они хотят использовать, создав связанный список финализированных программ:

Для развертывания программы используйте команду solana program deploy:

Terminal
$
solana program deploy ./target/deploy/hello_world.so

Для программ, развернутых с использованием loader-v3, можно вернуть только их programdata аккаунт, буферные аккаунты и средства, заблокированные в них. Program аккаунт вместе с ID программы и средствами, заблокированными в program аккаунте, остаются недоступными.

Программы, развернутые с использованием loader-v4, могут быть закрыты вместе с их программным аккаунтом, их программным ID и заблокированными средствами, которые снова становятся доступными для других целей.

Loader-v3

Terminal
$
solana program deploy ./target/deploy/hello_world.so --program-id ./custom-keypair.json

Вы можете сгенерировать новые keypair с помощью команды solana-keygen:

Terminal
$
solana-keygen new -o ./custom-keypair.json
solana program close ./target/deploy/your_program-keypair.json

Чтобы закрыть все буферные аккаунты, связанные с текущим владельцем:

Обновите свою программу с помощью той же команды solana program deploy:

  1. Внесите изменения в код вашей программы
  2. Пересоберите программу: cargo build-sbf
  3. Разверните обновление:
Terminal
$
solana program deploy ./target/deploy/hello_world.so

Просмотр метаданных

Подкоманда show отображает метаданные программы.

Пример вывода выглядит следующим образом:

Terminal
$
solana program extend 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE 1000
  • Program Id — это адрес, который можно указать в поле program_id инструкции при вызове программы.
  • Owner: Загрузчик, с которым была развернута эта программа.
  • ProgramData Address — это аккаунт programdata, связанный с программным аккаунтом, который содержит исполняемый файл программы (только для loader-v3).
  • Status: retracted, deployed или finalized (только для loader-v4).
  • Authority — это полномочие на обновление программы.
  • Last Deployed In Slot — это слот, в котором программа была развернута в последний раз.
  • Data Length — это размер пространства, зарезервированного для развертываний. Фактическое пространство, используемое текущей развернутой программой, может быть меньше.

Loader-v3

Чтобы просмотреть конкретную программу:

solana program show ./target/deploy/your_program-keypair.json

Чтобы проверить метаданные вашей программы, используйте команду solana program show:

Terminal
$
solana program show 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE

Чтобы показать все буферные аккаунты независимо от владельца:

solana program show --buffers --all
$ solana program show 7283x8k8fyBcfaFLyPsxbd2VV1AMmZFP7FNoyTXVKJw7
Program Id: 7283x8k8fyBcfaFLyPsxbd2VV1AMmZFP7FNoyTXVKJw7
Owner: BPFLoaderUpgradeab1e11111111111111111111111
ProgramData Address: Gqn7YQVCP8NtYV1qkEqR4Udhj8EJ3fkikvS7HskCNQ7c
Authority: 5kh6HxYZiAebF8HWLsUWod2EaQQ6iWHpHYCz8UcmFbM1
Last Deployed In Slot: 6573
Data Length: 18504 (0x4848) bytes
Balance: 0.12999192 SOL
solana program show --programs --buffer-authority ~/.config/solana/authority-keypair.json
solana 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 программы, чтобы идентификатор программы оставался прежним. Более того, один владелец может управлять несколькими аккаунтами программ.

Чтобы передать полномочия программы другому аккаунту, используйте команду solana program set-upgrade-authority:

Terminal
$
solana program set-upgrade-authority 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE --new-upgrade-authority ./new-authority-keypair.json

Сначала необходимо сгенерировать keypair для владельца:

solana-keygen new -o ~/.config/solana/authority-keypair.json

Чтобы сделать вашу программу неизменяемой, используйте команду solana program set-upgrade-authority с флагом --final для удаления полномочий программы:

Terminal
$
solana program set-upgrade-authority 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE --final
solana program deploy ./target/deploy/your_program.so --upgrade-authority ~/.config/solana/authority-keypair.json

Или после развертывания, используя keypair по умолчанию в качестве текущего владельца:

Чтобы закрыть программу и вернуть SOL, выделенные на аккаунт программы, используйте команду solana program close:

Terminal
$
solana program close 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE --bypass-warning
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
Terminal
$
solana program show --programs
solana program-v4 transfer-authority --program-id ./target/deploy/your_program-keypair.json --new-authority ~/.config/solana/authority-keypair.json
Program Id | Slot | Authority | Balance
-------------------------------------------------|------------|------------------------------------------------|-------------
7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE | 249885434 | 5kh6HxYZiAebF8HWLsUWod2EaQQ6iWHpHYCz8UcmFbM1 | 0.12999192
3KSGCk4m5hqJkTjPHBXUCPcqMwJnK3VmkqEsFUKKGJPK | 249883212 | 5kh6HxYZiAebF8HWLsUWod2EaQQ6iWHpHYCz8UcmFbM1 | 0.28654328
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

Чтобы скачать развернутую программу, используйте команду solana program dump:

Terminal
$
solana program dump 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE ./downloaded_program.so

Имейте в виду, что использование буферных аккаунтов примерно удваивает средства, необходимые в процессе загрузки, так как два аккаунта одновременно хранят один исполняемый файл.

Сначала необходимо создать keypair для буферного аккаунта:

solana-keygen new -o ~/.config/solana/buffer-keypair.json

Буферный аккаунт может быть повторно использован для различных загрузок и не привязан к какому-либо конкретному аккаунту программы.

Terminal
$
solana program deploy ./target/deploy/hello_world.so \
--with-compute-unit-price 10000 \
--max-sign-attempts 10 \
--use-rpc
solana program write-buffer ./target/deploy/your_program.so --buffer ~/.config/solana/buffer-keypair.json
solana program deploy --program-id ./target/deploy/your_program-keypair.json --buffer ~/.config/solana/buffer-keypair.json
  • --with-compute-unit-price: Установить приоритетную комиссию в микролампортах (0,000001 SOL) за вычислительную единицу. Актуальные значения смотрите в Helius Priority Fee API. Приоритетная комиссия — это дополнительная плата, выплачиваемая текущему лидеру для ускорения вашей транзакции.
  • --max-sign-attempts: Количество попыток повторить с новым blockhash, если транзакции истекают. (По умолчанию: 5)
  • --use-rpc: Отправлять транзакции на настроенный RPC. Этот флаг требует stake-weighted RPC-соединения от таких провайдеров, как Triton или Helius.

Is this page helpful?