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

Проверка программ

Это руководство предназначено для разработчиков, которые хотят реализовать проверенные сборки для своих программ на Solana. Мы рассмотрим, что такое проверенные сборки, как их использовать, особые аспекты и лучшие практики для обеспечения подлинности вашей программы в блокчейне.

Что такое проверенные сборки?

Проверенные сборки гарантируют, что исполняемая программа, которую вы разворачиваете в сети Solana, соответствует исходному коду в вашем репозитории. Благодаря этому разработчики и пользователи могут быть уверены, что программа, работающая в блокчейне, точно соответствует публичной кодовой базе, что способствует прозрачности и безопасности.

Процесс проверки включает сравнение хэша программы в блокчейне с хэшем локально собранной программы из исходного кода. Это гарантирует отсутствие расхождений между двумя версиями.

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

Процесс проверенных сборок был разработан и поддерживается Ellipsis Labs и OtterSec. Для получения дополнительной информации следуйте руководству в оригинальном репозитории проверенных сборок, а также процессу проверки сборки непосредственно в наборе инструментов Anza, как только он будет поддерживаться там.

Как это работает?

Процесс верификации осуществляется путем сравнения хэша ончейн-программы с хэшем локально собранной программы из исходного кода. Вы собираете свою программу в контролируемой среде с использованием Solana Verify CLI и Docker. Это гарантирует, что процесс сборки будет детерминированным и последовательным на разных системах. После получения исполняемого файла вы можете развернуть его в сети Solana. В процессе сборки будет создан PDA программы верификации. Этот PDA содержит все данные, необходимые для верификации программы. В PDA включены адрес программы, URL-адрес git, хэш коммита и аргументы, использованные для сборки программы.

Используя данные из PDA, каждый может локально запустить команду программы верификации и проверить, была ли программа собрана из предоставленного исходного кода. Таким образом, каждый может самостоятельно и полностью без доверия убедиться в этом или запустить собственный API верификации, поддерживаемый OtterSec, чтобы предоставить пользователям удобную точку доступа для проверки верификации. Вы уже можете видеть эти вызовы API, используемые в Solana Explorer и SolanaFM, а также в других местах.

Зачем использовать проверенные сборки?

Использование проверенных сборок предоставляет следующие преимущества:

  • Безопасность: Гарантия того, что программа, работающая ончейн, соответствует исходному коду, предотвращая злонамеренные изменения.

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

  • Доверие: Повышение уверенности пользователей, так как проверенные сборки демонстрируют, что поведение вашей программы ончейн соответствует вашему публичному коду. Создавая проверяемые программы, вы минимизируете риски, связанные с запуском неавторизованного или вредоносного кода. Это также гарантирует соблюдение лучших практик и предоставляет исследователям безопасности простой способ связаться с вами. Кроме того, кошельки и другие инструменты могут легче разрешать транзакции от вашей программы, если она проверена.

  • Обнаруживаемость: когда вы предоставляете проверенную сборку вашей программы, каждый может найти ваш исходный код, документацию, SDK программы или IDL, а также легко связаться с вами через GitHub в случае возникновения проблемы.

Как создать проверенные сборки?

Чтобы создать проверенные сборки, вам нужно выполнить следующие шаги:

Резюме:

  • Зафиксируйте ваш код в публичном репозитории
  • Создайте проверенную сборку в Docker
  • Разверните проверенную сборку
  • Проверьте развернутую программу через публичный API

Если вы проверяете вашу программу, которая не была собрана в контейнере Docker, это, скорее всего, приведет к ошибке, так как сборки программ Solana не являются детерминированными на разных системах.

Установите Docker и Cargo

Установите необходимые инструменты, убедитесь, что Docker и Cargo установлены. Docker предоставляет контролируемую среду сборки для обеспечения согласованности, а Cargo используется для управления пакетами Rust.

  • Docker: Следуйте инструкциям на сайте Docker, чтобы установить Docker для вашей платформы. После установки убедитесь, что служба Docker запущена, следуя этому руководству.
  • Cargo: Если Cargo еще не установлен, вы можете установить его, выполнив следующую команду:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Установите Solana Verify CLI

Solana Verify CLI — это основной инструмент, используемый для проверки сборок. Solana Verify CLI в настоящее время поддерживается Ellipsis Labs и может быть установлен с помощью Cargo.

Вы можете установить его, выполнив следующую команду:

cargo install solana-verify

Если вам нужна определенная версия CLI, вы можете зафиксировать версию с помощью:

cargo install solana-verify --version $VERSION

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

