Programy
Na Solanie "smart kontrakty" nazywane są programami. Programy są wdrażane w łańcuchu na kontach, które zawierają skompilowany plik wykonywalny programu. Użytkownicy współdziałają z programami, wysyłając transakcje zawierające instrukcje, które określają, co program ma zrobić.
Kluczowe informacje
- Programy to konta zawierające kod wykonywalny, zorganizowany w funkcje zwane instrukcjami.
- Chociaż programy są bezstanowe, mogą zawierać instrukcje tworzące i aktualizujące inne konta do przechowywania danych.
- Autorytet aktualizacji może aktualizować programy. Po usunięciu tego autorytetu program staje się niezmienny.
- Użytkownicy mogą zweryfikować, czy dane konta programu w łańcuchu zgadzają się z jego publicznym kodem źródłowym, dzięki weryfikowalnym kompilacjom.
Pisanie programów na Solanie
Programy na Solanie są głównie pisane w języku programowania Rust, przy użyciu dwóch popularnych podejść do tworzenia:
-
Anchor: Framework zaprojektowany do tworzenia programów na Solanie. Umożliwia szybsze i prostsze pisanie programów, wykorzystując makra Rust do redukcji kodu szablonowego. Dla początkujących zaleca się rozpoczęcie od frameworka Anchor.
-
Natywny Rust: Podejście to polega na pisaniu programów na Solanie w języku Rust bez użycia frameworków. Oferuje większą elastyczność, ale wiąże się z większą złożonością.
Aktualizowanie programów na Solanie
Aby dowiedzieć się więcej o wdrażaniu i aktualizowaniu programów, zobacz stronę wdrażanie programów.
Programy mogą być
bezpośrednio modyfikowane
przez konto wyznaczone jako "autorytet aktualizacji", którym zazwyczaj jest
konto, które pierwotnie wdrożyło program. Jeśli
autorytet aktualizacji
zostanie odwołany i ustawiony na None
, program staje się niezmienny i nie może
być już aktualizowany.
Programy weryfikowalne
Weryfikowalne kompilacje pozwalają każdemu sprawdzić, czy kod programu na łańcuchu bloków odpowiada jego publicznemu kodowi źródłowemu, co umożliwia wykrycie rozbieżności między kodem źródłowym a wdrożonymi wersjami.
Społeczność deweloperów Solana wprowadziła narzędzia wspierające weryfikowalne kompilacje, umożliwiając zarówno deweloperom, jak i użytkownikom weryfikację, czy programy na łańcuchu bloków dokładnie odzwierciedlają ich publicznie udostępniony kod źródłowy.
-
Wyszukiwanie zweryfikowanych programów: Aby szybko sprawdzić zweryfikowane programy, użytkownicy mogą wyszukać adres programu w Solana Explorer. Przykład zweryfikowanego programu można zobaczyć tutaj.
-
Narzędzia weryfikacyjne: Narzędzie Solana Verifiable Build CLI stworzone przez Ellipsis Labs pozwala użytkownikom niezależnie weryfikować programy na łańcuchu bloków względem opublikowanego kodu źródłowego.
-
Wsparcie dla weryfikowalnych kompilacji w Anchor: Anchor oferuje wbudowane wsparcie dla weryfikowalnych kompilacji. Szczegóły można znaleźć w dokumentacji Anchor.
Berkeley Packet Filter (BPF)
Solana używa LLVM (Low Level Virtual Machine) do kompilacji programów do plików w formacie ELF (Executable and Linkable Format). Pliki te zawierają niestandardową wersję bajtkodu eBPF Solany, zwaną "Solana Bytecode Format" (sBPF). Plik ELF zawiera binarny kod programu i jest przechowywany na łańcuchu w koncie wykonawczym, gdy program jest wdrażany.
Wbudowane programy
Programy ładujące
Każdy program jest własnością innego programu, który jest jego loaderem. Obecnie istnieje pięć programów loaderów:
Loader | ID programu | Uwagi | Link do instrukcji |
---|---|---|---|
native | NativeLoader1111111111111111111111111111111 | Właściciel pozostałych czterech loaderów | — |
v1 | BPFLoader1111111111111111111111111111111111 | Instrukcje zarządzania są wyłączone, ale programy nadal działają | — |
v2 | BPFLoader2111111111111111111111111111111111 | Instrukcje zarządzania są wyłączone, ale programy nadal działają | Instrukcje |
v3 | BPFLoaderUpgradeab1e11111111111111111111111 | Jest wycofywany | Instrukcje |
v4 | LoaderV411111111111111111111111111111111111 | v4 ma stać się standardowym loaderem | Instrukcje |
Te loadery są niezbędne do tworzenia i zarządzania programami niestandardowymi:
- Wdrożenie nowego programu lub bufora
- Zamknięcie programu lub bufora
- Ponowne wdrożenie / aktualizacja istniejącego programu
- Przekazanie uprawnień nad programem
- Finalizacja programu
Loader-v3 i loader-v4 wspierają modyfikacje programów po ich początkowym wdrożeniu. Uprawnienia do tego są regulowane przez autorytet programu, ponieważ własność konta każdego programu należy do loadera.
Wstępnie skompilowane programy
Program Ed25519
Program | ID programu | Opis | Instrukcje |
---|---|---|---|
Program Ed25519 | Ed25519SigVerify111111111111111111111111111 | Weryfikuje podpisy ed25519. Jeśli jakikolwiek podpis nie przejdzie, zwracany jest błąd. | Instrukcje |
Program ed25519 przetwarza instrukcję. Pierwszy u8
to liczba podpisów do
sprawdzenia, po której następuje pojedynczy bajt wypełnienia. Następnie
serializowana jest poniższa struktura, jedna dla każdego podpisu do sprawdzenia.
struct Ed25519SignatureOffsets {signature_offset: u16, // offset to ed25519 signature of 64 bytessignature_instruction_index: u16, // instruction index to find signaturepublic_key_offset: u16, // offset to public key of 32 bytespublic_key_instruction_index: u16, // instruction index to find public keymessage_data_offset: u16, // offset to start of message datamessage_data_size: u16, // size of message datamessage_instruction_index: u16, // index of instruction data to get message data}
Pseudokod weryfikacji podpisu:
process_instruction() {for i in 0..count {// i'th index values referenced:instructions = &transaction.message().instructionsinstruction_index = ed25519_signature_instruction_index != u16::MAX ? ed25519_signature_instruction_index : current_instruction;signature = instructions[instruction_index].data[ed25519_signature_offset..ed25519_signature_offset + 64]instruction_index = ed25519_pubkey_instruction_index != u16::MAX ? ed25519_pubkey_instruction_index : current_instruction;pubkey = instructions[instruction_index].data[ed25519_pubkey_offset..ed25519_pubkey_offset + 32]instruction_index = ed25519_message_instruction_index != u16::MAX ? ed25519_message_instruction_index : current_instruction;message = instructions[instruction_index].data[ed25519_message_data_offset..ed25519_message_data_offset + ed25519_message_data_size]if pubkey.verify(signature, message) != Success {return Error}}return Success}
Program Secp256k1
Program | ID programu | Opis | Instrukcje |
---|---|---|---|
Program Secp256k1 | KeccakSecp256k11111111111111111111111111111 | Weryfikuje operacje odzyskiwania klucza publicznego secp256k1 (ecrecover). | Instrukcje |
Program secp256k1 przetwarza instrukcję, która jako pierwszy bajt przyjmuje liczbę poniższych struktur zserializowanych w danych instrukcji:
struct Secp256k1SignatureOffsets {secp_signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytessecp_signature_instruction_index: u8, // instruction index to find signaturesecp_pubkey_offset: u16, // offset to ethereum_address pubkey of 20 bytessecp_pubkey_instruction_index: u8, // instruction index to find pubkeysecp_message_data_offset: u16, // offset to start of message datasecp_message_data_size: u16, // size of message datasecp_message_instruction_index: u8, // instruction index to find message data}
Pseudokod weryfikacji odzyskiwania:
process_instruction() {for i in 0..count {// i'th index values referenced:instructions = &transaction.message().instructionssignature = instructions[secp_signature_instruction_index].data[secp_signature_offset..secp_signature_offset + 64]recovery_id = instructions[secp_signature_instruction_index].data[secp_signature_offset + 64]ref_eth_pubkey = instructions[secp_pubkey_instruction_index].data[secp_pubkey_offset..secp_pubkey_offset + 20]message_hash = keccak256(instructions[secp_message_instruction_index].data[secp_message_data_offset..secp_message_data_offset + secp_message_data_size])pubkey = ecrecover(signature, recovery_id, message_hash)eth_pubkey = keccak256(pubkey[1..])[12..]if eth_pubkey != ref_eth_pubkey {return Error}}return Success}
Pozwala to użytkownikowi określić dowolne dane instrukcji w transakcji dla podpisu i danych wiadomości. Określając specjalny sysvar instrukcji, można również otrzymać dane bezpośrednio z samej transakcji.
Koszt transakcji będzie obliczany jako liczba podpisów do weryfikacji pomnożona przez mnożnik kosztu weryfikacji podpisu.
Program Secp256r1
Program | ID programu | Opis | Instrukcje |
---|---|---|---|
Program Secp256r1 | Secp256r1SigVerify1111111111111111111111111 | Weryfikuje do 8 podpisów secp256r1. Przyjmuje podpis, klucz publiczny i wiadomość. Zwraca błąd, jeśli którykolwiek z nich nie przejdzie weryfikacji. | Instrukcje |
Program secp256r1 przetwarza instrukcję. Pierwszy u8
to liczba podpisów do
sprawdzenia, po której następuje jednobajtowe wypełnienie. Następnie
serializowana jest następująca struktura, jedna dla każdego podpisu do
sprawdzenia:
struct Secp256r1SignatureOffsets {signature_offset: u16, // offset to compact secp256r1 signature of 64 bytessignature_instruction_index: u16, // instruction index to find signaturepublic_key_offset: u16, // offset to compressed public key of 33 bytespublic_key_instruction_index: u16, // instruction index to find public keymessage_data_offset: u16, // offset to start of message datamessage_data_size: u16, // size of message datamessage_instruction_index: u16, // index of instruction data to get message data}
Pseudokod weryfikacji podpisu:
process_instruction() {if data.len() < SIGNATURE_OFFSETS_START {return Error}num_signatures = data[0] as usizeif num_signatures == 0 || num_signatures > 8 {return Error}expected_data_size = num_signatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE + SIGNATURE_OFFSETS_STARTif data.len() < expected_data_size {return Error}for i in 0..num_signatures {offsets = parse_signature_offsets(data, i)signature = get_data_slice(data, instruction_datas, offsets.signature_instruction_index, offsets.signature_offset, SIGNATURE_SERIALIZED_SIZE)if s > half_curve_order {return Error}pubkey = get_data_slice(data, instruction_datas, offsets.public_key_instruction_index, offsets.public_key_offset, COMPRESSED_PUBKEY_SERIALIZED_SIZE)message = get_data_slice(data, instruction_datas, offsets.message_instruction_index, offsets.message_data_offset, offsets.message_data_size)if !verify_signature(signature, pubkey, message) {return Error}}return Success}
Uwaga: Niskie wartości S są wymuszane dla wszystkich podpisów, aby uniknąć przypadkowej podatności na modyfikację podpisu.
Programy podstawowe
Geneza klastra Solana zawiera listę specjalnych programów, które zapewniają podstawowe funkcje dla sieci. Historycznie były one określane jako programy "natywne" i były dystrybuowane razem z kodem walidatora.
Program | ID programu | Opis | Instrukcje |
---|---|---|---|
Program systemowy | 11111111111111111111111111111111 | Tworzenie nowych kont, przydzielanie danych konta, przypisywanie kont do programów właścicieli, transfer lamportów z kont należących do Programu Systemowego oraz opłacanie opłat transakcyjnych. | SystemInstruction |
Program głosowania | Vote111111111111111111111111111111111111111 | Tworzenie i zarządzanie kontami śledzącymi stan głosowania walidatorów i nagrody. | VoteInstruction |
Program stakingu | Stake11111111111111111111111111111111111111 | Tworzenie i zarządzanie kontami reprezentującymi staking i nagrody za delegacje do walidatorów. | StakeInstruction |
Program konfiguracji | Config1111111111111111111111111111111111111 | Dodawanie danych konfiguracyjnych do łańcucha, a następnie lista kluczy publicznych, które mogą je modyfikować. W przeciwieństwie do innych programów, program Konfiguracji nie definiuje żadnych indywidualnych instrukcji. Ma tylko jedną domyślną instrukcję: "store". Dane instrukcji to zestaw kluczy, które kontrolują dostęp do konta i danych do zapisania w nim. | ConfigInstruction |
Program budżetu obliczeniowego | ComputeBudget111111111111111111111111111111 | Ustawianie limitów jednostek obliczeniowych i cen dla transakcji, umożliwiając użytkownikom kontrolowanie zasobów obliczeniowych i opłat priorytetowych. | ComputeBudgetInstruction |
Program tabeli adresów | AddressLookupTab1e1111111111111111111111111 | Zarządzanie tabelami adresów, które pozwalają transakcjom odwoływać się do większej liczby kont, niż mogłoby się zmieścić na liście kont transakcji. | ProgramInstruction |
Program dowodów ZK ElGamal | ZkE1Gama1Proof11111111111111111111111111111 | Zapewnia weryfikację dowodów zerowej wiedzy dla danych zaszyfrowanych za pomocą ElGamal. | — |
Is this page helpful?