Programy

Na Solanie inteligentny kontrakt nazywany jest programem. Program to bezstanowe konto, które zawiera kod wykonywalny. Kod ten jest zorganizowany w funkcje nazywane instrukcjami. Użytkownicy interagują z programem, wysyłając transakcję zawierającą jedną lub więcej instrukcji. Transakcja może zawierać instrukcje z wielu programów.

Gdy program jest wdrażany, Solana używa LLVM do skompilowania go w format wykonywalny i linkowalny (ELF). Plik ELF zawiera binarny kod programu w formacie Solana Bytecode Format (sBPF) i jest zapisywany w łańcuchu bloków w koncie wykonywalnym.

sBPF to niestandardowa wersja kodu bajtowego eBPF używana przez Solanę.

Tworzenie programów

Większość programów jest pisana w języku Rust, z dwoma popularnymi podejściami do tworzenia oprogramowania:

  • Anchor: Anchor to framework zaprojektowany do szybkiego i łatwego tworzenia na Solanie. Wykorzystuje makra w Rust, aby zredukować ilość kodu szablonowego—co czyni go świetnym wyborem dla początkujących.
  • Natívny Rust: Pisanie programów w Rust bez użycia frameworków. To podejście oferuje większą elastyczność, ale wiąże się z większą złożonością.

Aktualizacja programów

Aby zmodyfikować istniejący program, konto musi być wyznaczone jako autorytet aktualizacji. (Zazwyczaj jest to to samo konto, które pierwotnie wdrożyło program.) Jeśli autorytet aktualizacji zostanie odwołany i ustawiony na None, program nie może być już aktualizowany.

Weryfikacja programów

Solana obsługuje weryfikowalne kompilacje, które pozwalają użytkownikom sprawdzić, czy kod programu w łańcuchu bloków odpowiada jego publicznemu kodowi źródłowemu. Framework Anchor zapewnia wbudowane wsparcie dla tworzenia weryfikowalnych kompilacji.

Aby sprawdzić, czy istniejący program jest zweryfikowany, wyszukaj jego ID programu w Solana Explorer. Alternatywnie możesz użyć narzędzia Ellipsis Labs Solana Verifiable Build CLI, aby niezależnie zweryfikować programy w łańcuchu bloków.

Wbudowane programy

System Program

System Program to jedyny program, który może tworzyć nowe konta. Domyślnie wszystkie nowe konta są własnością System Program, chociaż wiele z nich otrzymuje nowego właściciela w momencie tworzenia. System Program wykonuje następujące kluczowe funkcje:

FunkcjaOpis
Tworzenie nowych kontTylko System Program może tworzyć nowe konta.
Alokacja przestrzeniUstawia pojemność w bajtach dla pola danych każdego konta.
Przypisanie własności programuPo utworzeniu konta przez System Program, może on przypisać wyznaczonego właściciela programu do innego konta programu. W ten sposób niestandardowe programy przejmują własność nowych kont utworzonych przez System Program.
Transfer SOLPrzenosi lamporty (SOL) z kont System Program na inne konta.

Adres System Program to 11111111111111111111111111111111.

Programy ładujące

Każdy program jest własnością innego programu – swojego loadera. Loadery są używane do wdrażania, ponownego wdrażania, aktualizacji lub zamykania programów. Służą również do finalizacji programu i przekazania uprawnień programu.

Programy ładujące są czasami nazywane „BPF Loaders”.

Obecnie istnieje pięć programów ładujących, jak pokazano w poniższej tabeli.

LoaderID programuUwagiLink do instrukcji
nativeNativeLoader1111111111111111111111111111111Właściciel pozostałych czterech loaderów
v1BPFLoader1111111111111111111111111111111111Instrukcje zarządzania są wyłączone, ale programy nadal działają
v2BPFLoader2111111111111111111111111111111111Instrukcje zarządzania są wyłączone, ale programy nadal działająInstrukcje
v3BPFLoaderUpgradeab1e11111111111111111111111Programy mogą być aktualizowane po wdrożeniu. Wykonywalny program jest przechowywany w oddzielnym koncie danych programuInstrukcje
v4LoaderV411111111111111111111111111111111111W fazie rozwoju (niewydany)Instrukcje

Programy wdrożone za pomocą loader-v3 lub loader-v4 mogą być modyfikowalne po wdrożeniu, w zależności od uprawnień do ich aktualizacji.

Gdy nowy program jest wdrażany, domyślnie używana jest najnowsza wersja loadera.

Wstępnie skompilowane programy

Oprócz programów loader, Solana udostępnia następujące wstępnie skompilowane programy.

Weryfikacja podpisu ed25519

Program ed25519 służy do weryfikacji jednego lub więcej podpisów ed25519.

ProgramID programuOpisInstrukcje
Program Ed25519Ed25519SigVerify111111111111111111111111111Weryfikuje podpisy ed25519. Jeśli jakikolwiek podpis nie przejdzie, zwracany jest błąd.Instrukcje

