Dokumentacja SolanaTworzenie programów

Weryfikacja programów

Ten przewodnik jest przeznaczony jako odniesienie dla deweloperów, którzy chcą wdrożyć zweryfikowane kompilacje dla swoich programów na platformie Solana. Omówimy, czym są zweryfikowane kompilacje, jak z nich korzystać, specjalne uwagi oraz najlepsze praktyki, aby zapewnić autentyczność Twojego programu w łańcuchu bloków.

Czym są zweryfikowane kompilacje?

Zweryfikowane kompilacje zapewniają, że wykonywalny program, który wdrażasz w sieci Solana, odpowiada kodowi źródłowemu w Twoim repozytorium. Dzięki temu deweloperzy i użytkownicy mogą mieć pewność, że program działający w łańcuchu bloków dokładnie odpowiada publicznej bazie kodu, co promuje przejrzystość i bezpieczeństwo.

Proces weryfikacji polega na porównaniu skrótu programu w łańcuchu bloków ze skrótem programu lokalnie zbudowanego z kodu źródłowego. To zapewnia brak rozbieżności między obiema wersjami.

Chociaż zweryfikowana kompilacja nie powinna być uważana za bardziej bezpieczną niż niezweryfikowana, umożliwia ona deweloperom samodzielne zweryfikowanie, że kod źródłowy odpowiada temu, co zostało wdrożone w łańcuchu bloków. Korzystając z kodu źródłowego, deweloper może następnie zweryfikować, co kod wykonuje podczas wysyłania transakcji.

Pipeline zweryfikowanych kompilacji został opracowany i jest utrzymywany przez Ellipsis Labs oraz OtterSec. Aby uzyskać więcej szczegółów, zapoznaj się z przewodnikiem w oryginalnym repozytorium zweryfikowanych kompilacji oraz procesem weryfikacji kompilacji bezpośrednio w zestawie narzędzi Anza, gdy tylko będzie tam obsługiwany.

Jak to działa?

Proces weryfikacji polega na porównaniu skrótu programu znajdującego się w łańcuchu bloków z hashem programu zbudowanego lokalnie z kodu źródłowego. Budujesz swój program w kontrolowanym środowisku, używając Solana Verify CLI i Dockera. Zapewnia to, że proces budowy jest deterministyczny i spójny na różnych systemach. Po uzyskaniu pliku wykonywalnego możesz wdrożyć go w sieci Solana. Podczas procesu budowy zostanie utworzony PDA programu verify. Ten PDA zawiera wszystkie dane niezbędne do weryfikacji programu. PDA zawiera adres programu, URL repozytorium git, hash commita oraz argumenty użyte do budowy programu.

Korzystając z danych zawartych w PDA, każdy może lokalnie uruchomić polecenie verify program i sprawdzić, czy program został zbudowany z dostarczonego kodu źródłowego. Następnie każdy może zweryfikować to samodzielnie, całkowicie bez zaufania, lub uruchomić własne verify API zarządzane przez OtterSec, aby zapewnić użytkownikom łatwy punkt dostępu do sprawdzania weryfikacji. Możesz już zobaczyć te wywołania API używane w Solana Explorer i SolanaFM, między innymi.

Dlaczego warto korzystać ze zweryfikowanych buildów?

Korzystanie ze zweryfikowanych buildów zapewnia następujące korzyści:

  • Bezpieczeństwo: Gwarancja, że program działający w łańcuchu bloków odpowiada kodowi źródłowemu, co zapobiega złośliwym zmianom.

  • Przejrzystość: Umożliwia innym użytkownikom i deweloperom weryfikację, że program w łańcuchu bloków jest godny zaufania, porównując go z publiczną bazą kodu.

  • Zaufanie: Zwiększa zaufanie użytkowników, ponieważ zweryfikowane buildy pokazują, że zachowanie programu w łańcuchu bloków jest zgodne z publicznym kodem. Tworząc programy możliwe do weryfikacji, minimalizujesz ryzyko związane z uruchamianiem nieautoryzowanego lub złośliwego kodu. Zapewnia to również zgodność z najlepszymi praktykami i ułatwia badaczom bezpieczeństwa kontakt z Tobą. Ponadto portfele i inne narzędzia mogą łatwiej akceptować transakcje z Twojego programu, o ile jest on zweryfikowany.

  • Odkrywalność: Gdy udostępniasz zweryfikowaną wersję swojego programu, każdy może znaleźć Twój kod źródłowy, dokumentację, SDK programu lub IDL, a także łatwo skontaktować się z Tobą przez GitHub w przypadku problemów.

