Цей посібник призначений бути довідником для розробників, які хочуть впровадити перевірені збірки для своїх програм на 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 як шаблон:
[workspace]members = ["program/programs/*"]resolver = "2"[profile.release]overflow-checks = truelto = "fat"codegen-units = 1[profile.release.build-override]opt-level = 3incremental = falsecodegen-units = 1
Переконайтеся, що ваша програма знаходиться в масиві workspace/members і що
Cargo.toml вашої програми має правильно налаштовану назву lib.
Важливим є
lib name, а не назва пакета!
Щось на кшталт цього:
[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 muchsolana 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 buildsolana 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-3454c1c2b5b3Verification in progress... ⏳ [00:18:02] ✅ Process completed. (Done in 18minutes) Program 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD has been verified.✅ The provided GitHub build matches the onchain hash. On Chain Hash:96f8c3d9400258f7759408d1f6f8435b4a24d9b52f5a0340d97907e567cb8773 ExecutableHash: 96f8c3d9400258f7759408d1f6f8435b4a24d9b52f5a0340d97907e567cb8773 Repo URL:https://github.com/Woody4618/verify-squads/tree/0fb0a2e30c15c51732c0ad5e837975a6f7bbc7edCheck the verification status at:https://verify.osec.io/status/6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD Joburl: https://verify.osec.io/job/b63339d2-163e-49ac-b55d-3454c1c2b5b3
Вітаємо, ви перевірили свою програму після оновлення через мультипідпис!
Перевірка через Docker-образ
Ви також можете перевірити свою програму за допомогою Docker-образу, виконавши таку команду:
solana-verify verify-from-image -eexamples/hello_world/target/deploy/hello_world.so -iellipsislabs/hello_world_verifiable_build:latest -p2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn
Ця команда завантажує образ, збережений за адресою
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 ID2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn Executable path in container:"examples/hello_world/target/deploy/hello_world.so"Executable hash:08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Program hash:08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Executablematches 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: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9Onchain Program Hash: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9Program 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: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205cOnchain Program Hash: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205cProgram 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: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828Onchain Program Hash: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828Program 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: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5Onchain Program Hash: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5Program 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 години
Що відбувається після оновлення програми?
Виконайте наступні кроки після оновлення:
- API виявляє ваше оновлення та скасовує верифікацію програми.
- Оновіть ваш PDA з новими метаданими верифікації:
solana-verify verify-from-repo -um \--program-id YourProgramId... \https://github.com/your-org/your-program
- Надішліть новий запит на верифікацію за допомогою вашого upgrade authority
- API верифікує вашу нову версію відповідно до оновленого PDA
Важливо: Завжди оновлюйте ваш PDA за допомогою upgrade authority з новим хешем коміту для оновленої програми.
Чи можна довіряти результатам верифікації?
Так — система розроблена як довірчо-незалежна та незалежно верифікована:
Що робить її надійною:
- PDA на ланцюжку: Ваші метадані верифікації зберігаються в мережі, без контролю з боку будь-якого центрального органу
- Доказ повноважень на оновлення: Лише власник повноважень на оновлення вашої програми може створювати/оновлювати PDA
- Незалежна верифікація: Будь-хто може перевірити, прочитавши ваш PDA та
запустивши
solana-verifyлокально - Безперервна реверифікація: API автоматично повторно верифікує всі програми кожні 24 години
Врахуйте ці обмеження:
- Верифікація підтверджує відповідність джерельного коду розгортанню — але НЕ те, що ваш код є безпечним
- Завжди перевіряйте код перед взаємодією з програмами
- Верифіковано ≠ аудитовано або безпечно
- Перевіряйте репозиторій і коміт у PDA, щоб переконатися, що вони з надійного джерела
Як я можу самостійно верифікувати програму?
Верифікуйте будь-яку програму самостійно, прочитавши її PDA в мережі та запустивши верифікацію локально:
Крок 1: Зчитайте PDA з ланцюжка
# Install solana-verify if you haven'tcargo install solana-verify# Get the PDA datasolana-verify list-program-pdas --program-id YourProgramId...
Крок 2: Верифікуйте локально
# Verify using the repository and commit & other arguments from the PDAsolana-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
Це доводить:
- Метадані PDA є автентичними (зберігаються в мережі)
- Вихідний код у репозиторії PDA відповідає розгорнутій програмі
- Вам не потрібно довіряти API — верифікуйте все самостійно в мережі
Чи може хтось інший верифікувати мою програму без дозволу?
Так, саме тому ми вимагаємо, щоб підписантом був власник повноважень на оновлення. Ми вважаємо верифікацію дійсною лише в тому разі, якщо підписант є власником повноважень на оновлення.
Що мені потрібно для створення верифікованих збірок?
Встановіть такі інструменти:
- Docker (для детермінованих збірок)
- Cargo (менеджер пакетів Rust)
- Solana Verify CLI:
cargo install solana-verify - Публічний Git-репозиторій із вашим вихідним кодом
Чи можу я верифікувати приватні репозиторії?
Ні — верифікація вимагає відкритого вихідного коду:
- Ваш PDA зберігає URL публічного репозиторію, доступного для всіх
- Верифікація без довіри залежить від відкритого доступу до коду
- Користувачі повинні мати можливість читати ваш вихідний код, щоб зрозуміти, що робить ваша програма
- Вся мета полягає в тому, щоб дозволити користувачам незалежно перевірити відповідність вихідного коду розгортанню
Приватні репозиторії руйнують основну модель довіри системи верифікації.
Як верифікувати програму, керовану Squads Multisig?
Виконайте ці кроки для програм під управлінням мультипідпису:
# 1. Build and deploy normallysolana-verify buildsolana program deploy <your-program.so> --program-id YourProgramId...# 2. Verify locally first - confirm the hash matchessolana-verify verify-from-repo -um \--program-id YourProgramId... \https://github.com/your-org/your-program# 3. Export the PDA creation transactionsolana-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 verificationsolana-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:
[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 Fieldspreferred_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?