Документація 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

Нарешті, ви також можете безпосередньо перевірити програму через будь-кого, хто запускає 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 надсилає запит на збірку до API OtterSec, що запускає віддалену збірку вашої програми. Після завершення збірки система перевіряє, що хеш вашої програми в мережі відповідає хешу згенерованого артефакту збірки з вашого репозиторію.

За замовчуванням використовується 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, і нарешті в Інформаційній панелі Dune для перевірених програм, сприяючи більш здоровій екосистемі 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 та інших місцях.

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 ✅

Приклад верифікованої збірки

Ось приклад перевірки програми з ідентифікатором 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

Нарешті, ви також можете безпосередньо верифікувати програму через 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 ✅

Поширені запитання

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

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

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

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

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

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

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

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

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

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

Відстежуйте свій прогрес, використовуючи кінцеву точку статусу завдання.

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

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

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

Ваш PDA (адреса, похідна від програми) забезпечує перевірку без довіри:

  • Зберігання в ланцюзі: Зберігайте метадані перевірки (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, використовуючи свій орган оновлення з новим хешем коміту для оновленої програми.

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

Так - система розроблена так, щоб не вимагати довіри та бути незалежно перевіреною:

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

  • On-Chain PDA: Ваші метадані верифікації зберігаються в блокчейні, а не контролюються будь-яким центральним органом
  • Доказ повноважень на оновлення: Тільки повноваження на оновлення вашої програми може створити/оновити PDA
  • Незалежна верифікація: Будь-хто може перевірити, прочитавши ваш PDA та виконавши solana-verify локально
  • Постійна повторна верифікація: API автоматично перевіряє всі програми кожні 24 години

Зрозумійте ці обмеження:

  • Верифікація підтверджує, що вихідний код відповідає розгортанню - НЕ те, що ваш код безпечний
  • Завжди переглядайте код перед взаємодією з програмами
  • Верифікований ≠ аудований чи безпечний
  • Перевірте репозиторій і коміт у PDA, щоб підтвердити, що він походить із надійного джерела

Як я можу самостійно перевірити програму?

Перевірте будь-яку програму самостійно, прочитавши її on-chain PDA та виконавши верифікацію локально:

Крок 1: Прочитайте On-Chain 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 у репозиторії Verified builds, можете форкнути його та запустити GitHub Actions самостійно або перевірити їх коректність.

Крім того, для віддаленої верифікації ви певною мірою довіряєте OtterSec API та Solana Explorer.

API або Solana Explorer можуть потенційно відображати некоректну інформацію у разі компрометації.

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

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

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

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

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

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

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

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

Керується

© 2026 Фонд Solana.
Всі права захищені.
Залишайтеся на зв'язку