Solanassa älykästä sopimusta kutsutaan ohjelmaksi. Ohjelma on tilaton tili, joka sisältää suoritettavaa koodia. Tämä koodi on järjestetty funktioiksi, joita kutsutaan käskyiksi. Käyttäjät ovat vuorovaikutuksessa ohjelman kanssa lähettämällä transaktion, joka sisältää yhden tai useamman käskyn. Transaktio voi sisältää käskyjä useista ohjelmista.
Kun ohjelma otetaan käyttöön, Solana käyttää LLVM:ää sen kääntämiseen suoritettavaan ja linkitettävään muotoon (ELF). ELF- tiedosto sisältää ohjelman binäärin Solana Bytecode Format (sBPF) -muodossa ja tallennetaan ketjuun suoritettavaan tiliin.
sBPF on Solanan mukautettu versio eBPF- tavukoodista.
Ohjelmien kirjoittaminen
Suurin osa ohjelmista on kirjoitettu Rustilla, ja kehityksessä on kaksi yleistä lähestymistapaa:
- Anchor: Anchor on kehys, joka on suunniteltu nopeaan ja helppoon Solana-kehitykseen. Se käyttää Rust-makroja vähentääkseen boilerplate-koodia—mikä tekee siitä loistavan aloittelijoille.
- Natiivi Rust: Kirjoita ohjelmia Rustilla hyödyntämättä mitään kehyksiä. Tämä lähestymistapa tarjoaa enemmän joustavuutta, mutta tuo mukanaan lisääntynyttä monimutkaisuutta.
Ohjelmien päivittäminen
Olemassa olevan ohjelman
muokkaamiseksi
tilin on oltava määritetty
päivitysvaltuutukseksi.
(Tyypillisesti sama tili, joka alun perin
otti ohjelman käyttöön.) Jos päivitysvaltuutus
peruutetaan ja asetetaan arvoon None, ohjelmaa ei voi enää päivittää.
Ohjelmien varmentaminen
Solana tukee varmennettavia käännöksiä, joiden avulla käyttäjät voivat tarkistaa, vastaako ohjelman ketjussa oleva koodi sen julkista lähdekoodia. Anchor-kehys tarjoaa sisäänrakennetun tuen varmennettavan käännöksen luomiseen.
Tarkistaaksesi, onko olemassa oleva ohjelma varmennettu, etsi sen ohjelmatunnus Solana Explorerista. Vaihtoehtoisesti voit käyttää Ellipsis Labsin Solana Verifiable Build CLI:tä varmistaaksesi ketjussa olevat ohjelmat itsenäisesti.
Sisäänrakennetut ohjelmat
System Program
System Program on ainoa tili, joka voi luoda uusia tilejä. Oletuksena kaikki uudet tilit omistaa System Program, vaikka monille määritetään uusi omistaja luomisen yhteydessä. System Program suorittaa seuraavat keskeiset toiminnot:
| Toiminto | Kuvaus |
|---|---|
| Uuden tilin luominen | Vain System Program voi luoda uusia tilejä. |
| Tilan varaaminen | Asettaa kunkin tilin data-kentän tavukapasiteetin. |
| Ohjelman omistajuuden määrittäminen | Kun System Program on luonut tilin, se voi määrittää nimetyn ohjelman omistajan toiselle ohjelman tilille. Näin mukautetut ohjelmat ottavat omistukseensa System Programin luomat uudet tilit. |
| SOL:n siirtäminen | Siirtää lamportteja (SOL) järjestelmätileiltä muille tileille. |
System Programin osoite on 11111111111111111111111111111111.
Latausohjelmat
Jokaisen ohjelman omistaa toinen ohjelma – sen lataaja. Lataajia käytetään ohjelmien käyttöönottoon, uudelleenkäyttöönottoon, päivittämiseen tai sulkemiseen. Niitä käytetään myös ohjelman viimeistelyyn ja ohjelman valtuutuksen siirtämiseen.
Tällä hetkellä on olemassa viisi latausohjelmaa, kuten alla olevasta taulukosta näkyy.
| Lataaja | Ohjelmatunnus | Huomautukset | Ohjeiden linkki |
|---|---|---|---|
| native | NativeLoader1111111111111111111111111111111 | Omistaa neljä muuta lataajaa | — |
| v1 | BPFLoader1111111111111111111111111111111111 | Hallintaohjeet on poistettu käytöstä, mutta ohjelmat suoritetaan edelleen | — |
| v2 | BPFLoader2111111111111111111111111111111111 | Hallintaohjeet on poistettu käytöstä, mutta ohjelmat suoritetaan edelleen | Ohjeet |
| v3 | BPFLoaderUpgradeab1e11111111111111111111111 | Ohjelmia voidaan päivittää käyttöönoton jälkeen. Ohjelman suoritettava koodi tallennetaan erilliselle ohjelman datatilin | Ohjeet |
| v4 | LoaderV411111111111111111111111111111111111 | Kehitteillä (julkaisematon) | Ohjeet |
Loader-v3- tai loader-v4-versiolla käyttöönotetut ohjelmat voivat olla muokattavissa käyttöönoton jälkeen päivitysvaltuutuksen määrittämällä tavalla.
Kun uusi ohjelma otetaan käyttöön, uusinta loader-versiota käytetään oletuksena.
Esikäännetyt ohjelmat
Loader-ohjelmien lisäksi Solana tarjoaa seuraavat esikäännetyt ohjelmat.
Vahvista ed25519-allekirjoitus
Ed25519-ohjelmaa käytetään yhden tai useamman ed25519-allekirjoituksen vahvistamiseen.
| Ohjelma | Ohjelmatunnus | Kuvaus | Ohjeet |
|---|---|---|---|
| Ed25519-ohjelma | Ed25519SigVerify111111111111111111111111111 | Vahvistaa ed25519-allekirjoitukset. Jos jokin allekirjoitus epäonnistuu, palautetaan virhe. | Ohjeet |
Ed25519-ohjelma käsittelee ohjeen. Ohjeen ensimmäinen u8 sisältää
tarkistettavien allekirjoitusten määrän, jota seuraa yhden tavun täyte. Tämän
jälkeen seuraava rakenne sarjallistetaan kerran kullekin tarkistettavalle
allekirjoitukselle.
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}
Vahvista secp256k1-palautus
Secp256k1-ohjelmaa käytetään secp256k1-julkisen avaimen palautusoperaatioiden vahvistamiseen.
| Ohjelma | Ohjelmatunnus | Kuvaus | Ohjeet |
|---|---|---|---|
| Secp256k1-ohjelma | KeccakSecp256k11111111111111111111111111111 | Vahvistaa secp256k1-julkisen avaimen palautusoperaatiot (ecrecover). | Ohjeet |
Secp256k1-ohjelma käsittelee ohjeen. Ohjeen ensimmäinen tavu sisältää tarkistettavien julkisten avainten määrän. Tämän jälkeen seuraava rakenne luodaan kerran kullekin julkiselle avaimelle, sitten sarjallistetaan ja lisätään ohjedataan.
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}
Tämä mahdollistaa käyttäjän määrittää minkä tahansa ohjedatan transaktiossa allekirjoitusta ja viestiä varten. Määrittämällä erityisen instructions sysvar -muuttujan, voi myös vastaanottaa dataa itse transaktiosta.
Transaktion kustannus lasketaan vahvistettavien allekirjoitusten määrällä kerrottuna allekirjoituksen vahvistuskertoimella.
Secp256r1-ohjelmaa käytetään enintään 8 secp256r1-allekirjoituksen vahvistamiseen.
| Ohjelma | Ohjelmatunnus | Kuvaus | Ohjeet |
|---|---|---|---|
| Secp256r1-ohjelma | Secp256r1SigVerify1111111111111111111111111 | Vahvistaa enintään 8 secp256r1-allekirjoitusta. Ottaa allekirjoituksen, julkisen avaimen ja viestin. Palauttaa virheen, jos jokin epäonnistuu. | Ohjeet |
Secp256r1-ohjelma käsittelee ohjeen. Ohjeen ensimmäinen u8 on tarkistettavien
allekirjoitusten määrä, jota seuraa yhden tavun täyte. Tämän jälkeen seuraava
rakenne luodaan kullekin allekirjoitukselle, sitten serialisoidaan ja lisätään
ohjedataan.
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}
Matalat S-arvot pakotetaan kaikille allekirjoituksille tahattoman allekirjoituksen muokattavuuden välttämiseksi.
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}
Ydinohjelmat
Alla olevassa luettelossa olevat ohjelmat tarjoavat verkon ydintoiminnallisuuden.
| Ohjelma | Ohjelmatunnus | Kuvaus | Ohjeet |
|---|---|---|---|
| System | 11111111111111111111111111111111 | Luo uusia tilejä, varaa tilidataa, määritä tilit omistaville ohjelmille, siirrä lamportteja System Program -omistamista tileistä ja maksa transaktiomaksuja | SystemInstruction |
| Vote | Vote111111111111111111111111111111111111111 | Luo ja hallinnoi tilejä, jotka seuraavat validatorin äänestystilaa ja palkintoja | VoteInstruction |
| Stake | Stake11111111111111111111111111111111111111 | Luo ja hallinnoi tilejä, jotka edustavat panosta ja palkintoja validaattoreiden delegoinneista | StakeInstruction |
| Config | Config1111111111111111111111111111111111111 | Lisää konfiguraatiodataa ketjuun, jota seuraa luettelo julkisista avaimista, joilla on oikeus muokata sitä. Toisin kuin muut ohjelmat, Config-ohjelma ei määritä yksittäisiä ohjeita. Sillä on vain yksi implisiittinen ohje: "store". Sen ohjedata on joukko avaimia, jotka hallitsevat pääsyä tiliin ja sen sisällä olevaan dataan | ConfigInstruction |
| Compute Budget | ComputeBudget111111111111111111111111111111 | Aseta laskentayksikkörajat ja hinnat transaktioille, mahdollistaen käyttäjien hallita laskentaresursseja ja priorisointimaksuja | ComputeBudgetInstruction |
| Address Lookup Table | AddressLookupTab1e1111111111111111111111111 | Hallinnoi osoitehakutaulukoita, jotka mahdollistavat transaktioiden viitata useampiin tileihin kuin muuten mahtuisi transaktion tililuetteloon | ProgramInstruction |
| ZK ElGamal Proof | ZkE1Gama1Proof11111111111111111111111111111 | Tarjoaa nollatietotodistuksen vahvistuksen ElGamal-salatulle datalle | — |
Is this page helpful?