cargo install solana-verify --git https://github.com/Ellipsis-Labs/solana-verifiable-build --rev 13a1db2

Подготовка проекта

Чтобы выполнить проверку репозитория, в корневой директории вашего репозитория должен быть файл Cargo.lock. Если в репозитории только одна программа и в корне есть файл cargo.lock, вы можете сразу перейти к следующему шагу и собрать свою программу.

Если ваша программа находится во вложенной папке и у вас используется rust workspace, необходимо создать файл workspace Cargo.toml в корневой директории репозитория.

Вы можете использовать этот пример Cargo.toml как шаблон:

Cargo.toml
[workspace]
members = ["program/programs/*"]
resolver = "2"
[profile.release]
overflow-checks = true
lto = "fat"
codegen-units = 1
[profile.release.build-override]
opt-level = 3
incremental = false
codegen-units = 1

Убедитесь, что ваша программа указана в массиве workspace/members, а файл Cargo.toml вашей программы содержит корректно настроенное имя lib.

Важно именно lib name, а не имя пакета!

Примерно так:

waffle/Cargo.toml
[package]
name = "waffle"
version = "0.1.0"
edition = "2021"
[lib]
name = "waffle"
crate-type = ["cdylib", "lib"]
[dependencies]
solana-program = "2.1.0"

В этом репозитории вы можете увидеть пример workspace с программой во вложенной папке. Обратите внимание, что если программа находится во вложенной папке, позже вам нужно будет добавить эту папку как --mount-path к команде verify-from-repo.

В этом репозитории вы найдете пример с anchor. В этом репозитории вы найдете пример с native rust.

Когда файл Cargo.toml готов, вы можете запустить cargo generate-lockfile, чтобы создать lock-файл и продолжить сборку вашей программы.

Сборка проверяемых программ

Чтобы воспроизводимо собрать свою программу Solana, перейдите в директорию, содержащую файл workspace Cargo.toml, и выполните:

solana-verify build

Это скопирует вашу среду в контейнер docker и выполнит сборку детерминированным образом.

Убедитесь, что вы действительно деплоите проверенную сборку и случайно не перезаписываете её с помощью anchor build или cargo build-sbf, так как это, скорее всего, приведёт к другому хэшу, и ваша верификация не пройдёт.

Для проектов с несколькими программами вы можете собрать конкретную программу, используя имя библиотеки (а не имя пакета):

solana-verify build --library-name $PROGRAM_LIB_NAME

Этот процесс обеспечивает детерминированную сборку и может занять некоторое время, особенно на определённых системах (например, MacBook с процессором M1), так как он выполняется внутри контейнера Docker. Для более быстрой сборки рекомендуется использовать машину с архитектурой x86 на базе Linux.

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

solana-verify get-executable-hash target/deploy/$PROGRAM_LIB_NAME.so

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

После того как вы собрали свою программу и получили её хэш, вы можете развернуть её в сети Solana. Рекомендуется использовать решение с мультиподписью или управление, такое как Squads Protocol, для безопасного развёртывания, но вы также можете развернуть напрямую с помощью:

solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID --with-compute-unit-price 50000 --max-sign-attempts 100 --use-rpc

В настоящее время подходящая низкоприоритетная комиссия, которую вы можете запросить у вашего RPC-провайдера, например Quicknode.

Чтобы проверить, что развернутая программа соответствует собранному исполняемому файлу, выполните:

solana-verify get-program-hash -u $NETWORK_URL $PROGRAM_ID

У вас могут быть развернуты разные версии на разных кластерах Solana (например, devnet, testnet, mainnet). Убедитесь, что вы используете правильный URL сети для нужного кластера Solana, с которым вы хотите проверить программу. Удалённая проверка будет работать только в mainnet.

Проверка с репозиториями

Чтобы проверить программу с её публичным репозиторием, используйте:

solana-verify verify-from-repo -u $NETWORK_URL --program-id $PROGRAM_ID https://github.com/$REPO_PATH --commit-hash $COMMIT_HASH --library-name $PROGRAM_LIB_NAME --mount-path $MOUNT_PATH

При запуске проверенной сборки в каталоге вашей программы, при выполнении verify-from-repo необходимо добавить флаг --mount-path. Это будет путь к папке, содержащей Cargo.toml, в которой находится имя библиотеки вашей программы.

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

В конце команда спросит, хотите ли вы загрузить данные проверки в блокчейн. Если вы это сделаете, Solana Explorer сразу же покажет данные проверки вашей программы. Пока она не будет проверена удалённой сборкой, она будет отображаться как непроверенная. Узнайте, как вы можете проверить свою программу через публичный API, на следующем шаге.