Jak tworzyć zweryfikowane wersje?

Aby stworzyć zweryfikowane wersje, musisz wykonać następujące kroki:

Podsumowanie:

  • Zatwierdź swój kod w publicznym repozytorium
  • Zbuduj zweryfikowaną wersję w Dockerze
  • Wdróż zweryfikowaną wersję
  • Zweryfikuj wdrożony program względem publicznego API

Jeśli zweryfikujesz swój program, który nie został zbudowany w kontenerze Dockera, najprawdopodobniej weryfikacja się nie powiedzie, ponieważ kompilacje programów Solana nie są deterministyczne na różnych systemach.

Zainstaluj Docker i Cargo

Zainstaluj niezbędne narzędzia, upewnij się, że masz zainstalowane Docker i Cargo. Docker zapewnia kontrolowane środowisko kompilacji, aby zagwarantować spójność, a Cargo służy do zarządzania pakietami Rust.

  • Docker: Wykonaj kroki opisane na stronie Dockera, aby zainstalować Dockera dla swojej platformy. Po instalacji upewnij się, że usługa Dockera działa, postępując zgodnie z dalszymi wskazówkami w tym przewodniku.
  • Cargo: Jeśli nie masz jeszcze zainstalowanego Cargo, możesz je zainstalować, uruchamiając następujące polecenie:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Zainstaluj Solana Verify CLI

Solana Verify CLI to główne narzędzie używane do weryfikacji kompilacji. Solana Verify CLI jest obecnie utrzymywane przez Ellipsis Labs i można je zainstalować za pomocą Cargo.

Możesz je zainstalować, uruchamiając:

cargo install solana-verify

Jeśli potrzebujesz konkretnej wersji CLI, możesz przypiąć wersję za pomocą:

cargo install solana-verify --version $VERSION

Jeśli chcesz, możesz zainstalować wersję bezpośrednio z konkretnego commita:

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

Przygotowanie projektu

Aby zweryfikować względem repozytorium, musi ono zawierać plik Cargo.lock w katalogu głównym repozytorium. Jeśli masz tylko jeden program w repozytorium i plik cargo.lock w katalogu głównym, możesz przejść od razu do następnego kroku i zbudować swój program.

Jeśli Twój program znajduje się w podfolderze i korzystasz z workspace rust, musisz utworzyć plik workspace Cargo.toml w katalogu głównym repozytorium.

Możesz użyć tego przykładu Cargo.toml jako wzorca:

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

Upewnij się, że Twój program znajduje się w tablicy workspace/members oraz że Cargo.toml Twojego programu ma poprawnie skonfigurowaną nazwę lib.

Ważna jest lib name, a nie nazwa pakietu!

Coś takiego:

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"

W tym repozytorium możesz zobaczyć przykład workspace z programem w podfolderze. Zwróć także uwagę, że jeśli program jest w podfolderze, później musisz dodać ten folder jako --mount-path do polecenia verify-from-repo.

W tym repozytorium znajdziesz przykład z Anchor. W tym repozytorium znajdziesz przykład natywnego Rust.

Mając plik Cargo.toml na miejscu, możesz uruchomić cargo generate-lockfile, aby utworzyć plik lock i kontynuować budowanie programu.

Budowanie weryfikowalnych programów

Aby zweryfikowanie zbudować swój program Solana, przejdź do katalogu zawierającego plik Cargo.toml workspace i uruchom:

solana-verify build

To skopiuje Twoje środowisko do kontenera Docker i zbuduje je w sposób deterministyczny.

Upewnij się, że faktycznie wdrażasz zweryfikowaną kompilację i nie nadpisujesz jej przypadkowo przez anchor build lub cargo build-sbf, ponieważ najprawdopodobniej nie wygenerują one tego samego hasha i przez to weryfikacja się nie powiedzie.

W przypadku projektów z wieloma programami możesz zbudować konkretny program, używając nazwy biblioteki (a nie nazwy pakietu):

solana-verify build --library-name $PROGRAM_LIB_NAME

Ten proces zapewnia deterministyczne kompilacje i może zająć trochę czasu, szczególnie na niektórych systemach (np. M1 MacBook), ponieważ działa w kontenerze docker. Dla szybszych kompilacji zaleca się użycie maszyny z systemem Linux działającej na architekturze x86.

Po zakończeniu kompilacji możesz uzyskać hash pliku wykonywalnego za pomocą następującego polecenia:

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

Wdrażanie weryfikowalnych programów

