Programma's

Op Solana wordt een smart contract een programma genoemd. Een programma is een stateless account dat uitvoerbare code bevat. Deze code is georganiseerd in functies die instructies worden genoemd. Gebruikers interacteren met een programma door een transactie te versturen die een of meerdere instructies bevat. Een transactie kan instructies van meerdere programma's bevatten.

Wanneer een programma wordt geïmplementeerd, gebruikt Solana LLVM om het te compileren naar executable and linkable format (ELF). Het ELF-bestand bevat de binaire code van het programma in Solana Bytecode Format (sBPF) en wordt on-chain opgeslagen in een uitvoerbaar account.

sBPF is Solana's aangepaste versie van eBPF bytecode.

Programma's schrijven

De meerderheid van de programma's wordt geschreven in Rust, met twee veelvoorkomende ontwikkelingsbenaderingen:

  • Anchor: Anchor is een framework ontworpen voor snelle en eenvoudige Solana-ontwikkeling. Het gebruikt Rust macros om boilerplate code te verminderen —wat het ideaal maakt voor beginners.
  • Native Rust: Schrijf programma's in Rust zonder gebruik te maken van frameworks. Deze aanpak biedt meer flexibiliteit maar gaat gepaard met verhoogde complexiteit.

Programma's bijwerken

Om een bestaand programma te wijzigen, moet een account worden aangewezen als de upgrade authority. (Meestal hetzelfde account dat oorspronkelijk het programma heeft geïmplementeerd.) Als de upgrade authority wordt ingetrokken en ingesteld op null, kan het programma niet meer worden bijgewerkt.

Programma's verifiëren

Solana ondersteunt verifieerbare builds, waarmee gebruikers kunnen controleren of de on-chain code van een programma overeenkomt met de openbare broncode. Het Anchor framework biedt ingebouwde ondersteuning voor het maken van een verifieerbare build.

Om te controleren of een bestaand programma geverifieerd is, zoek je naar de programma-ID op de Solana Explorer. Alternatief kun je de Ellipsis Labs Solana Verifiable Build CLI gebruiken om on-chain programma's onafhankelijk te verifiëren.

Ingebouwde programma's

Het System Program

Het System Program is het enige account dat nieuwe accounts kan aanmaken. Standaard zijn alle nieuwe accounts eigendom van het System Program, hoewel veel accounts bij aanmaak een nieuwe eigenaar krijgen toegewezen. Het System Program voert de volgende belangrijke functies uit:

FunctieBeschrijving
Aanmaken van nieuwe accountsAlleen het System Program kan nieuwe accounts aanmaken.
RuimtetoewijzingStelt de bytecapaciteit in voor het gegevensveld van elk account.
Toewijzen van programma-eigendomZodra het System Program een account heeft aangemaakt, kan het de aangewezen programma-eigenaar opnieuw toewijzen aan een ander program account. Zo nemen aangepaste programma's eigendom over van nieuwe accounts die door het System Program zijn aangemaakt.
SOL overmakenMaakt lamports (SOL) over van System Accounts naar andere accounts.

Het adres van het system program is 11111111111111111111111111111111.

Loader-programma's

Elk programma is eigendom van een ander—zijn loader. Loaders worden gebruikt om programma's te implementeren, opnieuw te implementeren, te upgraden of te sluiten. Ze worden ook gebruikt om een programma te finaliseren en programmabeheer over te dragen.

Loader-programma's worden soms 'BPF Loaders' genoemd.

Er zijn momenteel vijf loader-programma's, zoals weergegeven in de onderstaande tabel.

LoaderProgram IDOpmerkingenInstructies link
nativeNativeLoader1111111111111111111111111111111Is eigenaar van de andere vier loaders
v1BPFLoader1111111111111111111111111111111111Beheerinstructies zijn uitgeschakeld, maar programma's worden nog steeds uitgevoerd
v2BPFLoader2111111111111111111111111111111111Beheerinstructies zijn uitgeschakeld, maar programma's worden nog steeds uitgevoerdInstructies
v3BPFLoaderUpgradeab1e11111111111111111111111Programma's kunnen worden bijgewerkt na implementatie. Programma-uitvoerbaar bestand wordt opgeslagen in een apart program data accountInstructies
v4LoaderV411111111111111111111111111111111111In ontwikkeling (nog niet uitgebracht)Instructies

Programma's die zijn geïmplementeerd met loader-v3 of loader-v4 kunnen na implementatie worden gewijzigd, zoals bepaald door de upgrade-autoriteit.

Wanneer een nieuw programma wordt geïmplementeerd, wordt standaard de nieuwste loader-versie gebruikt.

Voorgecompileerde programma's

Naast de loader-programma's biedt Solana de volgende voorgecompileerde programma's.