Если вы хотите зафиксировать проверку на определённый релиз, вы можете добавить флаг --commit-hash к команде.

Проверка через публичный API

Наконец, вы также можете напрямую проверить программу через любого, кто использует API проверки::

solana-verify verify-from-repo --remote -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1

Рекомендуется использовать платный RPC Url, так как иначе вы можете столкнуться с лимитами бесплатных RPC. Поэтому вместо -um лучше использовать --url yourRpcUrl для более надёжной проверки.

Флаг --remote отправляет запрос на сборку в OtterSec API, который запускает удалённую сборку вашей программы. После завершения сборки система проверяет, совпадает ли хэш вашей программы в блокчейне с хэшем созданного артефакта сборки из вашего репозитория.

По умолчанию используется API OtterSec.

Обязательно выберите "да", когда вас спросят, хотите ли вы загрузить данные проверки в блокчейн. Это используется API для проверки того, что вы загрузили данные проверки.

Вы также можете вручную запустить удалённую задачу, используя:

solana-verify remote submit-job --program-id <program-id> --uploader <address>

Загрузчик — это адрес, который имеет право записывать данные в PDA. В большинстве случаев это должна быть программа с соответствующими полномочиями. Если ваша программа управляется мультиподписью, пожалуйста, перейдите к разделу проверка мультиподписи этого руководства ниже.

Это отправит задание в API OtterSec, и затем вы сможете проверить статус задания с помощью следующей команды:

solana-verify remote get-job-status --job-id <job-id>

После успешного завершения проверки, что может занять некоторое время, вы сможете увидеть вашу программу как проверенную в API OtterSec для отдельных программ, а также в Solana Explorer, SolanaFM, SolScan и в будущем на сайте сообщества SolanaVerify.org, который поддерживается 0xDeep, а также в API проверенных программ OtterSec и, наконец, в Verified Programs Dune Dashboard, что способствует более здоровой экосистеме Solana.

Как проверить вашу программу, если она управляется мультиподписью, такой как Squads

Для удаленной проверки необходимо записать данные проверки в PDA, подписанный полномочиями программы. Если ваша программа управляется мультиподписью, вы можете экспортировать эту транзакцию записи в PDA и отправить её через Squads Protocol или другое решение для мультиподписи на ваш выбор.

1. Создайте проверяемую программу

Сначала создайте программу:

solana-verify build

Это создаст проверяемую сборку с помощью docker-контейнера, используя версию solana, указанную в файле Cargo.lock.

2. Разверните программу

solana config set --url "PayedMainnetRPCAddress" // the public endpoint will be rate limited too much
solana program deploy target/deploy/verify_squads.so

В оставшейся части этого руководства по multisig мы будем использовать пример ID программы 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD.

3. Зафиксируйте изменения и проверьте их в репозитории

После этого зафиксируйте проект в GitHub. Вот пример: https://github.com/solana-developers/verify-squads

Необязательно: попробуйте сначала выполнить локальную проверку (эта команда использует пример ID программы 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD):

solana-verify verify-from-repo https://github.com/solana-developers/verify-squads --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD

Просто чтобы убедиться, что ваши параметры верны.

4. Передача полномочий программы мультиподписи

Если вы еще не передали полномочия вашей программы мультиподписи, сделайте это и скопируйте полномочия мультиподписи. Они понадобятся вам на следующем этапе.

5. Экспорт транзакции PDA

Когда у вас есть локальные права на программу, при использовании команды solana-verify verify-from-repo вам будет предложено загрузить данные сборки в блокчейн.

Поскольку вы не можете сделать это при использовании мультиподписи, вам нужно вручную экспортировать транзакцию PDA, а затем выполнить транзакцию через Squads.

solana-verify export-pda-tx https://github.com/solana-developers/verify-squads --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD --uploader <your program authority> --encoding base58 --compute-unit-price 0

В результате вы получите транзакцию в формате base58. Если вам нужна транзакция, закодированная в base64, для использования в инспекторе транзакций, вы можете воспользоваться --encoding base64.

