Документація 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, вам потрібно створити файл Cargo.toml workspace у кореневій директорії вашого репозиторію.

Ви можете використати цей приклад 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. У цьому репозиторії ви можете знайти приклад нативного Rust.

Маючи цей файл Cargo.toml, ви можете виконати cargo generate-lockfile, щоб створити lock-файл і продовжити збірку вашої програми.

Збірка програм, що підлягають перевірці

Щоб верифіковано зібрати вашу Solana-програму, перейдіть до директорії, що містить файл Cargo.toml вашого workspace, і виконайте:

solana-verify build

Це скопіює ваше середовище в контейнер Docker і збере його детерміністичним способом.

Переконайтеся, що ви дійсно розгортаєте верифіковану збірку і випадково не перезаписуєте її за допомогою anchor build або cargo build-sbf, оскільки вони, швидше за все, не призведуть до того самого хешу, і тому ваша верифікація не вдасться.

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

solana-verify build --library-name $PROGRAM_LIB_NAME

Цей процес забезпечує детерміновані збірки і може зайняти деякий час, особливо на певних системах (наприклад, MacBook M1), оскільки він виконується всередині контейнера docker. Для швидших збірок рекомендується використовувати Linux-машину з архітектурою x86.

Після завершення збірки ви можете отримати хеш виконуваного файлу за допомогою наступної команди:

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

Після того як ви завантажите свій верифікаційний PDA в мережу за допомогою verify-from-repo, надішліть завдання віддаленої верифікації до OtterSec API:

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

--uploader — це адреса, яка завантажила верифікаційний PDA, зазвичай це авторитет оновлення вашої програми. Якщо ваша програма контролюється мультипідписом, перейдіть до розділу верифікація через мультипідпис у цьому посібнику нижче.

Застарілий прапорець --remote у verify-from-repo більше не підтримується. Спочатку завантажте свій PDA, а потім виконайте remote submit-job.

Це надсилає завдання до OtterSec API. Ви можете перевірити статус завдання за допомогою:

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

Після успішного завершення верифікації, що може зайняти деякий час, ви зможете побачити свою програму як верифіковану в OtterSec API для окремих програм та в Solana Explorer, SolanaFM, SolScan, а також на спільнотному вебсайті SolanaVerify.org, який підтримується 0xDeep та OtterSec verified programs API, і зрештою на 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

У решті цього посібника з мультипідпису ми використовуватимемо приклад 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 onchain 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, та перевіряє, що хеш виконуваного шляху в контейнері збігається з хешем програми в мережі, наданої команді. Оскільки збірка вже була завантажена до образу, немає потреби в повному перескладанні виконуваного файлу, що може зайняти bагато часу.

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 onchain 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 використовує останній коміт у гілці main. Ви також можете вказати певний коміт, якщо хочете продовжити роботу з репозиторієм, використовуючи параметр commit-hash: --commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e

Коли з'явиться запит, дайте ствердну відповідь, щоб завантажити ваш верифікаційний PDA в мережу. Потім надішліть задачу віддаленої верифікації через OtterSec API:

solana-verify remote submit-job --program-id FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv --uploader <your-upgrade-authority>

Популярні програми, які вже верифіковані

Phoenix

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

Кінцевий результат:

Executable Program Hash from repo: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9
Onchain 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
Onchain 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
Onchain 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
Onchain Program Hash: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5
Program hash matches ✅

Часті запитання

Моя верифікація не проходить. Що робити?

Перевірте поширені проблеми:

  • Неправильний підписант: Переконайтеся, що ваш підписант є авторитетом оновлення програми, виконавши solana program show YourProgramId
  • Відсутній PDA в мережі: Виконайте solana-verify verify-from-repo -um і виберіть ТАК, коли буде запропоновано. Без завантаження PDA API не зможе отримати ваші метадані верифікації.
  • Невідповідність даних PDA: Оновіть свій PDA, якщо ви повторно розгорнули програму. Дані вашого PDA повинні відповідати розгорнутій програмі.
  • Неправильний хеш коміту: Створіть свій PDA, використовуючи точний хеш коміту, який ви розгорнули
  • Відмінності в середовищі збірки: Використовуйте Docker із solana-verify під час створення вашого PDA

Хеш моєї локальної збірки не збігається з хешем у мережі. Чому?

Зазвичай це означає:

  • Ви використовуєте різні версії інструментарію Rust/Solana
  • Ваші залежності були оновлені між збірками
  • Ви не збирали в контейнері Docker
  • Ви переключилися на неправильний коміт

Виправте це, зібравши за допомогою solana-verify build у Docker, використовуючи точний коміт, який ви розгорнули.