Po zbudowaniu programu i uzyskaniu jego hasha możesz wdrożyć go w sieci Solana. Zaleca się użycie rozwiązania wielopodpisowego lub zarządzania, takiego jak Squads Protocol dla bezpiecznych wdrożeń, ale możesz również wdrożyć bezpośrednio za pomocą:

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

Obecnie odpowiednia niska opłata priorytetowa, którą możesz zażądać od swojego dostawcy rpc, na przykład Quicknode.

Aby zweryfikować, czy wdrożony program odpowiada zbudowanemu plikowi wykonywalnemu, uruchom:

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

Możesz mieć różne wersje wdrożone na różnych klastrach Solana (tj. devnet, testnet, mainnet). Upewnij się, że używasz poprawnego adresu URL sieci dla wybranego klastra Solana, który chcesz zweryfikować. Zdalna weryfikacja będzie działać tylko na mainnet.

Weryfikacja względem repozytoriów

Aby zweryfikować program względem jego publicznego repozytorium, użyj:

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

Podczas uruchamiania zweryfikowanej kompilacji w katalogu programu, przy wykonywaniu verify-from-repo musisz dodać flagę --mount-path. Będzie to ścieżka do folderu zawierającego Cargo.toml, który zawiera nazwę biblioteki twojego programu.

To polecenie porównuje hash programu znajdującego się w łańcuchu bloków z hashem wykonywalnym zbudowanym na podstawie źródła w określonym commicie.

Na końcu polecenie zapyta, czy chcesz przesłać dane weryfikacyjne na łańcuch bloków. Jeśli to zrobisz, Solana Explorer natychmiast wyświetli dane weryfikacyjne twojego programu. Dopóki nie zostanie zweryfikowany przez zdalne kompilowanie, będzie wyświetlany jako niezweryfikowany. Dowiedz się, jak możesz zweryfikować swój program za pomocą publicznego API w następnym kroku.

Jeśli chcesz zablokować weryfikację do konkretnego wydania, możesz dodać flagę --commit-hash do polecenia.

Weryfikacja za pomocą publicznego API

Na koniec możesz również bezpośrednio zweryfikować program za pomocą dowolnej osoby, która uruchamia API weryfikacyjne::

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

Zaleca się korzystanie z płatnego adresu RPC Url, ponieważ w przeciwnym razie możesz napotkać limity zapytań darmowych RPC. Zamiast -um powinieneś użyć --url yourRpcUrl dla bardziej niezawodnej weryfikacji.

Flaga --remote wysyła żądanie kompilacji do API OtterSec, co uruchamia zdalną kompilację twojego programu. Po zakończeniu kompilacji system weryfikuje, czy hash programu w łańcuchu bloków pasuje do hasha wygenerowanego artefaktu kompilacji z twojego repozytorium.

Domyślnie jest to API OtterSec.

Upewnij się, że wybierasz „tak”, gdy zostaniesz zapytany o przesłanie danych weryfikacyjnych na łańcuch bloków. API używa tego do weryfikacji, że przesłałeś dane weryfikacyjne.

Możesz również ręcznie uruchomić zdalne zadanie, używając:

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

Uploader to adres, który ma uprawnienia do zapisu w PDA. W większości przypadków powinien to być autorytet programu. Jeśli Twój program jest kontrolowany przez multisig, przejdź do sekcji weryfikacja multisig w tej instrukcji poniżej.

To wyśle zadanie do API OtterSec, a następnie możesz sprawdzić status zadania za pomocą:

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

Po pomyślnym zakończeniu weryfikacji, co może chwilę potrwać, będziesz mógł zobaczyć swój program jako zweryfikowany w API OtterSec dla pojedynczych programów oraz w Solana Explorer, SolanaFM, SolScan i ostatecznie także na stronie społecznościowej SolanaVerify.org utrzymywanej przez 0xDeep oraz w API zweryfikowanych programów OtterSec OtterSec verified programs API oraz w Verified Programs Dune Dashboard, przyczyniając się do zdrowszego ekosystemu Solana.

Jak zweryfikować program kontrolowany przez Multisig, taki jak Squads

Aby zdalna weryfikacja działała, musisz zapisać dane weryfikacyjne w PDA podpisanym przez autorytet programu. Jeśli Twój program jest kontrolowany przez multisig, możesz wyeksportować tę transakcję zapisu PDA i przesłać ją za pomocą Squads Protocol lub innego rozwiązania multisig według własnego wyboru.

1. Zbuduj weryfikowalny program

Najpierw zbuduj program:

solana-verify build