P6vBfcPaaXb8fZoT3NBAYEcdtEj7tubA1k2gBxmFKZ3UWF5YyrmDMFTvLKALCJoUuRsPAjMckudYruCu3eeWQtuDrFbEMLxLFutnKXac974fnkMivcwUdY66VLjbxQT6ATmcy7F4hBtz1G4P1h6iBJLhb8WtrtgY3i4qq45MUEb7RjuMEfUFXKrNgPdGxkz5xvMHq3dxKRcpmEK5k2DkeW6SUQYBVe19Ga3B9GyhTX8k3CMt9JCEah13WyRnQd8GjoK6sTEvGJym6xDNvmd8yiJYSNcaYwEJsjHEUf4Yh6kAC7ki2KRvVAr3NVe1gjqK9McrwSQjtUatvydTG8Zovcr7PPUEMf3yPMgKXjZLB2QpkH63yTTYdNAnWFuv9E6b6nYRqye5XcNi436yKw5U14fXh65yK34bgYLi9328UT1huJELsJU9BRGnGUmb6GWp6c2WL5BhnzgNTSnt9TXFfEgUMzhvKzpVBxLP44hwqqBdyUhHFysCF37531PnmiESq8x1xou23xJ6FcQbc199754MkqQd7tX9CUznGzAEqHGkzn3VBoJnojsKtgYmiTYbdRsT1CU18MbYEE7WvGAvXyxxbpNzbAcc94HrnM6cqRGmwhEBroPfFghTdmzg9D

6. Отправка транзакции через Squads

Перейдите в конструктор транзакций Squads и импортируйте транзакцию, закодированную в base58. Убедитесь, что в симуляции транзакция содержит только вызов программы проверки osec и программы бюджета компьютера, и ничего больше!

7. Отправка удаленной задачи проверки

После успешной отправки транзакции в Squads вы можете отправить удаленную задачу:

solana-verify remote submit-job --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD
--uploader <your program authority>

Вот и все! Вы проверили свою программу в публичном репозитории и отправили удаленную задачу в API OtterSec. Теперь вы должны увидеть это в Solana Explorer и других местах.

8. Обновление программы (опционально)

При обновлении программы необходимо экспортировать новую транзакцию PDA и снова отправить её через Squads.

Обновление программы:

solana-verify build
solana program write-buffer target/deploy/verify_squads.so --with-compute-unit-price 50000 --max-sign-attempts 50

Затем передайте полномочия на буфер мультиподписи или создайте буфер с полномочиями мультиподписи напрямую.

solana program set-buffer-authority Fu3k79g53ZozAj47uq1tXrFy4QbQYh7y745DDsxjtyLR --new-buffer-authority 3JG6ULvZVCrkKtSSskKNJGe8RNZGFe8Ruev9KUhxzK5K

9. Экспорт и отправка новой транзакции PDA

Не забудьте зафиксировать изменения в github. Снова экспортируйте транзакцию обновления PDA:

solana-verify export-pda-tx https://github.com/solana-developers/verify-squads --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD --uploader 3JG6ULvZVCrkKtSSskKNJGe8RNZGFe8Ruev9KUhxzK5K

Снова отправьте транзакцию через Squads.

Пример транзакции можно посмотреть здесь.

Затем отправьте запрос на ещё одну удалённую сборку:

solana-verify remote submit-job --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD --uploader 3JG6ULvZVCrkKtSSskKNJGe8RNZGFe8Ruev9KUhxzK5K

Результат должен быть примерно таким:

Verification request sent with request id: b63339d2-163e-49ac-b55d-3454c1c2b5b3
Verification in progress... ⏳ [00:18:02] ✅ Process completed. (Done in 18
minutes) Program 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD has been verified.
The provided GitHub build matches the on-chain hash. On Chain Hash:
96f8c3d9400258f7759408d1f6f8435b4a24d9b52f5a0340d97907e567cb8773 Executable
Hash: 96f8c3d9400258f7759408d1f6f8435b4a24d9b52f5a0340d97907e567cb8773 Repo URL:
https://github.com/Woody4618/verify-squads/tree/0fb0a2e30c15c51732c0ad5e837975a6f7bbc7ed
Check the verification status at:
https://verify.osec.io/status/6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD Job
url: https://verify.osec.io/job/b63339d2-163e-49ac-b55d-3454c1c2b5b3

Поздравляем! Вы успешно проверили свою программу после обновления с использованием мультиподписи!

Проверка с использованием образа Docker

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

solana-verify verify-from-image -e
examples/hello_world/target/deploy/hello_world.so -i
ellipsislabs/hello_world_verifiable_build:latest -p
2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn

Эта команда загружает образ, сохранённый по адресу ellipsislabs/hello_world_verifiable_build:latest, и проверяет, что хэш исполняемого файла в контейнере совпадает с хэшем ончейн-программы, переданной в команду. Поскольку сборка уже была загружена в образ, нет необходимости в полной пересборке исполняемого файла, что может занять много времени.