Verifieer ed25519 handtekening

Het ed25519-programma wordt gebruikt om een of meer ed25519-handtekeningen te verifiëren.

ProgrammaProgramma-IDBeschrijvingInstructies
Ed25519 ProgrammaEd25519SigVerify111111111111111111111111111Verifieert ed25519-handtekeningen. Als een handtekening mislukt, wordt een fout geretourneerd.Instructies

Het ed25519-programma verwerkt een instructie. De eerste u8 van de instructie bevat een telling van het aantal handtekeningen dat moet worden gecontroleerd, gevolgd door een enkele byte padding. Daarna wordt de volgende struct geserialiseerd, één voor elke handtekening die moet worden gecontroleerd.

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
}

Verifieer secp256k1 herstel

Het secp256k1-programma wordt gebruikt om secp256k1 publieke sleutel hersteloperaties te verifiëren.

ProgrammaProgramma-IDBeschrijvingInstructies
Secp256k1 ProgrammaKeccakSecp256k11111111111111111111111111111Verifieert secp256k1 publieke sleutel hersteloperaties (ecrecover).Instructies

Het secp256k1-programma verwerkt een instructie. De eerste byte van de instructie bevat een telling van het aantal publieke sleutels dat moet worden gecontroleerd. Daarna wordt de volgende struct eenmaal voor elke publieke sleutel aangemaakt, vervolgens geserialiseerd en toegevoegd aan de instruction data.

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
}

Dit stelt de gebruiker in staat om willekeurige instruction data in de transactie te specificeren voor handtekening- en berichtgegevens. Door een speciale instructions sysvar te specificeren, kan men ook gegevens ontvangen van de transactie zelf.

De kosten van de transactie worden berekend door het aantal te verifiëren handtekeningen te vermenigvuldigen met de handtekeningkostenverificatievermenigvuldiger.

Het secp256r1-programma wordt gebruikt om maximaal 8 secp256r1-handtekeningen te verifiëren.

ProgramProgram IDBeschrijvingInstructies
Secp256r1 ProgramSecp256r1SigVerify1111111111111111111111111Verifieert maximaal 8 secp256r1-handtekeningen. Neemt een handtekening, publieke sleutel en bericht. Geeft een fout als er een mislukt.Instructies

Het secp256r1-programma verwerkt een instructie. De eerste u8 van de instructie bevat een telling van het aantal handtekeningen dat moet worden gecontroleerd, gevolgd door een enkele byte padding. Daarna wordt de volgende struct voor elke handtekening gemaakt, vervolgens geserialiseerd en toegevoegd aan de instruction data.

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
}

Lage S-waarden worden afgedwongen voor alle handtekeningen om onbedoelde handtekeningveranderbaarheid te voorkomen.

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
}

Kernprogramma's

De programma's in de onderstaande lijst bieden de kernfunctionaliteit van het netwerk.

ProgramProgram IDBeschrijvingInstructies
System11111111111111111111111111111111Maak nieuwe accounts, wijs accountgegevens toe, wijs accounts toe aan eigenaarsprogramma's, draag lamports over van System Program-owned accounts en betaal transactiekostenSystemInstruction
VoteVote111111111111111111111111111111111111111Maak en beheer accounts die de stemstatus en beloningen van validators bijhoudenVoteInstruction
StakeStake11111111111111111111111111111111111111Maak en beheer accounts die stake en beloningen vertegenwoordigen voor delegaties aan validatorsStakeInstruction
ConfigConfig1111111111111111111111111111111111111Voeg configuratiegegevens toe aan de chain, gevolgd door de lijst met publieke sleutels die deze mogen wijzigen. In tegenstelling tot de andere programma's definieert het Config-programma geen individuele instructies. Het heeft slechts één impliciete instructie: "store". De instructiegegevens bestaan uit een set sleutels die toegang tot het account en de daarin opgeslagen gegevens regelenConfigInstruction
Compute BudgetComputeBudget111111111111111111111111111111Stel compute unit-limieten en prijzen in voor transacties, waardoor gebruikers rekenbronnen en prioriteringskosten kunnen beherenComputeBudgetInstruction
Address Lookup TableAddressLookupTab1e1111111111111111111111111Beheer adresopzoektabellen, waarmee transacties naar meer accounts kunnen verwijzen dan anders in de accountlijst van de transactie zouden passenProgramInstruction
ZK ElGamal ProofZkE1Gama1Proof11111111111111111111111111111Biedt zero-knowledge bewijsverificatie voor ElGamal-versleutelde gegevens

Is this page helpful?

Inhoudsopgave

Pagina Bewerken

Beheerd door

© 2025 Solana Foundation.
Alle rechten voorbehouden.
Blijf Verbonden