To polecenie zbuduje weryfikowalną kompilację przy użyciu kontenera docker z wersją solana określoną w pliku Cargo.lock.

2. Wdróż program

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

W dalszej części tego przewodnika po multisig będziemy używać przykładowego ID programu 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD.

3. Zatwierdź i zweryfikuj w repozytorium

Gdy to zostanie wykonane, zatwierdzamy projekt do GitHuba. Oto przykład: https://github.com/solana-developers/verify-squads

Opcjonalnie: sprawdź, czy możesz najpierw zweryfikować lokalnie (to polecenie używa przykładowego ID programu 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD):

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

Tylko po to, aby upewnić się, że Twoje parametry są poprawne.

4. Przenieś uprawnienia programu do multisig

Jeśli jeszcze tego nie zrobiłeś, przenieś uprawnienia swojego programu do multisig i skopiuj autorytet multisig. Będzie Ci potrzebny w następnym kroku.

5. Eksportuj transakcję PDA

Gdy masz lokalnie uprawnienia do programu, zostaniesz poproszony o przesłanie danych kompilacji do łańcucha bloków przy użyciu polecenia solana-verify verify-from-repo.

Ponieważ nie możesz tego zrobić, używając multisig, musisz ręcznie wyeksportować transakcję PDA, a następnie uruchomić transakcję za pomocą 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

To polecenie zwróci transakcję w formacie base58. Jeśli potrzebujesz transakcji zakodowanej w base64 do użycia w inspektorze transakcji, możesz użyć --encoding base64.

P6vBfcPaaXb8fZoT3NBAYEcdtEj7tubA1k2gBxmFKZ3UWF5YyrmDMFTvLKALCJoUuRsPAjMckudYruCu3eeWQtuDrFbEMLxLFutnKXac974fnkMivcwUdY66VLjbxQT6ATmcy7F4hBtz1G4P1h6iBJLhb8WtrtgY3i4qq45MUEb7RjuMEfUFXKrNgPdGxkz5xvMHq3dxKRcpmEK5k2DkeW6SUQYBVe19Ga3B9GyhTX8k3CMt9JCEah13WyRnQd8GjoK6sTEvGJym6xDNvmd8yiJYSNcaYwEJsjHEUf4Yh6kAC7ki2KRvVAr3NVe1gjqK9McrwSQjtUatvydTG8Zovcr7PPUEMf3yPMgKXjZLB2QpkH63yTTYdNAnWFuv9E6b6nYRqye5XcNi436yKw5U14fXh65yK34bgYLi9328UT1huJELsJU9BRGnGUmb6GWp6c2WL5BhnzgNTSnt9TXFfEgUMzhvKzpVBxLP44hwqqBdyUhHFysCF37531PnmiESq8x1xou23xJ6FcQbc199754MkqQd7tX9CUznGzAEqHGkzn3VBoJnojsKtgYmiTYbdRsT1CU18MbYEE7WvGAvXyxxbpNzbAcc94HrnM6cqRGmwhEBroPfFghTdmzg9D

6. Prześlij transakcję za pomocą Squads

Przejdź do kreatora transakcji Squads i zaimportuj transakcję zakodowaną w base58. Upewnij się, że w symulacji transakcja zawiera tylko wywołanie programu weryfikacyjnego osec i programu budżetu komputerowego, i nic więcej!

7. Prześlij zdalne zadanie weryfikacyjne

Gdy transakcja do Squads zakończy się sukcesem, możesz przesłać zdalne zadanie:

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

To wszystko! Zweryfikowałeś swój program w publicznym repozytorium i przesłałeś zdalne zadanie do API OtterSec. Powinno to być widoczne w solana explorer i innych miejscach.

8. Aktualizacja programu (opcjonalne)

Podczas aktualizacji programu musisz wyeksportować nową transakcję PDA i ponownie przesłać ją za pośrednictwem Squads.

Wykonywanie aktualizacji programu:

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

Następnie przekaż autorytet bufora do multisig lub bezpośrednio utwórz bufor z autorytetem multisig.

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

9. Eksport i przesłanie nowej transakcji PDA

Nie zapomnij zatwierdzić swoich zmian w github. Ponownie wyeksportuj transakcję aktualizacji PDA:

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

Ponownie prześlij transakcję za pośrednictwem Squads.

Przykładową transakcję możesz zobaczyć tutaj.

Następnie prześlij do kolejnej zdalnej kompilacji:

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

Powinno to skutkować czymś takim:

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

Gratulacje, zweryfikowałeś swój program po aktualizacji multisig!

Weryfikacja z obrazu docker