Dockerfile, который создаёт образ ellipsislabs/hello_world_verifiable_build:latest, можно найти в репозитории ellipsis labs /examples/hello_world.

Ниже приведён ожидаемый вывод:

Verifying image: "ellipsislabs/hello_world_verifiable_build:latest", on network
"https://api.mainnet.solana.com" against program ID
2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn Executable path in container:
"examples/hello_world/target/deploy/hello_world.so"
Executable hash:
08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Program hash:
08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Executable
matches on-chain program data ✅

Пример проверенной сборки

Вот пример проверки примерной программы с ID FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv с использованием исходного кода из этого репозитория:

solana-verify verify-from-repo https://github.com/solana-developers/verified-program --url YOUR-RPC-URL --program-id FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv --mount-path waffle --library-name waffle --commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e

По умолчанию команда verify-from-repo берёт последний коммит из основной ветки. Вы также можете указать определённый коммит, если хотите продолжить работу с репозиторием, используя параметр commit-hash: --commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e

Наконец, вы также можете напрямую проверить программу через API OtterSec:

solana-verify verify-from-repo https://github.com/solana-developers/verified-program --url YOUR-RPC-URL --remote --program-id FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv --mount-path waffle --library-name waffle --commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e

Команда --remote отправляет запрос на сборку в API OtterSec, который запускает удалённую сборку вашей программы. После завершения сборки система проверяет, что хэш вашей программы в блокчейне совпадает с хэшем созданного артефакта сборки из вашего репозитория.

Популярные программы, которые уже проверены

Phoenix

solana-verify verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1

Итоговый результат:

Executable Program Hash from repo: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9
On-chain Program Hash: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9
Program hash matches ✅

Squads V3

solana-verify verify-from-repo https://github.com/Squads-Protocol/squads-mpl --commit-hash c95b7673d616c377a349ca424261872dfcf8b19d --program-id SMPLecH534NA9acpos4G6x7uf3LWbCAwZQE9e8ZekMu -um --library-name squads_mpl --bpf

Обратите внимание, что нам нужно было указать library-name, потому что репозиторий Squads содержит несколько программ. Мы используем флаг --bpf, потому что squads_mpl ранее уже был верифицирован с помощью Anchor.

Итоговый результат:

Executable Program Hash from repo: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c
On-chain Program Hash: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c
Program hash matches ✅

Drift V2

solana-verify verify-from-repo -um --program-id dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH https://github.com/drift-labs/protocol-v2 --commit-hash 110d3ff4f8ba07c178d69f9bfc7b30194fac56d6 --library-name drift

Итоговый результат:

Executable Program Hash from repo: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828
On-chain Program Hash: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828
Program hash matches ✅

Marginfi V2

solana-verify verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --commit-hash d33e649e415c354cc2a1e3c49131725552d69ba0 --library-name marginfi -- --features mainnet-beta

Итоговый результат:

Executable Program Hash from repo: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5
On-chain Program Hash: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5
Program hash matches ✅

Часто задаваемые вопросы

Моя верификация не проходит. Что делать?

Проверьте эти распространённые проблемы:

  • Неверный подписант: Убедитесь, что ваш подписант является upgrade authority программы, выполнив команду solana program show YourProgramId
  • Отсутствует on-chain PDA: Выполните solana-verify verify-from-repo -um и выберите YES при запросе. Без загрузки PDA API не сможет получить ваши метаданные верификации.
  • Несоответствие данных PDA: Обновите ваш PDA, если вы переразвернули программу. Данные вашего PDA должны соответствовать развёрнутой программе.
  • Неверный хеш коммита: Создайте PDA, используя точный хеш коммита, который вы развернули
  • Различия в окружении сборки: Используйте Docker с solana-verify при создании PDA

Хеш моей локальной сборки не совпадает с on-chain хешем. Почему?

Обычно это означает:

  • Вы используете разные версии инструментов Rust/Solana
  • Ваши зависимости были обновлены между сборками
  • Вы не выполняли сборку в Docker-контейнере
  • Вы извлекли неправильный коммит

Исправьте это, выполнив сборку с solana-verify build в Docker, используя точный коммит, который вы развернули.

Сколько времени займёт моя верификация?

Ожидайте следующие временные рамки в зависимости от размера вашей программы:

  • Простые программы: 1-5 минут
  • Сложные программы: 5-15 минут
  • Очень большие программы: до 30 минут