Program ed25519 przetwarza instrukcję. Pierwszy u8 instrukcji zawiera liczbę podpisów do sprawdzenia, po której następuje pojedynczy bajt wypełnienia. Następnie dla każdego podpisu, który ma zostać sprawdzony, serializowana jest następująca struktura.

Ed25519SignatureOffsets
struct Ed25519SignatureOffsets {
signature_offset: u16, // offset to ed25519 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to public key of 32 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u16, // index of instruction data to get message data
}
Signature verification pseudocode
process_instruction() {
for i in 0..count {
// i'th index values referenced:
instructions = &transaction.message().instructions
instruction_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
}

Weryfikacja odzyskiwania klucza publicznego secp256k1

Program secp256k1 służy do weryfikacji operacji odzyskiwania klucza publicznego secp256k1.

ProgramID programuOpisInstrukcje
Program Secp256k1KeccakSecp256k11111111111111111111111111111Weryfikuje operacje odzyskiwania klucza publicznego secp256k1 (ecrecover).Instrukcje

Program secp256k1 przetwarza instrukcję. Pierwszy bajt instrukcji zawiera liczbę kluczy publicznych do sprawdzenia. Następnie dla każdego klucza publicznego tworzona jest struktura, która jest serializowana i dodawana do danych instrukcji.

Secp256k1SignatureOffsets
struct Secp256k1SignatureOffsets {
secp_signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytes
secp_signature_instruction_index: u8, // instruction index to find signature
secp_pubkey_offset: u16, // offset to ethereum_address pubkey of 20 bytes
secp_pubkey_instruction_index: u8, // instruction index to find pubkey
secp_message_data_offset: u16, // offset to start of message data
secp_message_data_size: u16, // size of message data
secp_message_instruction_index: u8, // instruction index to find message data
}
Recovery verification pseudocode
process_instruction() {
for i in 0..count {
// i'th index values referenced:
instructions = &transaction.message().instructions
signature = 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
}

To pozwala 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 jest używany do weryfikacji do 8 podpisów secp256r1.

ProgramID programuOpisInstrukcje
Program secp256r1Secp256r1SigVerify1111111111111111111111111Weryfikuje do 8 podpisów secp256r1. Przyjmuje podpis, klucz publiczny i wiadomość. Zwraca błąd, jeśli którykolwiek zawiedzie.Instrukcje

Program secp256r1 przetwarza instrukcję. Pierwszy u8 instrukcji to liczba podpisów do sprawdzenia, po której następuje pojedynczy bajt wypełnienia. Następnie dla każdego podpisu tworzona jest struktura, która jest serializowana i dodawana do danych instrukcji.

Secp256r1SignatureOffsets
struct Secp256r1SignatureOffsets {
signature_offset: u16, // offset to compact secp256r1 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to compressed public key of 33 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u16, // index of instruction data to get message data
}

Niskie wartości S są wymuszane dla wszystkich podpisów, aby uniknąć przypadkowej podatności na modyfikowalność podpisu.

Signature verification psuedocode
process_instruction() {
if data.len() < SIGNATURE_OFFSETS_START {
return Error
}
num_signatures = data[0] as usize
if num_signatures == 0 || num_signatures > 8 {
return Error
}
expected_data_size = num_signatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE + SIGNATURE_OFFSETS_START
if 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
}

Podstawowe programy

Programy wymienione poniżej zapewniają podstawową funkcjonalność sieci.

ProgramID programuOpisInstrukcje
System11111111111111111111111111111111Tworzenie nowych kont, przydzielanie danych konta, przypisywanie kont do programów właścicieli, transfer lamportów z kont należących do programu System oraz opłacanie opłat transakcyjnychSystemInstruction
VoteVote111111111111111111111111111111111111111Tworzenie i zarządzanie kontami śledzącymi stan głosowania walidatorów i nagrodyVoteInstruction
StakeStake11111111111111111111111111111111111111Tworzenie i zarządzanie kontami reprezentującymi stawki i nagrody za delegacje do walidatorówStakeInstruction
ConfigConfig1111111111111111111111111111111111111Dodawanie danych konfiguracyjnych do łańcucha, a następnie lista kluczy publicznych, które mogą je modyfikować. W przeciwieństwie do innych programów, program Config 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 przechowywanych w nim danychConfigInstruction
Compute BudgetComputeBudget111111111111111111111111111111Ustalanie limitów jednostek obliczeniowych i cen dla transakcji, umożliwiając użytkownikom kontrolowanie zasobów obliczeniowych i opłat za priorytetyzacjęComputeBudgetInstruction
Address Lookup TableAddressLookupTab1e1111111111111111111111111Zarządzanie tabelami wyszukiwania adresów, które pozwalają transakcjom odwoływać się do większej liczby kont, niż zmieściłoby się na liście kont transakcjiProgramInstruction
ZK ElGamal ProofZkE1Gama1Proof11111111111111111111111111111Zapewnia weryfikację dowodów zerowej wiedzy dla danych zaszyfrowanych za pomocą ElGamal

Is this page helpful?

Spis treści

Edytuj stronę

Zarządzane przez

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