Możesz również zweryfikować swój program względem obrazu docker, uruchamiając następujące polecenie:

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

To polecenie ładuje obraz zapisany pod adresem ellipsislabs/hello_world_verifiable_build:latest i weryfikuje, czy hash ścieżki wykonywalnej w kontenerze jest taki sam jak hash programu on-chain przekazanego do polecenia. Ponieważ build został już przesłany do obrazu, nie ma potrzeby pełnej rekompilacji pliku wykonywalnego, co mogłoby zająć dużo czasu.

Dockerfile, który tworzy obraz ellipsislabs/hello_world_verifiable_build:latest, znajduje się w repozytorium ellipsis labs /examples/hello_world.

Poniżej znajduje się oczekiwany wynik:

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 ✅

Przykładowa zweryfikowana kompilacja

Oto przykład weryfikacji przykładowego programu o ID FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv przy użyciu kodu źródłowego z tego repozytorium:

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

Domyślnie polecenie verify-from-repo pobiera ostatni commit z głównej gałęzi. Możesz także określić konkretny commit, jeśli chcesz dalej pracować nad repozytorium, używając parametru commit-hash: --commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e

Na koniec możesz również bezpośrednio zweryfikować program za pomocą 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

Polecenie --remote wysyła żądanie kompilacji do API OtterSec, co uruchamia zdalną kompilację twojego programu. Po zakończeniu kompilacji system weryfikuje, czy hash programu w łańcuchu bloków odpowiada hashowi wygenerowanego artefaktu kompilacji z twojego repozytorium.

Popularne programy, które już zostały zweryfikowane

Phoenix

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

Końcowy wynik:

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

Zwróć uwagę, że musieliśmy określić library-name, ponieważ repozytorium Squads zawiera wiele programów. Używamy flagi --bpf, ponieważ squads_mpl był wcześniej zweryfikowany z Anchor.

Końcowy wynik:

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

Końcowy wynik:

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

Końcowy wynik:

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

Najczęściej zadawane pytania

Moja weryfikacja kończy się niepowodzeniem. Co powinienem zrobić?

Sprawdź te typowe problemy:

  • Nieprawidłowy podpisujący: Potwierdź, że Twój podpisujący jest uprawnieniem do aktualizacji programu, uruchamiając solana program show YourProgramId
  • Brak PDA on-chain: Uruchom solana-verify verify-from-repo -um i wybierz TAK po wyświetleniu pytania. Bez przesłania PDA, API nie może pobrać Twoich metadanych weryfikacji.
  • Niezgodność danych PDA: Zaktualizuj swój PDA, jeśli ponownie wdrożyłeś swój program. Dane PDA muszą być zgodne z wdrożonym programem.
  • Nieprawidłowy hash commit: Utwórz swój PDA używając dokładnego hash commit, który wdrożyłeś
  • Różnice w środowisku budowania: Użyj Dockera z solana-verify podczas tworzenia swojego PDA

Mój lokalny hash kompilacji nie pasuje do hash on-chain. Dlaczego?

Zazwyczaj oznacza to:

  • Używasz różnych wersji toolchain Rust/Solana
  • Twoje zależności zostały zaktualizowane pomiędzy kompilacjami
  • Nie kompilowałeś w kontenerze Docker
  • Pobrałeś niewłaściwy commit

Rozwiąż to, kompilując za pomocą solana-verify build w Dockerze, używając dokładnego commit, który wdrożyłeś.

Jak długo potrwa moja weryfikacja?

Spodziewaj się następujących ram czasowych w zależności od rozmiaru programu:

  • Proste programy: 1-5 minut
  • Złożone programy: 5-15 minut
  • Bardzo duże programy: Do 30 minut

Śledź postęp, używając endpointu statusu zadania.

Mój program jest niezmienny (brak uprawnień do aktualizacji). Jak mogę go zweryfikować?

Jeśli Twój program nie ma uprawnień do aktualizacji lub został uczyniony niezmiennym, zanim mogłeś utworzyć PDA, mamy dla tej sytuacji adres na białej liście. Skontaktuj się z nami pod adresem contact@osec.io, a pomożemy Ci zweryfikować Twój program.

Czym jest PDA i dlaczego ma znaczenie?

Twoje PDA (Program Derived Account) umożliwia weryfikację bez zaufania:

  • Przechowywanie On-Chain: Przechowuj metadane weryfikacji (URL repozytorium, hash commita, parametry budowania) on-chain w PDA należącym do programu Otter Verify (verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC)
  • Kryptograficzne Powiązanie: Twoje PDA jest wyprowadzone z adresu Twojego programu, tworząc niezmienne powiązanie z danymi weryfikacji
  • Zdecentralizowane Zaufanie: Każdy może odczytać Twoje PDA i niezależnie zweryfikować Twój program