Отслеживайте прогресс, используя эндпоинт статуса задачи.

Моя программа иммутабельна (нет upgrade authority). Как её верифицировать?

Если ваша программа не имеет upgrade authority или была сделана иммутабельной до того, как вы смогли создать PDA, у нас есть адрес из белого списка для такой ситуации. Свяжитесь с нами по адресу contact@osec.io, и мы поможем вам верифицировать вашу программу.

Что такое PDA и почему это важно?

Ваш PDA (Program Derived Account) обеспечивает проверку без доверия:

  • Хранение в блокчейне: Сохраняйте метаданные верификации (URL репозитория, хеш коммита, параметры сборки) в блокчейне в PDA, принадлежащем программе Otter Verify (verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC)
  • Криптографическая связь: Ваш PDA выводится из адреса вашей программы, создавая неизменяемую связь с данными верификации
  • Децентрализованное доверие: Любой может прочитать ваш PDA и независимо проверить вашу программу

Почему я должен создать PDA перед использованием API?

API работает только с PDA в блокчейне, потому что:

  • Без доверия: API отклоняет произвольные данные — он использует только то, что ваш орган обновления сохранил в блокчейне
  • Проще: Просто предоставьте подписанта + program_id; API получает всё остальное из вашего PDA
  • Защита от подделки: Ваш PDA создаёт неизменяемую запись, которую любой может проверить независимо
  • Подтверждение владения: Ваш подписант должен быть органом обновления, криптографически доказывая, что вы контролируете программу

Как часто следует проверять мою программу?

Проверяйте вашу программу:

  • После каждого развёртывания или обновления
  • При обновлении исходного репозитория
  • Не беспокойтесь о повторной проверке в остальных случаях — API автоматически повторно проверяет все программы каждые 24 часа

Что происходит при обновлении моей программы?

Выполните следующие шаги после обновления:

  1. API обнаруживает ваше обновление и снимает верификацию с вашей программы.
  2. Обновите ваш PDA новыми метаданными верификации:
solana-verify verify-from-repo -um \
--program-id YourProgramId... \
https://github.com/your-org/your-program
  1. Отправьте новый запрос на верификацию, используя ваш орган обновления
  2. API проверит вашу новую версию на соответствие обновлённому PDA

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

Можно ли доверять результатам верификации?

Да — система спроектирована так, чтобы не требовать доверия и быть независимо проверяемой:

Что делает её заслуживающей доверия:

  • PDA в блокчейне: Метаданные вашей верификации хранятся в блокчейне и не контролируются центральным органом
  • Подтверждение полномочий обновления: Только орган обновления вашей программы может создавать/обновлять PDA
  • Независимая верификация: Любой может проверить, прочитав ваш PDA и запустив solana-verify локально
  • Непрерывная повторная верификация: API автоматически повторно проверяет все программы каждые 24 часа

Учитывайте эти ограничения:

  • Верификация подтверждает соответствие исходного кода развёртыванию — НЕ то, что ваш код безопасен
  • Всегда проверяйте код перед взаимодействием с программами
  • Верифицировано ≠ проаудировано или безопасно
  • Проверьте репозиторий и коммит в PDA, чтобы убедиться, что они из надёжного источника

Как я могу самостоятельно верифицировать программу?

Верифицируйте любую программу самостоятельно, прочитав её PDA в блокчейне и выполнив верификацию локально:

Шаг 1: Прочитайте PDA в блокчейне

# Install solana-verify if you haven't
cargo install solana-verify
# Get the PDA data
solana-verify list-program-pdas --program-id YourProgramId...

Шаг 2: Верифицируйте локально

# Verify using the repository and commit & other arguments from the PDA
solana-verify verify-from-repo \
--program-id YourProgramId... \
https://github.com/your-org/your-program
--commit-hash <commit-hash>
... (other arguments from the PDA)
# Confirm the hash output matches the on-chain program hash

Это доказывает:

  1. Метаданные PDA аутентичны (хранятся в блокчейне)
  2. Исходный код в репозитории PDA соответствует развёрнутой программе
  3. Вам не нужно доверять API — проверяйте всё самостоятельно в блокчейне

Может ли кто-то другой верифицировать мою программу без разрешения?

Да, именно поэтому мы требуем, чтобы подписывающей стороной был орган обновления. Мы считаем верификацию действительной, только если подписывающей стороной является орган обновления.

Что мне нужно для создания верифицируемых сборок?

