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:
| Functie | Beschrijving |
|---|---|
| Aanmaken van nieuwe accounts | Alleen het System Program kan nieuwe accounts aanmaken. |
| Ruimtetoewijzing | Stelt de bytecapaciteit in voor het gegevensveld van elk account. |
| Toewijzen van programma-eigendom | Zodra 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 overmaken | Maakt 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.
Er zijn momenteel vijf loader-programma's, zoals weergegeven in de onderstaande tabel.
| Loader | Program ID | Opmerkingen | Instructies link |
|---|---|---|---|
| native | NativeLoader1111111111111111111111111111111 | Is eigenaar van de andere vier loaders | — |
| v1 | BPFLoader1111111111111111111111111111111111 | Beheerinstructies zijn uitgeschakeld, maar programma's worden nog steeds uitgevoerd | — |
| v2 | BPFLoader2111111111111111111111111111111111 | Beheerinstructies zijn uitgeschakeld, maar programma's worden nog steeds uitgevoerd | Instructies |
| v3 | BPFLoaderUpgradeab1e11111111111111111111111 | Programma's kunnen worden bijgewerkt na implementatie. Programma-uitvoerbaar bestand wordt opgeslagen in een apart program data account | Instructies |
| v4 | LoaderV411111111111111111111111111111111111 | In 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.
| Programma | Programma-ID | Beschrijving | Instructies |
|---|---|---|---|
| Ed25519 Programma | Ed25519SigVerify111111111111111111111111111 | Verifieert 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.
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}
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}
Verifieer secp256k1 herstel
Het secp256k1-programma wordt gebruikt om secp256k1 publieke sleutel hersteloperaties te verifiëren.
| Programma | Programma-ID | Beschrijving | Instructies |
|---|---|---|---|
| Secp256k1 Programma | KeccakSecp256k11111111111111111111111111111 | Verifieert 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.
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}
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}
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.
| Program | Program ID | Beschrijving | Instructies |
|---|---|---|---|
| Secp256r1 Program | Secp256r1SigVerify1111111111111111111111111 | Verifieert 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.
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}
Lage S-waarden worden afgedwongen voor alle handtekeningen om onbedoelde handtekeningveranderbaarheid te voorkomen.
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}
Kernprogramma's
De programma's in de onderstaande lijst bieden de kernfunctionaliteit van het netwerk.
| Program | Program ID | Beschrijving | Instructies |
|---|---|---|---|
| System | 11111111111111111111111111111111 | Maak nieuwe accounts, wijs accountgegevens toe, wijs accounts toe aan eigenaarsprogramma's, draag lamports over van System Program-owned accounts en betaal transactiekosten | SystemInstruction |
| Vote | Vote111111111111111111111111111111111111111 | Maak en beheer accounts die de stemstatus en beloningen van validators bijhouden | VoteInstruction |
| Stake | Stake11111111111111111111111111111111111111 | Maak en beheer accounts die stake en beloningen vertegenwoordigen voor delegaties aan validators | StakeInstruction |
| Config | Config1111111111111111111111111111111111111 | Voeg 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 regelen | ConfigInstruction |
| Compute Budget | ComputeBudget111111111111111111111111111111 | Stel compute unit-limieten en prijzen in voor transacties, waardoor gebruikers rekenbronnen en prioriteringskosten kunnen beheren | ComputeBudgetInstruction |
| Address Lookup Table | AddressLookupTab1e1111111111111111111111111 | Beheer adresopzoektabellen, waarmee transacties naar meer accounts kunnen verwijzen dan anders in de accountlijst van de transactie zouden passen | ProgramInstruction |
| ZK ElGamal Proof | ZkE1Gama1Proof11111111111111111111111111111 | Biedt zero-knowledge bewijsverificatie voor ElGamal-versleutelde gegevens | — |
Is this page helpful?