Dlaczego muszę utworzyć PDA przed użyciem API?

API działa tylko z on-chain PDA, ponieważ:

  • Bez Zaufania: API odrzuca arbitralne dane - używa tylko tego, co Twój upgrade authority zapisał on-chain
  • Prostsze: Po prostu podaj signer + program_id; API pobiera wszystko inne z Twojego PDA
  • Odporne na Manipulacje: Twoje PDA tworzy niezmienny zapis, który każdy może zweryfikować niezależnie
  • Dowód Własności: Twój signer musi być upgrade authority, kryptograficznie potwierdzając, że kontrolujesz program

Jak często powinienem weryfikować swój program?

Weryfikuj swój program:

  • Po każdym wdrożeniu lub aktualizacji
  • Gdy aktualizujesz swoje repozytorium źródłowe
  • Nie martw się o ponowną weryfikację w innych przypadkach - API automatycznie ponownie weryfikuje wszystkie programy co 24 godziny

Co się dzieje, gdy aktualizuję swój program?

Wykonaj te kroki po aktualizacji:

  1. API wykrywa Twoją aktualizację i usuwa weryfikację Twojego programu.
  2. Zaktualizuj swoje PDA nowymi metadanymi weryfikacji:
solana-verify verify-from-repo -um \
--program-id YourProgramId... \
https://github.com/your-org/your-program
  1. Prześlij nowe żądanie weryfikacji używając swojego upgrade authority
  2. API zweryfikuje Twoją nową wersję względem zaktualizowanego PDA

Ważne: Zawsze aktualizuj swoje PDA używając upgrade authority z nowym hash commita dla zaktualizowanego programu.

Czy mogę zaufać wynikom weryfikacji?

Tak – system jest zaprojektowany tak, aby był niezależny i możliwy do samodzielnej weryfikacji:

Co czyni go godnym zaufania:

  • PDA On-Chain: Twoje metadane weryfikacji są przechowywane w blockchainie, nie są kontrolowane przez żaden centralny organ
  • Dowód uprawnień do aktualizacji: Tylko organ uprawniony do aktualizacji Twojego programu może utworzyć/zaktualizować PDA
  • Niezależna weryfikacja: Każdy może zweryfikować, odczytując Twoje PDA i uruchamiając solana-verify lokalnie
  • Ciągła ponowna weryfikacja: API automatycznie ponownie weryfikuje wszystkie programy co 24 godziny

Zrozum te ograniczenia:

  • Weryfikacja potwierdza, że kod źródłowy odpowiada wdrożeniu – NIE potwierdza, że Twój kod jest bezpieczny
  • Zawsze przeglądaj kod przed interakcją z programami
  • Zweryfikowany ≠ poddany audytowi lub bezpieczny
  • Sprawdź repozytorium i commit w PDA, aby upewnić się, że pochodzi z zaufanego źródła

Jak mogę samodzielnie zweryfikować program?

Zweryfikuj dowolny program samodzielnie, odczytując jego PDA w blockchainie i uruchamiając weryfikację lokalnie:

Krok 1: Odczytaj PDA w blockchainie

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

Krok 2: Zweryfikuj lokalnie

# 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

To dowodzi:

  1. Metadane PDA są autentyczne (przechowywane w blockchainie)
  2. Kod źródłowy w repozytorium PDA odpowiada wdrożonemu programowi
  3. Nie musisz ufać API – zweryfikuj wszystko samodzielnie w blockchainie

Czy ktoś inny może zweryfikować mój program bez pozwolenia?

Tak, dlatego wymagamy, aby osobą podpisującą był organ uprawniony do aktualizacji. Weryfikację uznajemy za ważną tylko wtedy, gdy osoba podpisująca jest organem uprawnionym do aktualizacji.

Czego potrzebuję do tworzenia weryfikowalnych kompilacji?

Zainstaluj te narzędzia:

  • Docker (do deterministycznych kompilacji)
  • Cargo (menedżer pakietów Rust)
  • Solana Verify CLI: cargo install solana-verify
  • Publiczne repozytorium Git z Twoim kodem źródłowym

Czy mogę weryfikować prywatne repozytoria?

