Ohjelmat

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:

ToimintoKuvaus
Uuden tilin luominenVain System Program voi luoda uusia tilejä.
Tilan varaaminenAsettaa kunkin tilin data-kentän tavukapasiteetin.
Ohjelman omistajuuden määrittäminenKun 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äminenSiirtää 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.

Latausohjelmia kutsutaan joskus nimellä 'BPF-lataajat'.

Tällä hetkellä on olemassa viisi latausohjelmaa, kuten alla olevasta taulukosta näkyy.

LataajaOhjelmatunnusHuomautuksetOhjeiden linkki
nativeNativeLoader1111111111111111111111111111111Omistaa neljä muuta lataajaa
v1BPFLoader1111111111111111111111111111111111Hallintaohjeet on poistettu käytöstä, mutta ohjelmat suoritetaan edelleen
v2BPFLoader2111111111111111111111111111111111Hallintaohjeet on poistettu käytöstä, mutta ohjelmat suoritetaan edelleenOhjeet
v3BPFLoaderUpgradeab1e11111111111111111111111Ohjelmia voidaan päivittää käyttöönoton jälkeen. Ohjelman suoritettava koodi tallennetaan erilliselle ohjelman datatilinOhjeet
v4LoaderV411111111111111111111111111111111111Kehitteillä (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.

OhjelmaOhjelmatunnusKuvausOhjeet
Ed25519-ohjelmaEd25519SigVerify111111111111111111111111111Vahvistaa 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.

Ed25519SignatureOffsets
struct Ed25519SignatureOffsets {
signature_offset: u16, // offset to ed25519 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to public key of 32 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u16, // index of instruction data to get message data
}
Signature verification pseudocode
process_instruction() {
for i in 0..count {
// i'th index values referenced:
instructions = &transaction.message().instructions
instruction_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.

OhjelmaOhjelmatunnusKuvausOhjeet
Secp256k1-ohjelmaKeccakSecp256k11111111111111111111111111111Vahvistaa 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.

Secp256k1SignatureOffsets
struct Secp256k1SignatureOffsets {
secp_signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytes
secp_signature_instruction_index: u8, // instruction index to find signature
secp_pubkey_offset: u16, // offset to ethereum_address pubkey of 20 bytes
secp_pubkey_instruction_index: u8, // instruction index to find pubkey
secp_message_data_offset: u16, // offset to start of message data
secp_message_data_size: u16, // size of message data
secp_message_instruction_index: u8, // instruction index to find message data
}
Recovery verification pseudocode
process_instruction() {
for i in 0..count {
// i'th index values referenced:
instructions = &transaction.message().instructions
signature = 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.

OhjelmaOhjelmatunnusKuvausOhjeet
Secp256r1-ohjelmaSecp256r1SigVerify1111111111111111111111111Vahvistaa 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.

Secp256r1SignatureOffsets
struct Secp256r1SignatureOffsets {
signature_offset: u16, // offset to compact secp256r1 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to compressed public key of 33 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u16, // index of instruction data to get message data
}

Matalat S-arvot pakotetaan kaikille allekirjoituksille tahattoman allekirjoituksen muokattavuuden välttämiseksi.

Signature verification psuedocode
process_instruction() {
if data.len() < SIGNATURE_OFFSETS_START {
return Error
}
num_signatures = data[0] as usize
if num_signatures == 0 || num_signatures > 8 {
return Error
}
expected_data_size = num_signatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE + SIGNATURE_OFFSETS_START
if 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.

OhjelmaOhjelmatunnusKuvausOhjeet
System11111111111111111111111111111111Luo uusia tilejä, varaa tilidataa, määritä tilit omistaville ohjelmille, siirrä lamportteja System Program -omistamista tileistä ja maksa transaktiomaksujaSystemInstruction
VoteVote111111111111111111111111111111111111111Luo ja hallinnoi tilejä, jotka seuraavat validatorin äänestystilaa ja palkintojaVoteInstruction
StakeStake11111111111111111111111111111111111111Luo ja hallinnoi tilejä, jotka edustavat panosta ja palkintoja validaattoreiden delegoinneistaStakeInstruction
ConfigConfig1111111111111111111111111111111111111Lisää 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 dataanConfigInstruction
Compute BudgetComputeBudget111111111111111111111111111111Aseta laskentayksikkörajat ja hinnat transaktioille, mahdollistaen käyttäjien hallita laskentaresursseja ja priorisointimaksujaComputeBudgetInstruction
Address Lookup TableAddressLookupTab1e1111111111111111111111111Hallinnoi osoitehakutaulukoita, jotka mahdollistavat transaktioiden viitata useampiin tileihin kuin muuten mahtuisi transaktion tililuetteloonProgramInstruction
ZK ElGamal ProofZkE1Gama1Proof11111111111111111111111111111Tarjoaa nollatietotodistuksen vahvistuksen ElGamal-salatulle datalle

Is this page helpful?

Sisällysluettelo

Muokkaa sivua

Hallinnoi

© 2026 Solana Foundation.
Kaikki oikeudet pidätetään.
Yhdistä