Programma's
Op Solana worden "smart contracts" programma's genoemd. Programma's worden op de blockchain geïmplementeerd in accounts die de gecompileerde uitvoerbare binaire bestanden van het programma bevatten. Gebruikers interacteren met programma's door transacties te versturen die instructies bevatten die het programma vertellen wat te doen.
Belangrijke punten
- Programma's zijn accounts die uitvoerbare code bevatten, georganiseerd in functies die instructies worden genoemd.
- Hoewel programma's stateless zijn, kunnen ze instructies bevatten die andere accounts aanmaken en bijwerken om gegevens op te slaan.
- Een upgrade authority kan programma's bijwerken. Zodra deze autoriteit wordt verwijderd, wordt het programma onveranderlijk.
- Gebruikers kunnen verifiëren of de gegevens van een on-chain programma-account overeenkomen met de openbare broncode via verifieerbare builds.
Solana programma's schrijven
Solana programma's worden voornamelijk geschreven in de Rust programmeertaal, met twee gebruikelijke benaderingen voor ontwikkeling:
-
Anchor: Een framework ontworpen voor Solana programma-ontwikkeling. Het biedt een snellere en eenvoudigere manier om programma's te schrijven, met behulp van Rust macros om boilerplate code te verminderen. Voor beginners wordt aangeraden om te starten met het Anchor framework.
-
Native Rust: Deze benadering omvat het schrijven van Solana programma's in Rust zonder gebruik te maken van frameworks. Het biedt meer flexibiliteit maar komt met verhoogde complexiteit.
Solana programma's bijwerken
Om meer te leren over het implementeren en upgraden van programma's, zie de programma's implementeren pagina.
Programma's kunnen
direct worden gewijzigd
door een account dat is aangewezen als de "upgrade authority", wat meestal het
account is dat oorspronkelijk het programma heeft geïmplementeerd. Als de
upgrade authority
wordt ingetrokken en ingesteld op None
, wordt het programma onveranderlijk en
kan het niet langer worden bijgewerkt.
Verifieerbare programma's
Verifieerbare builds stellen iedereen in staat om te controleren of de on-chain code van een programma overeenkomt met de publieke broncode, waardoor het mogelijk wordt om verschillen tussen bron- en geïmplementeerde versies te detecteren.
De Solana-ontwikkelaarsgemeenschap heeft tools geïntroduceerd die verifieerbare builds ondersteunen, waardoor zowel ontwikkelaars als gebruikers kunnen verifiëren dat on-chain programma's nauwkeurig hun openbaar gedeelde broncode weerspiegelen.
-
Zoeken naar geverifieerde programma's: Om snel te controleren op geverifieerde programma's kunnen gebruikers zoeken naar een programma-adres op Solana Explorer. Bekijk een voorbeeld van een geverifieerd programma hier.
-
Verificatietools: De Solana Verifiable Build CLI van Ellipsis Labs stelt gebruikers in staat om on-chain programma's onafhankelijk te verifiëren tegen gepubliceerde broncode.
-
Ondersteuning voor verifieerbare builds in Anchor: Anchor biedt ingebouwde ondersteuning voor verifieerbare builds. Details zijn te vinden in de Anchor documentatie.
Berkeley Packet Filter (BPF)
Solana gebruikt LLVM (Low Level Virtual Machine) om programma's te compileren naar ELF (Executable and Linkable Format) bestanden. Deze bestanden bevatten Solana's aangepaste versie van eBPF bytecode, genaamd "Solana Bytecode Format" (sBPF). Het ELF-bestand bevat de binaire code van het programma en wordt on-chain opgeslagen in een uitvoerbare account wanneer het programma wordt geïmplementeerd.
Ingebouwde programma's
Loader-programma's
Elk programma is zelf eigendom van een ander programma, namelijk de loader. Momenteel bestaan er vijf loader-programma's:
Loader | Program ID | Opmerkingen | Instructies link |
---|---|---|---|
native | NativeLoader1111111111111111111111111111111 | Bezit 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 | Wordt uitgefaseerd | Instructies |
v4 | LoaderV411111111111111111111111111111111111 | v4 zal naar verwachting de standaard loader worden | Instructies |
Deze loaders zijn nodig om aangepaste programma's te maken en te beheren:
- Een nieuw programma of buffer implementeren
- Een programma of buffer sluiten
- Een bestaand programma opnieuw implementeren / upgraden
- De autoriteit over een programma overdragen
- Een programma finaliseren
Loader-v3 en loader-v4 ondersteunen wijzigingen aan programma's na hun initiële implementatie. Toestemming hiervoor wordt gereguleerd door de autoriteit van een programma omdat het accounteigendom van elk programma bij de loader berust.
Voorgecompileerde programma's
Ed25519-programma
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
is 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 te
controleren handtekening.
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}
De pseudocode van de handtekeningverificatie:
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}
Secp256k1-programma
Programma | Programma-ID | Beschrijving | Instructies |
---|---|---|---|
Secp256k1-programma | KeccakSecp256k11111111111111111111111111111 | Verifieert secp256k1 public key recovery-operaties (ecrecover). | Instructies |
Het secp256k1-programma verwerkt een instructie die als eerste byte een telling neemt van de volgende struct die in de instructiedata is geserialiseerd:
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}
De pseudocode van de recovery-verificatie:
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 instructiedata 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 vermenigvuldigingsfactor voor handtekeningverificatie.
Secp256r1 Programma
Programma | Programma-ID | Beschrijving | Instructies |
---|---|---|---|
Secp256r1 Program | Secp256r1SigVerify1111111111111111111111111 | Verifieert maximaal 8 secp256r1 handtekeningen. Neemt een handtekening, publieke sleutel en bericht. Geeft een fout als er één mislukt. | Instructions |
Het secp256r1 programma verwerkt een instructie. De eerste u8
is een telling
van het aantal te controleren handtekeningen, gevolgd door één byte padding.
Daarna wordt de volgende struct geserialiseerd, één voor elke te controleren
handtekening:
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}
De pseudocode van de handtekeningverificatie:
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}
Opmerking: Lage S-waarden worden afgedwongen voor alle handtekeningen om onbedoelde handtekeningveranderlijkheid te voorkomen.
Core Programma's
De Solana cluster genesis bevat een lijst met speciale programma's die kernfunctionaliteiten voor het netwerk bieden. Historisch werden deze aangeduid als "native" programma's en ze werden voorheen samen met de validator-code gedistribueerd.
Programma | Programma-ID | Beschrijving | Instructies |
---|---|---|---|
System Program | 11111111111111111111111111111111 | Maak nieuwe accounts, wijs accountgegevens toe, wijs accounts toe aan eigenaarsprogramma's, draag lamports over van System Program-accounts en betaal transactiekosten. | SystemInstruction |
Vote Program | Vote111111111111111111111111111111111111111 | Maak en beheer accounts die de stemstatus en beloningen van validators bijhouden. | VoteInstruction |
Stake Program | Stake11111111111111111111111111111111111111 | Maak en beheer accounts die stake en beloningen vertegenwoordigen voor delegaties aan validators. | StakeInstruction |
Config Program | Config1111111111111111111111111111111111111 | Voeg configuratiegegevens toe aan de chain, gevolgd door de lijst met publieke sleutels die deze mogen wijzigen. Anders dan de andere programma's definieert het Config programma geen individuele instructies. Het heeft slechts één impliciete instructie: "store". De instructiedata is een set sleutels die toegang tot het account regelen en de data die erin moet worden opgeslagen. | ConfigInstruction |
Compute Budget Program | ComputeBudget111111111111111111111111111111 | Stel compute unit limieten en prijzen in voor transacties, waardoor gebruikers rekenbronnen en prioriteringskosten kunnen beheren. | ComputeBudgetInstruction |
Address Lookup Table Program | AddressLookupTab1e1111111111111111111111111 | Beheer adres-opzoektabellen, waarmee transacties naar meer accounts kunnen verwijzen dan anders in de accountlijst van de transactie zouden passen. | ProgramInstruction |
ZK ElGamal Proof Program | ZkE1Gama1Proof11111111111111111111111111111 | Biedt zero-knowledge proof verificatie voor ElGamal-versleutelde gegevens. | — |
Is this page helpful?