Nie - weryfikacja wymaga publicznego kodu źródłowego:

  • Twoje PDA przechowuje publiczny adres URL repozytorium, do którego każdy ma dostęp
  • Weryfikacja bezpośrednia zależy od publicznego dostępu do kodu
  • Użytkownicy muszą przeczytać Twój kod źródłowy, aby zrozumieć, co robi Twój program
  • Cały cel polega na umożliwieniu użytkownikom niezależnej weryfikacji zgodności źródła z wdrożeniem

Prywatne repozytoria psują podstawowy model zaufania systemu weryfikacji.

Jak zweryfikować program kontrolowany przez Squads Multisig?

Wykonaj następujące kroki dla programów kontrolowanych przez 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...

Krytyczne: Zawsze weryfikuj lokalnie (krok 2), aby potwierdzić, że hash kompilacji się zgadza przed wyeksportowaniem transakcji PDA.

Podsumowanie

Używanie zweryfikowanych kompilacji na Solanie zapewnia integralność i wiarygodność Twoich programów w sieci oraz umożliwia programistom bezpośrednie znalezienie Twoich SDK z poziomu Solana Explorer. Wykorzystując narzędzia takie jak Solana Verify CLI i Docker, możesz utrzymywać weryfikowalne i bezpieczne kompilacje zgodne z Twoim kodem źródłowym. Zawsze podejmuj niezbędne środki ostrożności, aby używać spójnych środowisk i rozważ rozwiązania zarządzania dla bezpiecznych aktualizacji i wdrożeń.

Bezpieczeństwo + Zastrzeżenie

Chociaż zweryfikowane kompilacje są potężnym narzędziem zapewniającym integralność Twoich programów Solana, nie są one całkowicie bezpośrednie w domyślnej konfiguracji. Obrazy dockera są budowane i hostowane przez Solana Foundation.

Pamiętaj, że budujesz swój projekt w pobranym obrazie dockera i że cała Twoja konfiguracja jest kopiowana do tego obrazu dockera w celu kompilacji, w tym potencjalnie wrażliwe informacje.

Jeśli chcesz mieć całkowicie bezpośrednią konfigurację, możesz sam zbudować obrazy dockera i hostować je na własnej infrastrukturze. W ten sposób możesz mieć pewność, że obrazy dockera nie zostały zmodyfikowane. Skrypty do tworzenia własnych obrazów dockera znajdziesz w repozytorium Verified builds, możesz je sforkować i uruchomić akcje github samodzielnie lub zweryfikować ich poprawność.

Ponadto w przypadku zdalnej weryfikacji w pewnym stopniu ufasz API OtterSec oraz Solana Explorer.

API lub Solana Explorer mogą potencjalnie wyświetlać nieprawidłowe informacje, jeśli zostaną naruszone.

Jeśli chcesz mieć całkowicie beztrustawą konfigurację, możesz samodzielnie uruchomić Verify API lub przeprowadzić weryfikację programu lokalnie za pomocą polecenia verify-from-repo, wykorzystując dane weryfikacyjne w łańcuchu zapisane w PDA, które jest wyprowadzone z organu wdrażającego program i programu weryfikacyjnego.

Program weryfikacyjny został wdrożony przez zespół OtterSec i nie jest jeszcze zamrożony, więc może być w dowolnym momencie zaktualizowany.

Solana Foundation, OtterSec oraz zespół Ellipsis Labs nie ponoszą odpowiedzialności za jakiekolwiek straty lub szkody, które mogą wystąpić w wyniku korzystania z potoku zweryfikowanych kompilacji.

Security.txt dla programów Solana

Oprócz zweryfikowanych kompilacji możesz również dodać plik security.txt do swojego programu. W przyszłości, po implementacji, security.txt będzie zawierać klucz publiczny weryfikatora w celu łatwego dostępu do danych weryfikacyjnych przechowywanych w PDA weryfikacyjnym. PDA zawierający wszystkie informacje potrzebne do zbudowania i zweryfikowania programu jest wyprowadzany z adresu programu i klucza publicznego weryfikatora. Domyślnie jest to ten sam klucz publiczny, który zbudował i wdrożył program. Ale może to być również inny klucz publiczny, który można określić w security.txt.

Funkcja security.txt pozwala deweloperom osadzać informacje kontaktowe i bezpieczeństwa bezpośrednio w ich inteligentnych kontraktach Solana. Zainspirowane securitytxt.org, to podejście zapewnia standaryzowany sposób, dzięki któremu badacze bezpieczeństwa mogą skontaktować się z opiekunami projektu, nawet jeśli znają tylko adres kontraktu.

Po co używać security.txt?

