Podsumowanie
Programy wdrożone za pomocą loader-v3 mogą być aktualizowane, jeśli ustawiono autorytet do aktualizacji. Cofnięcie tego uprawnienia sprawia, że program staje się niezmienny. Omówiono mechanizm 9 kroków aktualizacji, wszystkie 9 instrukcji loader-v3, weryfikację kompilacji oraz 5 typów loaderów.
Wdrażanie programów
Native Rust
Wdrażanie przy użyciu Solana CLI z solana program deploy.
Anchor
Wdrażanie przy użyciu frameworka Anchor z anchor deploy.
Aktualizacja programów
Aby zaktualizować program, konto musi posiadać uprawnienia do aktualizacji
(zwykle jest to konto, które pierwotnie
wdrożyło program). Podczas wdrażania lub
aktualizacji nowy bajtkod jest przesyłany do tymczasowego konta bufora, a
następnie zapisywany na koncie programdata. Ustawienie autorytetu aktualizacji
na None sprawia, że program staje się niezmienny i trwale uniemożliwia
dalsze aktualizacje.
Mechanizm aktualizacji
Gdy
UpgradeableLoaderInstruction::Upgrade
zostanie przetworzony, środowisko uruchomieniowe:
- Weryfikuje, czy konto Program jest zapisywalne i należy do loader-v3.
- Weryfikuje, czy konto Buffer zawiera stan
Bufferz poprawnym autorytetem. - Weryfikuje, czy konto ProgramData ma zgodny
upgrade_authority_addressi nie jestNone. - Weryfikuje, czy program nie został już wdrożony w bieżącym slocie
(
clock.slot != slot). - Ładuje i weryfikuje nowe bajty ELF z bufora.
- Kopiuje nowy bajtkod z bufora do konta ProgramData i zeruje pozostałe bajty.
- Zasila konto ProgramData do poziomu zwolnienia z opłat za wynajem.
- Opróżnia konto bufora (ustawia lamports na 0) i przycina jego dane.
- Nowa wersja staje się aktywna w następnym slocie (
deployment_slot + 1).
Samo konto Program (jego stan oraz wskaźnik programdata_address) nie zmienia
się podczas aktualizacji. Aktualizowane są jedynie bajtkod konta
ProgramData oraz metadane slot.
Referencja instrukcji Loader-v3
Loader-v3 (BPF Loader Upgradeable) to obecnie domyślny loader do wdrażania programów na Solanie.
| Instrukcja | Opis |
|---|---|
InitializeBuffer | Ustawia stan konta bufora na Buffer z określonym autorytetem. Zwraca błąd, jeśli już zostało zainicjalizowane. |
Write | Zapisuje bajty pod wskazanym offsetem w koncie bufora. Wymagany podpis autorytetu. |
DeployWithMaxDataLen | Tworzy nowy program: wyprowadza adres ProgramData, tworzy konto ProgramData przez CPI do System Program, weryfikuje i wdraża ELF z bufora, ustawia stan konta Program i oznacza je jako wykonywalne. |
Upgrade | Zastępuje bajtkod w istniejącym koncie ProgramData programu z bufora. |
SetAuthority | Zmienia autorytet konta Buffer lub ProgramData. Ustawienie na None dla ProgramData sprawia, że program staje się niezmienny. Autorytetu Buffer nie można ustawić na None. |
SetAuthorityChecked | Jak SetAuthority, ale wymaga, aby nowy autorytet również podpisał transakcję. |
Close | Zamyka konto bufora, niezainicjalizowane lub ProgramData, przenosząc jego lamporty do odbiorcy. Zamknięcie ProgramData zapisuje również nagrobek Closed w cache programu. Nie można zamknąć programu wdrożonego w bieżącym slocie. |
ExtendProgramChecked | Rozszerza alokację konta ProgramData o dodatkowe bajty, finansując dodatkowy rent od płatnika. |
Migrate | Migruje program loader-v3 do loader-v4 poprzez przeniesienie własności konta programu i skopiowanie bajtkodu. Wymaga podpisu autorytetu migracji lub autorytetu aktualizacji programu. Loader-v4 nie jest jeszcze dostępny na mainnecie. |
Weryfikacja programów
Solana obsługuje weryfikowalne buildy, które pozwalają użytkownikom potwierdzić, że bajtkod programu znajdujący się w łańcuchu jest zgodny z jego publicznym kodem źródłowym. Framework Anchor zapewnia wbudowane wsparcie dla weryfikowalnych buildów.
Aby sprawdzić status weryfikacji wdrożonego programu, wyszukaj jego ID programu w Solana Explorer lub użyj narzędzia Ellipsis Labs Solana Verifiable Build CLI, aby niezależnie zweryfikować programy znajdujące się w łańcuchu.
Programy loaderów
| Loader | Adres | Możliwość aktualizacji | Opis |
|---|---|---|---|
| Native Loader | NativeLoader1111111111111111111111111111111 | Tylko przez aktualizację oprogramowania validatora | Zarządza wbudowanymi (System, Vote, Stake) i innymi loaderami |
| BPF Loader (v1) | BPFLoader1111111111111111111111111111111111 | Nie (zarządzanie loaderem wyłączone) | Programy legacy |
| BPF Loader (v2) | BPFLoader2111111111111111111111111111111111 | Nie (zarządzanie loaderem wyłączone) | Programy legacy |
| BPF Loader Upgradeable | BPFLoaderUpgradeab1e11111111111111111111111 | Tak, jeśli ustawiono autorytet do aktualizacji | Zarządza wszystkimi nowo wdrożonymi programami |
| Loader-v4 | LoaderV411111111111111111111111111111111111 | Tak, jeśli ustawiono autorytet | Jeszcze nie wydany na mainnecie |
Is this page helpful?