Ohjelmat
Solanassa älysopimusta kutsutaan ohjelmaksi. Ohjelma on tilaton tili, joka sisältää suoritettavaa koodia. Tämä koodi on järjestetty funktioiksi, joita kutsutaan ohjeiksi. Käyttäjät ovat vuorovaikutuksessa ohjelman kanssa lähettämällä transaktion, joka sisältää yhden tai useamman ohjeen. Transaktio voi sisältää ohjeita useista eri ohjelmista.
Kun ohjelma otetaan käyttöön, Solana käyttää LLVM-työkalua kääntääkseen sen suoritettavaan ja linkitettävään muotoon (ELF). ELF- tiedosto sisältää ohjelman binäärin Solana Bytecode Format (sBPF) -muodossa ja se tallennetaan lohkoketjuun suoritettavalle tilille.
sBPF on Solanan mukautettu versio eBPF tavukoodista.
Ohjelmien kirjoittaminen
Suurin osa ohjelmista kirjoitetaan Rust-kielellä, ja käytössä on kaksi yleistä kehitystapaa:
- Anchor: Anchor on kehys, joka on suunniteltu nopeaan ja helppoon Solana-kehitykseen. Se käyttää Rust-makroja vähentääkseen toistuvan koodin määrää—tehden siitä erinomaisen aloittelijoille.
- Natiivi Rust: Kirjoita ohjelmia Rustilla ilman kehysten hyödyntämistä. Tämä lähestymistapa tarjoaa enemmän joustavuutta, mutta tuo mukanaan lisää monimutkaisuutta.
Ohjelmien päivittäminen
Jotta olemassa olevaa ohjelmaa voidaan muokata, 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 null, ohjelmaa ei voi enää päivittää.
Ohjelmien varmentaminen
Solana tukee todennettavia buildeja, joiden avulla käyttäjät voivat tarkistaa, vastaako ohjelman lohkoketjussa oleva koodi sen julkista lähdekoodia. Anchor-kehys tarjoaa sisäänrakennetun tuen todennettavan buildin luomiseen.
Tarkistaaksesi, onko olemassa oleva ohjelma varmennettu, etsi sen ohjelmatunnusta Solana Explorerista. Vaihtoehtoisesti voit käyttää Ellipsis Labsin Solana Verifiable Build CLI -työkalua lohkoketjussa olevien ohjelmien itsenäiseen varmentamiseen.
Sisäänrakennetut ohjelmat
System Program
System Program on ainoa tili, joka voi luoda uusia tilejä. Oletusarvoisesti 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 | Määrittää tavukapasiteetin kunkin tilin datakentälle. |
| Ohjelman omistajuuden määritys | Kun System Program luo tilin, se voi siirtää määritetyn ohjelman omistajuuden toiselle program account -tilille. Näin mukautetut ohjelmat ottavat omistukseensa System Programin luomia uusia tilejä. |
| SOL-siirto | Siirtää lamporteja (SOL) System-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 valtuuksien siirtämiseen.
Tällä hetkellä on viisi latausohjelmaa, kuten alla olevassa taulukossa näkyy.
| Lataaja | Ohjelmatunnus | Huomautukset | Ohjeet-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 erilliseen program data account -tiliin | Ohjeet |
| v4 | LoaderV411111111111111111111111111111111111 | Kehitteillä (ei julkaistu) | Ohjeet |
Loader-v3:lla tai loader-v4:llä käyttöönotetut ohjelmat voivat olla muokattavissa käyttöönoton jälkeen, riippuen niiden päivitysoikeuksista.
Kun uusi ohjelma otetaan käyttöön, uusinta lataajan versiota käytetään oletusarvoisesti.
Esikäännetyt ohjelmat
Lataajaohjelmien lisäksi Solana tarjoaa seuraavat esikäännetyt ohjelmat.
Ed25519-allekirjoituksen vahvistaminen
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, yksi kutakin tarkistettavaa
allekirjoitusta varten.
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}
Secp256k1-palautuksen vahvistaminen
Secp256k1-ohjelmaa käytetään secp256k1-julkisen avaimen palautustoimintojen vahvistamiseen.
| Ohjelma | Ohjelmatunnus | Kuvaus | Ohjeet |
|---|---|---|---|
| Secp256k1-ohjelma | KeccakSecp256k11111111111111111111111111111 | Vahvistaa secp256k1-julkisen avaimen palautustoiminnot (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älle minkä tahansa ohjedatan määrittämisen transaktiossa allekirjoitus- ja viestidataa varten. Määrittämällä erityisen instructions-sysvarin, voidaan myös vastaanottaa dataa itse transaktiosta.
Transaktion kustannus lasketaan varmennettavien allekirjoitusten määrä kerrottuna allekirjoituksen varmennuksen kustannuskertoimella.
Secp256r1-ohjelmaa käytetään enintään 8 secp256r1-allekirjoituksen varmistamiseen.
| Ohjelma | Ohjelmatunnus | Kuvaus | Ohjeet |
|---|---|---|---|
| Secp256r1-ohjelma | Secp256r1SigVerify1111111111111111111111111 | Varmistaa enintään 8 secp256r1-allekirjoitusta. Ottaa allekirjoituksen, julkisen avaimen ja viestin. Palauttaa virheen, jos jokin epäonnistuu. | Ohjeet |
Secp256r1-ohjelma käsittelee ohjetta. Ohjeen ensimmäinen u8 on tarkistettavien
allekirjoitusten määrä, jota seuraa yhden tavun täyte. Tämän jälkeen seuraava
rakenne luodaan jokaiselle allekirjoitukselle, sitten serialisoidaan ja lisätään
instruction data -tietoihin.
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}
Kaikille allekirjoituksille pakotetaan matalat S-arvot tahattoman allekirjoituksen muunneltavuuden 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ä, allokoi tilitietoja, määrittää tilit omistaville ohjelmille, siirtää lamporteja System Program -omisteisilta tileiltä ja maksaa transaktiomaksuja | SystemInstruction |
| Vote | Vote111111111111111111111111111111111111111 | Luo ja hallinnoi tilejä, jotka seuraavat validator-äänestystilaa ja palkkioita | VoteInstruction |
| Stake | Stake11111111111111111111111111111111111111 | Luo ja hallinnoi tilejä, jotka edustavat panoksia ja palkkioita validatoreille delegoinneista | StakeInstruction |
| Config | Config1111111111111111111111111111111111111 | Lisää konfiguraatiotietoja ketjuun, jonka jälkeen 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 instruction data on joukko avaimia, jotka säätelevät pääsyä tiliin ja siinä tallennettuihin tietoihin | ConfigInstruction |
| Compute Budget | ComputeBudget111111111111111111111111111111 | Asettaa laskentayksikkörajat ja hinnat transaktioille, mikä mahdollistaa käyttäjille laskentaresurssien ja priorisointimaksujen hallinnan | 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 varmennuksen ElGamal-salatulle datalle | — |
Is this page helpful?