Деплой программ
Разработчики могут развертывать внутрисетевые программы (в других местах часто называемые смарт-контрактами) с помощью инструментов Solana.
Чтобы узнать о разработке и выполнении программ на Солане, начните с обзора, а затем углубитесь в подробности ончейн-программ.
Чтобы развернуть программу, используйте инструменты Solana для взаимодействия с загрузчиком в цепочке, чтобы:
- Инициализировать учетную запись программы
- Загрузить общий объект программы в буфер данных учетной записи программы
- Проверьте загруженную программу
- Доработать программу, пометив учетную запись программы как исполняемую.
После развертывания любой может выполнить программу, отправив транзакции, которые ссылаются на нее, в кластер.
Использование
Развернуть программу
Чтобы развернуть программу, вам потребуется расположение общего объекта программы (двоичный файл программы .so).
solana program deploy <PROGRAM_FILEPATH>
Успешное развертывание вернет идентификатор развернутой программы, например:
Program Id: 3KS2k14CmtnuVv2fvYcvdrNgC94Y11WETBpMUGgXyWZL
Укажите пару ключей в команде развертывания для развертывания на определенный идентификатор программы:
solana program deploy --program-id <KEYPAIR_FILEPATH> <PROGRAM_FILEPATH>
Если идентификатор программы не указан в командной строке, инструменты сначала будут искать файл пары ключей, соответствующий <PROGRAM_FILEPATH>
, или внутренне сгенерировать новую пару ключей.
Соответствующий файл пары ключей программы находится в том же каталоге, что и общий объект программы, и называется <PROGRAM_NAME>-keypair.json. Совпадающие пары ключей программы генерируются автоматически средствами сборки программы:
./path-to-program/program.so
./path-to-program/program-keypair.json
Показ учетной записи программы
Чтобы получить информацию о развернутой программе:
solana program show <ACCOUNT_ADDRESS>
Пример вывода выглядит так:
Program Id: 3KS2k14CmtnuVv2fvYcvdrNgC94Y11WETBpMUGgXyWZL
Owner: BPFLoaderUpgradeab1e11111111111111111111111
ProgramData Address: EHsACWBhgmw8iq5dmUZzTA1esRqcTognhKNHUkPi4q4g
Authority: FwoGJNUaJN2zfVEex9BB11Dqb3NJKy3e9oY3KTh9XzCU
Last Deployed In Slot: 63890568
Data Length: 5216 (0x1460) bytes
- «Идентификатор программы» — это адрес, на который можно ссылаться в поле «program_id» инструкции при вызове программы.
Владелец
: загрузчик, с которым была развернута эта программа.- «Адрес ProgramData» — это учетная запись, связанная с учетной записью программы, которая содержит данные программы (общий объект).
Полномочия
- это полномочия обновления программы.- «Последнее развертывание в слоте» — это слот, в котором программа была развернута в последний раз.
- «Длина данных» — это размер пространства, зарезервированного для развертывания. Фактическое пространство, используемое текущей развернутой программой, может быть меньше.
Повторное развертывание программы
Программу можно повторно развернуть по тому же адресу, чтобы ускорить разработку, исправление ошибок или обновление. Файлы совпадающих пар ключей генерируются один раз, поэтому повторные развертывания будут выполняться по тому же адресу программы.
Команда выглядит так же, как команда развертывания:
solana program deploy <PROGRAM_FILEPATH>
По умолчанию программы развертываются на учетных записях, размер которых в два раза превышает размер исходного развертывания. Это оставляет место для расширения программы при будущих передислокациях. Но если первоначально развернутая программа очень мала (например, простая программа helloworld), а затем существенно разрослась, повторное развертывание может завершиться неудачей. Чтобы избежать этого, укажите max_len
, который, по крайней мере, равен размеру (в байтах) ожидаемой программы (плюс некоторое пространство для маневра).
solana program deploy --max-len 200000 <PROGRAM_FILEPATH>
Обратите внимание, что учетные записи программы должны быть освобождены от аренды (developing/programming-model/accounts.md#rent-exemption), а «max-len» фиксируется после первоначального развертывания, поэтому любой SOL в учетных записях программы заперт навсегда.
Возобновление неудачного развертывания
Если развертывание программы завершится ошибкой, появится зависшая промежуточная буферная учетная запись с ненулевым балансом. Чтобы компенсировать этот баланс, вы можете возобновить неудачное развертывание, предоставив тот же промежуточный буфер для нового вызова deploy
.
При сбое развертывания будет напечатано сообщение об ошибке с указанием исходной фразы, необходимой для восстановления пары ключей сгенерированного промежуточного буфера:
==================================================================================
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 as
the [BUFFER_SIGNER] to `solana program deploy` or `solana write-buffer'.
Or to recover the account's lamports, pass it as the
[BUFFER_ACCOUNT_ADDRESS] argument to `solana program drain`.
==================================================================================
Чтобы восстановить пару ключей:
solana-keygen recover -o <KEYPAIR_PATH>
При появлении запроса введите исходную фразу из 12 слов.
Затем введите новую команду deploy
и укажите буфер:
solana program deploy --buffer <KEYPAIR_PATH> <PROGRAM_FILEPATH>
Закрытие программных и буферных учетных записей и восстановление их лампортов
Как программные, так и буферные счета могут быть закрыты, а их лэмпорт-балансы могут быть переведены на счет получателя.
Если развертывание завершится неудачно, останется лишняя буферная учетная запись, содержащая lamports. Буферную учетную запись можно использовать для возобновления развертывания или закрыть.
Полномочия программы или буферной учетной записи должны присутствовать, чтобы закрыть учетную запись, чтобы вывести список всех открытых программных или буферных учетных записей, которые соответствуют полномочиям по умолчанию:
solana program show --programs
solana program show --buffers
Чтобы указать другой орган:
solana program show --programs --buffer-authority <AURTHORITY_ADRESS>
solana program show --buffers --buffer-authority <AURTHORITY_ADRESS>
Чтобы закрыть одну учетную запись:
solana program close <BADDRESS>
Чтобы закрыть одну учетную запись и указать полномочия, отличные от установленных по умолчанию:
solana program close <ADDRESS> --buffer-authority <KEYPAIR_FILEPATH>
Чтобы закрыть одну учетную запись и указать получателя, отличного от получателя по умолчанию:
solana program close <ADDRESS> --recipient <RECIPIENT_ADDRESS>
Чтобы закрыть все буферные учетные записи, связанные с текущими полномочиями:
solana program close --buffers
Чтобы показать все буферные счета независимо от полномочий
solana program show --buffers --all
Установить полномочия обновления программы
Для развертывания программы должны присутствовать полномочия обновления программы. Если во время развертывания программы не указаны полномочия, в качестве полномочий используется пара ключей по умолчанию. Вот почему повторное развертывание программы на шагах, описанных выше, не требовало явного указания полномочий.
Полномочия могут быть указаны во время развертывания:
solana program deploy --upgrade-authority <UPGRADE_AUTHORITY_SIGNER> <PROGRAM_FILEPATH>
Или после развертывания и использования пары ключей по умолчанию в качестве текущих полномочий:
solana program set-upgrade-authority <PROGRAM_ADDRESS> --new-upgrade-authority <NEW_UPGRADE_AUTHORITY>
Или после развертывания и указания текущих полномочий:
solana program set-upgrade-authority <PROGRAM_ADDRESS> --upgrade-authority <UPGRADE_AUTHORITY_SIGNER> --new-upgrade-authority <NEW_UPGRADE_AUTHORITY>
Неизменяемые программы
Программу можно пометить как неизменяемую, что предотвратит все дальнейшие повторные развертывания.
указание флага --final
во время развертывания:
solana program deploy <PROGRAM_FILEPATH> --final
Или в любое время после:
solana program set-upgrade-authority <PROGRAM_ADDRESS> --final
Сброс программы в файл
Развернутую программу можно сбросить обратно в локальный файл:
solana program dump <ACCOUNT_ADDRESS> <OUTPUT_FILEPATH>
Файл дампа будет таким же, как и развернутый, поэтому в случае общего объекта файл дампа будет полностью функциональным общим объектом. Обратите внимание, что команда dump
выгружает все пространство данных, а это означает, что выходной файл будет иметь нули после данных общего объекта до max_len
. Иногда полезно сделать дамп и сравнить программу, чтобы убедиться, что она соответствует известному двоичному файлу программы. Исходный программный файл может быть расширен нулями, хеширован и сравнен с хэшем файла дампа.
$ solana dump <ACCOUNT_ADDRESS> dump.so
$ cp original.so extended.so
$ truncate -r dump.so extended.so
$ sha256sum extended.so dump.so
Использование учетной записи-посредника Buffer
Вместо развертывания непосредственно в учетной записи программы программу можно записать в промежуточную буферную учетную запись. Промежуточные учетные записи могут быть полезны для таких вещей, как управляемые несколькими организациями программы, где управляющие члены сначала проверяют содержимое промежуточного буфера, а затем голосуют за разрешение обновления с его использованием.
solana program write-buffer <PROGRAM_FILEPATH>
Буферные учетные записи поддерживают полномочия, такие как программные учетные записи:
solana program set-buffer-authority <BUFFER_ADDRESS> --new-upgrade-authority <NEW_UPGRADE_AUTHORITY>
Единственным исключением является то, что буферные учетные записи не могут быть помечены как неизменяемые, как учетные записи программ, поэтому они не поддерживают --final
.
Буферная учетная запись, когда она будет полностью записана, может быть передана в deploy
для развертывания программы:
solana program deploy --program-id <PROGRAM_ADDRESS> --buffer <BUFFER_ADDRESS>
Обратите внимание, что права доступа к буферу должны совпадать с правами обновления программы.
Буферы также поддерживают show
и dump
, как это делают программы.