Ohjelmat
Solanassa "älysopimuksia" kutsutaan ohjelmiksi. Ohjelmat otetaan käyttöön lohkoketjussa tileille, jotka sisältävät ohjelman käännetyn suoritettavan binääritiedoston. Käyttäjät ovat vuorovaikutuksessa ohjelmien kanssa lähettämällä transaktioita, jotka sisältävät ohjeita, jotka kertovat ohjelmalle mitä tehdä.
Avainasiat
- Ohjelmat ovat tilejä, jotka sisältävät suoritettavaa koodia, joka on järjestetty funktioiksi joita kutsutaan ohjeiksi.
- Vaikka ohjelmat ovat tilattomia, ne voivat sisältää ohjeita, jotka luovat ja päivittävät muita tilejä tietojen tallentamiseksi.
- Päivitysvaltuutus voi päivittää ohjelmia. Kun tämä valtuutus poistetaan, ohjelmasta tulee muuttumaton.
- Käyttäjät voivat varmistaa, että lohkoketjussa olevan ohjelmatilin data vastaa sen julkista lähdekoodia todennettavien buildien avulla.
Solana-ohjelmien kirjoittaminen
Solana-ohjelmat kirjoitetaan pääasiassa Rust-ohjelmointikielellä, ja kehitykseen on kaksi yleistä lähestymistapaa:
-
Anchor: Solana-ohjelmien kehittämiseen suunniteltu kehys. Se tarjoaa nopeamman ja yksinkertaisemman tavan kirjoittaa ohjelmia käyttäen Rust-makroja vähentämään toistuvan koodin määrää. Aloittelijoille suositellaan aloittamista Anchor-kehyksellä.
-
Natiivi Rust: Tässä lähestymistavassa Solana-ohjelmat kirjoitetaan Rustilla ilman kehysten hyödyntämistä. Se tarjoaa enemmän joustavuutta mutta tuo mukanaan lisää monimutkaisuutta.
Solana-ohjelmien päivittäminen
Lisätietoja ohjelmien käyttöönotosta ja päivittämisestä löytyy ohjelmien käyttöönotto -sivulta.
Ohjelmia voidaan suoraan muokata tilin toimesta, joka on määritetty "päivitysvaltuutukseksi", joka on tyypillisesti tili, joka alun perin otti ohjelman käyttöön. Jos päivitysvaltuutus peruutetaan ja asetetaan arvoon null, ohjelmasta tulee muuttumaton eikä sitä voi enää päivittää.
Todennettavat ohjelmat
Todennettavat käännökset mahdollistavat kenelle tahansa tarkistaa, vastaako ohjelman lohkoketjussa oleva koodi sen julkista lähdekoodia, mikä tekee mahdolliseksi havaita eroavaisuudet lähdekoodin ja käyttöönotettujen versioiden välillä.
Solanan kehittäjäyhteisö on esitellyt työkaluja todennettavien käännösten tukemiseksi, mikä mahdollistaa sekä kehittäjille että käyttäjille varmistaa, että lohkoketjussa olevat ohjelmat vastaavat tarkasti niiden julkisesti jaettua lähdekoodia.
-
Todennettujen ohjelmien etsiminen: Tarkistaakseen nopeasti todennetut ohjelmat, käyttäjät voivat etsiä ohjelman osoitetta Solana Explorerista. Katso esimerkki todennetusta ohjelmasta täältä.
-
Todennustyökalut: Solana Verifiable Build CLI Ellipsis Labsilta mahdollistaa käyttäjille itsenäisesti todentaa lohkoketjussa olevat ohjelmat julkaistua lähdekoodia vastaan.
-
Tuki todennettaville käännöksille Anchorissa: Anchor tarjoaa sisäänrakennetun tuen todennettaville käännöksille. Lisätietoja löytyy Anchor-dokumentaatiosta.
Berkeley Packet Filter (BPF)
Solana käyttää LLVM:ää (Low Level Virtual Machine) ohjelmien kääntämiseen ELF (Executable and Linkable Format) -tiedostoiksi. Nämä tiedostot sisältävät Solanan mukautetun version eBPF-tavukoodista, jota kutsutaan nimellä "Solana Bytecode Format" (sBPF). ELF-tiedosto sisältää ohjelman binäärin ja se tallennetaan lohkoketjuun suoritettavaan tiliin, kun ohjelma otetaan käyttöön.
Sisäänrakennetut ohjelmat
Lataajaohjelmat
Jokainen ohjelma on itse toisen ohjelman omistama, joka on sen lataaja. Tällä hetkellä on olemassa viisi lataajaohjelmaa:
Lataaja | Ohjelmatunnus | Huomautukset | Ohjeet-linkki |
---|---|---|---|
native | NativeLoader1111111111111111111111111111111 | Omistaa neljä muuta lataajaa | — |
v1 | BPFLoader1111111111111111111111111111111111 | Hallintaohjeet on poistettu käytöstä, mutta ohjelmat suoritetaan silti | — |
v2 | BPFLoader2111111111111111111111111111111111 | Hallintaohjeet on poistettu käytöstä, mutta ohjelmat suoritetaan silti | Ohjeet |
v3 | BPFLoaderUpgradeab1e11111111111111111111111 | Poistumassa käytöstä | Ohjeet |
v4 | LoaderV411111111111111111111111111111111111 | v4:stä odotetaan tulevan standardilataaja | Ohjeet |
Nämä lataajat ovat välttämättömiä mukautettujen ohjelmien luomiseen ja hallintaan:
- Uuden ohjelman tai puskurin käyttöönotto
- Ohjelman tai puskurin sulkeminen
- Olemassa olevan ohjelman uudelleenkäyttöönotto / päivitys
- Ohjelman hallinnan siirtäminen
- Ohjelman viimeistely
Loader-v3 ja loader-v4 tukevat ohjelmien muokkaamista niiden alkuperäisen käyttöönoton jälkeen. Lupaa tähän säädellään ohjelman hallinnan kautta, koska kunkin ohjelman tiliomistajuus on lataajalla.
Esikäännetyt ohjelmat
Ed25519-ohjelma
Ohjelma | Ohjelma-ID | Kuvaus | Ohjeet |
---|---|---|---|
Ed25519-ohjelma | Ed25519SigVerify111111111111111111111111111 | Vahvistaa ed25519-allekirjoitukset. Jos jokin allekirjoitus epäonnistuu, palautetaan virhe. | Ohjeet |
Ed25519-ohjelma käsittelee ohjeen. Ensimmäinen u8
on tarkistettavien
allekirjoitusten määrä, jota seuraa yhden tavun täyte. Tämän jälkeen seuraava
rakenne sarjallistetaan, yksi jokaiselle 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}
Allekirjoituksen vahvistamisen pseudokoodi:
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-ohjelma
Ohjelma | Ohjelma-ID | Kuvaus | Ohjeet |
---|---|---|---|
Secp256k1-ohjelma | KeccakSecp256k11111111111111111111111111111 | Vahvistaa secp256k1 julkisen avaimen palautustoiminnot (ecrecover). | Ohjeet |
Secp256k1-ohjelma käsittelee ohjeen, joka ottaa ensimmäisenä tavuna määrän seuraavasta rakenteesta, joka on sarjallistettu ohjetiedoissa:
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}
Palautuksen vahvistamisen pseudokoodi:
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 ohjetiedon määrittämisen transaktiossa allekirjoitus- ja viestitiedoille. Määrittämällä erityisen instructions sysvar -muuttujan, voidaan myös vastaanottaa tietoja itse transaktiosta.
Tapahtuman kustannus lasketaan kertomalla varmennettavien allekirjoitusten määrä allekirjoituksen varmennuksen kertoimella.
Secp256r1-ohjelma
Ohjelma | Ohjelmatunnus | Kuvaus | Ohjeet |
---|---|---|---|
Secp256r1-ohjelma | Secp256r1SigVerify1111111111111111111111111 | Varmentaa enintään 8 secp256r1-allekirjoitusta. Ottaa allekirjoituksen, julkisen avaimen ja viestin. Palauttaa virheen, jos jokin epäonnistuu. | Ohjeet |
Secp256r1-ohjelma käsittelee ohjeen. Ensimmäinen u8
on tarkistettavien
allekirjoitusten määrä, jota seuraa yhden tavun täyte. Tämän jälkeen seuraava
rakenne sarjallistetaan, yksi jokaiselle tarkistettavalle allekirjoitukselle:
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}
Allekirjoituksen varmennuksen pseudokoodi:
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}
Huomaa: Kaikille allekirjoituksille pakotetaan matalat S-arvot tahattoman allekirjoituksen muunneltavuuden välttämiseksi.
Ydinohjelmat
Solana-klusterin genesis sisältää luettelon erityisohjelmista, jotka tarjoavat verkon ydintoiminnallisuuksia. Historiallisesti näitä kutsuttiin "natiiveiksi" ohjelmiksi, ja ne jaettiin aiemmin validator-koodin mukana.
Ohjelma | Ohjelmatunnus | Kuvaus | Ohjeet |
---|---|---|---|
System Program | 11111111111111111111111111111111 | Luo uusia tilejä, allokoi tilitietoja, määrittää tilit omistaville ohjelmille, siirtää lamporteja System Program -omistamista tileistä ja maksaa tapahtumakuluja. | SystemInstruction |
Vote Program | Vote111111111111111111111111111111111111111 | Luo ja hallinnoi tilejä, jotka seuraavat validaattorin äänestystilaa ja palkkioita. | VoteInstruction |
Stake Program | Stake11111111111111111111111111111111111111 | Luo ja hallinnoi tilejä, jotka edustavat panoksia ja palkkioita validaattoreille delegoiduista panoksista. | StakeInstruction |
Config Program | Config1111111111111111111111111111111111111 | Lisää konfiguraatiotietoja lohkoketjuun, joita 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 ohjetiedot ovat joukko avaimia, jotka säätelevät pääsyä tiliin, sekä siihen tallennettavat tiedot. | ConfigInstruction |
Compute Budget Program | ComputeBudget111111111111111111111111111111 | Asettaa laskentayksikkörajat ja hinnat tapahtumille, mikä mahdollistaa käyttäjille laskentaresurssien ja priorisointimaksujen hallinnan. | ComputeBudgetInstruction |
Address Lookup Table Program | AddressLookupTab1e1111111111111111111111111 | Hallinnoi osoitehakutaulukoita, joiden avulla tapahtumat voivat viitata useampiin tileihin kuin mitä muuten mahtuisi tapahtuman tililuetteloon. | ProgramInstruction |
ZK ElGamal Proof Program | ZkE1Gama1Proof11111111111111111111111111111 | Tarjoaa nollatietotodistuksen varmennuksen ElGamal-salatulle datalle. | — |
Is this page helpful?