Установите следующие инструменты:

  • Docker (для детерминированных сборок)
  • Cargo (менеджер пакетов Rust)
  • Solana Verify CLI: cargo install solana-verify
  • Публичный Git-репозиторий с вашим исходным кодом

Могу ли я верифицировать приватные репозитории?

Нет — верификация требует публичного исходного кода:

  • Ваш PDA хранит URL публичного репозитория, к которому может получить доступ любой желающий
  • Верификация без доверия зависит от публичного доступа к коду
  • Пользователям необходимо читать ваш исходный код, чтобы понять, что делает ваша программа
  • Вся цель заключается в том, чтобы позволить пользователям независимо проверить соответствие исходного кода развёртыванию

Приватные репозитории нарушают базовую модель доверия системы верификации.

Как мне верифицировать программу, управляемую Squads Multisig?

Следуйте этим шагам для программ, управляемых мультиподписью:

# 1. Build and deploy normally
solana-verify build
solana program deploy <your-program.so> --program-id YourProgramId...
# 2. Verify locally first - confirm the hash matches
solana-verify verify-from-repo -um \
--program-id YourProgramId... \
https://github.com/your-org/your-program
# 3. Export the PDA creation transaction
solana-verify export-pda-tx \
--program-id YourProgramId... \
https://github.com/your-org/your-program
# 4. Execute the PDA transaction through your Squads Multisig interface
# 5. After multisig execution, trigger remote verification
solana-verify remote submit-job \
--program-id YourProgramId... \
--uploader YourMultisigAddress...

Важно: Всегда выполняйте локальную верификацию (шаг 2), чтобы подтвердить соответствие хеша сборки перед экспортом транзакции PDA.

Заключение

Использование верифицированных сборок на Solana гарантирует целостность и надёжность ваших программ в сети и позволяет разработчикам находить ваши SDK напрямую через Solana Explorer. Используя инструменты, такие как Solana Verify CLI и Docker, вы можете поддерживать верифицируемые и безопасные сборки, соответствующие вашему исходному коду. Всегда принимайте необходимые меры предосторожности для использования согласованных окружений и рассматривайте решения для управления для безопасных обновлений и развёртываний.

Безопасность + Дисклеймер

Хотя верифицированные сборки являются мощным инструментом для обеспечения целостности ваших программ Solana, они не являются полностью безопасными в настройках по умолчанию. Docker-образы собираются и размещаются Solana Foundation.

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

Если вы хотите иметь полностью безопасную настройку, вы можете собрать docker-образы самостоятельно и разместить их на собственной инфраструктуре. Таким образом вы можете быть уверены, что docker-образы не подверглись вмешательству. Вы можете найти скрипты для создания собственных docker-образов в репозитории верифицированных сборок и можете создать форк и запустить github actions самостоятельно или проверить, что они корректны.

Кроме того, для удаленной верификации вы в определенной степени доверяете API OtterSec и Solana Explorer.

API или Solana Explorer могут потенциально отображать неверную информацию в случае компрометации.

Если вы хотите иметь полностью бездоверительную настройку, вы можете запустить Verify API самостоятельно или выполнить верификацию программы локально, используя команду verify-from-repo и данные верификации on-chain, которые сохранены в PDA, полученном из публичного ключа развертывания программы и программы верификации.

Программа верификации развернута командой OtterSec и пока не заморожена, поэтому может быть обновлена в любое время.

Solana Foundation, OtterSec и команда Ellipsis Labs не несут ответственности за любые убытки или ущерб, которые могут возникнуть в результате использования конвейера верифицированных сборок.

Security.txt для программ Solana

Помимо верифицированных сборок, вы также можете добавить файл security.txt к вашей программе. В будущем, после реализации, security.txt будет содержать публичный ключ верификатора для удобного доступа к данным верификации, хранящимся в PDA верификации. PDA, содержащий всю информацию, необходимую для сборки и верификации программы, формируется из адреса программы и публичного ключа верификатора. По умолчанию это тот же публичный ключ, который собрал и развернул программу. Но это также может быть другой публичный ключ, который можно указать в security.txt.

Функция security.txt позволяет разработчикам встраивать контактную информацию и информацию о безопасности непосредственно в свои смарт-контракты Solana. Вдохновленный securitytxt.org, этот подход предоставляет стандартизированный способ для исследователей безопасности связаться с сопровождающими проекта, даже если им известен только адрес контракта.

Зачем использовать security.txt?