Скільки часу займе моя верифікація?

Очікуйте такі терміни залежно від розміру вашої програми:

  • Прості програми: 1–5 хвилин
  • Складні програми: 5–15 хвилин
  • Дуже великі програми: до 30 хвилин

Відстежуйте прогрес за допомогою ендпоінту статусу завдання.

Моя програма є незмінною (без авторитету оновлення). Як її верифікувати?

Якщо ваша програма не має авторитету оновлення або була зроблена незмінною до того, як ви могли створити PDA, у нас є адреса з білого списку для цієї ситуації. Зв'яжіться з нами за адресою contact@osec.io, і ми допоможемо верифікувати вашу програму.

Що таке PDA і чому це важливо?

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

  • Зберігання в мережі: Зберігайте метадані верифікації (URL репозиторію, хеш коміту, параметри збірки) в мережі у PDA, що належить програмі Otter Verify (verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC)
  • Криптографічний зв'язок: Ваш PDA похідний від адреси вашої програми, що створює незмінний зв'язок із вашими даними верифікації
  • Децентралізована довіра: Будь-хто може прочитати ваш PDA та незалежно верифікувати вашу програму

Чому потрібно створити PDA перед використанням API?

API працює лише з PDA в мережі, оскільки:

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

Як часто потрібно верифікувати програму?

Верифікуйте вашу програму:

  • Після кожного розгортання або оновлення
  • Коли ви оновлюєте вихідний репозиторій
  • Не турбуйтеся про повторну верифікацію в інших випадках — API автоматично повторно верифікує всі програми кожні 24 години

Що відбувається після оновлення програми?

Виконайте наступні кроки після оновлення:

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

Важливо: Завжди оновлюйте ваш PDA за допомогою upgrade authority з новим хешем коміту для оновленої програми.

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

Так — система розроблена як довірчо-незалежна та незалежно верифікована:

Що робить її надійною:

  • 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 onchain 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, використовуючи дані верифікації з мережі, що зберігаються в PDA, яка виводиться з авторитету розгортання програми та програми верифікації.

Програма верифікації розгорнута командою OtterSec і ще не заморожена, тому може бути оновлена у будь-який момент.

Фонд Solana, OtterSec та команда Ellipsis Labs не несуть відповідальності за будь-які втрати або збитки, що можуть виникнути внаслідок використання конвеєра верифікованих збірок.

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

Окрім верифікованих збірок, ви також можете додати файл security.txt до своєї програми. У майбутньому, після реалізації, security.txt міститиме публічний ключ верифікатора для зручного доступу до даних верифікації, що зберігаються у PDA верифікації. PDA, що містить всю інформацію, необхідну для збірки та верифікації програми, виводиться з адреси програми та pubkey верифікатора. За замовчуванням це той самий pubkey, який зібрав і розгорнув програму. Але це також може бути інший pubkey, який можна вказати у 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, що забезпечує доступність ваших контактних даних та відомостей про безпеку для всіх, хто bажає повідомити про потенційні проблеми.

Найкращі практики

  • Використовуйте посилання: для інформації, яка може змінюватися (наприклад, контактні дані), рекомендується посилатися на веб-сторінку, а не жорстко кодувати її в контракті. Це дозволяє уникнути необхідності частих оновлень програми.

  • Верифікація: перед розгортанням перевірте формат і вміст за допомогою інструменту 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. Експортуйте PDA-транзакцію6. Надішліть транзакцію через Squads7. Надішліть завдання на віддалену перевірку8. Оновлення програми (Необов'язково)9. Експорт та надсилання нової транзакції PDAПеревірка через Docker-образПриклад верифікованої збіркиПопулярні програми, які вже верифікованіPhoenixSquads V3Drift V2Marginfi V2Часті запитанняМоя верифікація не проходить. Що робити?Хеш моєї локальної збірки не збігається з хешем у мережі. Чому?Скільки часу займе моя верифікація?Моя програма є незмінною (без авторитету оновлення). Як її верифікувати?Що таке PDA і чому це важливо?Чому потрібно створити PDA перед використанням API?Як часто потрібно верифікувати програму?Що відбувається після оновлення програми?Чи можна довіряти результатам верифікації?Як я можу самостійно верифікувати програму?Чи може хтось інший верифікувати мою програму без дозволу?Що мені потрібно для створення верифікованих збірок?Чи можу я верифікувати приватні репозиторії?Як верифікувати програму, керовану Squads Multisig?ВисновокБезпека + Відмова від відповідальностіSecurity.txt для програм SolanaНавіщо використовувати security.txt?Як реалізувати security.txtНайкращі практики
Редагувати сторінку