W przypadku wielu projektów, szczególnie mniejszych lub prywatnych, identyfikacja deweloperów na podstawie samego adresu kontraktu może być trudna i czasochłonna. Osadzenie pliku security.txt w programie zapewnia, że badacze bezpieczeństwa mogą łatwo skontaktować się z odpowiednimi osobami, potencjalnie zapobiegając exploitom i zapewniając terminowe zgłaszanie błędów.

Jak zaimplementować security.txt

Aby dodać security.txt do swojego programu Solana, wykonaj następujące kroki:

Dodaj zależność solana-security-txt do swojego pliku Cargo.toml:

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

Użyj makra security_txt! w swoim kontrakcie, aby zdefiniować informacje o bezpieczeństwie. Możesz dołączyć dane kontaktowe, adresy URL projektu, a nawet politykę bezpieczeństwa. Oto przykład:

#[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!"
}

Po osadzeniu informacji security.txt w programie można je łatwo odpytać za pomocą narzędzi takich jak Solana Explorer, zapewniając dostępność danych kontaktowych i informacji o bezpieczeństwie dla każdego, kto chce zgłosić potencjalne problemy.

Najlepsze praktyki

  • Używaj linków: W przypadku informacji, które mogą się zmieniać (np. dane kontaktowe), zaleca się linkowanie do strony internetowej zamiast kodowania ich na stałe w kontrakcie. Pozwala to uniknąć częstych aktualizacji programu.

  • Weryfikacja: Przed wdrożeniem zweryfikuj format i zawartość za pomocą narzędzia query-security-txt, które może walidować zarówno programy onchain, jak i lokalne pliki binarne:

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

Osadzając informacje kontaktowe dotyczące bezpieczeństwa bezpośrednio w swoim kontrakcie, ułatwiasz badaczom dotarcie do Ciebie, wspierając lepsze bezpieczeństwo i komunikację w ekosystemie Solana.

To jest przykład tego, jak security.txt wygląda w Solana Explorer

Projekt security.txt jest utrzymywany przez Neodyme Labs

Możesz sprawdzić status weryfikacji i przeglądać zweryfikowane programy na verify.osec.io.

Is this page helpful?

Spis treści

Czym są zweryfikowane kompilacje?Jak to działa?Dlaczego warto korzystać ze zweryfikowanych buildów?Jak tworzyć zweryfikowane wersje?Zainstaluj Docker i CargoZainstaluj Solana Verify CLIPrzygotowanie projektuBudowanie weryfikowalnych programówWdrażanie weryfikowalnych programówWeryfikacja względem repozytoriówWeryfikacja za pomocą publicznego APIJak zweryfikować program kontrolowany przez Multisig, taki jak Squads1. Zbuduj weryfikowalny program2. Wdróż program3. Zatwierdź i zweryfikuj w repozytorium4. Przenieś uprawnienia programu do multisig5. Eksportuj transakcję PDA6. Prześlij transakcję za pomocą Squads7. Prześlij zdalne zadanie weryfikacyjne8. Aktualizacja programu (opcjonalne)9. Eksport i przesłanie nowej transakcji PDAWeryfikacja z obrazu dockerPrzykładowa zweryfikowana kompilacjaPopularne programy, które już zostały zweryfikowanePhoenixSquads V3Drift V2Marginfi V2Najczęściej zadawane pytaniaMoja weryfikacja kończy się niepowodzeniem. Co powinienem zrobić?Mój lokalny hash kompilacji nie pasuje do hash on-chain. Dlaczego?Jak długo potrwa moja weryfikacja?Mój program jest niezmienny (brak uprawnień do aktualizacji). Jak mogę go zweryfikować?Czym jest PDA i dlaczego ma znaczenie?Dlaczego muszę utworzyć PDA przed użyciem API?Jak często powinienem weryfikować swój program?Co się dzieje, gdy aktualizuję swój program?Czy mogę zaufać wynikom weryfikacji?Jak mogę samodzielnie zweryfikować program?Czy ktoś inny może zweryfikować mój program bez pozwolenia?Czego potrzebuję do tworzenia weryfikowalnych kompilacji?Czy mogę weryfikować prywatne repozytoria?Jak zweryfikować program kontrolowany przez Squads Multisig?PodsumowanieBezpieczeństwo + ZastrzeżenieSecurity.txt dla programów SolanaPo co używać security.txt?Jak zaimplementować security.txtNajlepsze praktyki
Edytuj stronę

Zarządzane przez

© 2026 Solana Foundation.
Wszelkie prawa zastrzeżone.
Bądź na bieżąco