Для многих проектов, особенно небольших или частных, идентификация разработчиков только по адресу контракта может быть сложной и трудоёмкой. Встраивание файла security.txt в программу гарантирует, что исследователи безопасности смогут легко связаться с нужными людьми, что потенциально предотвращает эксплойты и обеспечивает своевременное сообщение об ошибках.

Как внедрить security.txt

Чтобы добавить security.txt в вашу программу Solana, выполните следующие шаги:

Добавьте зависимость solana-security-txt в ваш Cargo.toml:

Cargo.toml
[dependencies]
solana-security-txt = "1.1.1"

Используйте макрос security_txt! в вашем контракте для определения информации о безопасности. Вы можете включить контактные данные, URL проекта и даже политику безопасности. Вот пример:

#[cfg(not(feature = "no-entrypoint"))]
use {default_env::default_env, solana_security_txt::security_txt};
#[cfg(not(feature = "no-entrypoint"))]
security_txt! {
name: "MyProject",
project_url: "https://myproject.com",
contacts: "email:security@myproject.com,discord:security#1234",
policy: "https://myproject.com/security-policy",
// Optional Fields
preferred_languages: "en,de",
source_code: "https://github.com/solana-developers/solana-game-preset",
source_revision: "5vJwnLeyjV8uNJSp1zn7VLW8GwiQbcsQbGaVSwRmkE4r",
source_release: "",
encryption: "",
auditors: "Verifier pubkey: 5vJwnLeyjV8uNJSp1zn7VLW8GwiQbcsQbGaVSwRmkE4r",
acknowledgements: "Thank you to our bug bounty hunters!"
}

После того как информация security.txt встроена в вашу программу, её можно легко запросить через такие инструменты, как Solana Explorer, что гарантирует доступность ваших контактных данных и информации о безопасности для всех, кто хочет сообщить о потенциальных проблемах.

Лучшие практики

  • Используйте ссылки: Для информации, которая может измениться (например, контактные данные), рекомендуется давать ссылку на веб-страницу, а не жёстко прописывать их в контракте. Это избавляет от необходимости частых обновлений программы.

  • Верификация: Перед развёртыванием проверьте формат и содержимое с помощью инструмента query-security-txt, который может валидировать как программы в блокчейне, так и локальные бинарные файлы:

query-security-txt target/bpfel-unknown-unknown/release/my_contract.so

Встраивая контактную информацию по безопасности непосредственно в ваш контракт, вы облегчаете исследователям возможность связаться с вами, способствуя улучшению безопасности и коммуникации в экосистеме Solana.

Это пример того, как security.txt выглядит в Solana Explorer

Проект security.txt поддерживается Neodyme Labs

Вы можете проверить статус верификации и просмотреть верифицированные программы на verify.osec.io.

Is this page helpful?

Содержание

Что такое проверенные сборки?Как это работает?Зачем использовать проверенные сборки?Как создать проверенные сборки?Установите Docker и CargoУстановите Solana Verify CLIПодготовка проектаСборка проверяемых программРазвёртывание проверяемых программПроверка с репозиториямиПроверка через публичный APIКак проверить вашу программу, если она управляется мультиподписью, такой как Squads1. Создайте проверяемую программу2. Разверните программу3. Зафиксируйте изменения и проверьте их в репозитории4. Передача полномочий программы мультиподписи5. Экспорт транзакции PDA6. Отправка транзакции через Squads7. Отправка удаленной задачи проверки8. Обновление программы (опционально)9. Экспорт и отправка новой транзакции PDAПроверка с использованием образа DockerПример проверенной сборкиПопулярные программы, которые уже провереныPhoenixSquads V3Drift V2Marginfi V2Часто задаваемые вопросыМоя верификация не проходит. Что делать?Хеш моей локальной сборки не совпадает с on-chain хешем. Почему?Сколько времени займёт моя верификация?Моя программа иммутабельна (нет upgrade authority). Как её верифицировать?Что такое PDA и почему это важно?Почему я должен создать PDA перед использованием API?Как часто следует проверять мою программу?Что происходит при обновлении моей программы?Можно ли доверять результатам верификации?Как я могу самостоятельно верифицировать программу?Может ли кто-то другой верифицировать мою программу без разрешения?Что мне нужно для создания верифицируемых сборок?Могу ли я верифицировать приватные репозитории?Как мне верифицировать программу, управляемую Squads Multisig?ЗаключениеБезопасность + ДисклеймерSecurity.txt для программ SolanaЗачем использовать security.txt?Как внедрить security.txtЛучшие практики
Редактировать страницу

Управляется

© 2026 Solana Foundation.
Все права защищены.
Связаться с нами