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:

ToimintoKuvaus
Uuden tilin luominenVain System Program voi luoda uusia tilejä.
Tilan varaaminenMäärittää tavukapasiteetin kunkin tilin datakentälle.
Ohjelman omistajuuden määritysKun 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-siirtoSiirtää 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.

Latausohjelmiin viitataan joskus nimellä 'BPF Loaders'.

Tällä hetkellä on viisi latausohjelmaa, kuten alla olevassa taulukossa näkyy.

LataajaOhjelmatunnusHuomautuksetOhjeet-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 erilliseen program data account -tiliinOhjeet
v4LoaderV411111111111111111111111111111111111Kehitteillä (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.

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, yksi kutakin tarkistettavaa allekirjoitusta varten.

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
}

Secp256k1-palautuksen vahvistaminen

Secp256k1-ohjelmaa käytetään secp256k1-julkisen avaimen palautustoimintojen vahvistamiseen.

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

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ä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.

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

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
}

Kaikille allekirjoituksille pakotetaan matalat S-arvot tahattoman allekirjoituksen muunneltavuuden 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ä, allokoi tilitietoja, määrittää tilit omistaville ohjelmille, siirtää lamporteja System Program -omisteisilta tileiltä ja maksaa transaktiomaksujaSystemInstruction
VoteVote111111111111111111111111111111111111111Luo ja hallinnoi tilejä, jotka seuraavat validator-äänestystilaa ja palkkioitaVoteInstruction
StakeStake11111111111111111111111111111111111111Luo ja hallinnoi tilejä, jotka edustavat panoksia ja palkkioita validatoreille delegoinneistaStakeInstruction
ConfigConfig1111111111111111111111111111111111111Lisää 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 tietoihinConfigInstruction
Compute BudgetComputeBudget111111111111111111111111111111Asettaa laskentayksikkörajat ja hinnat transaktioille, mikä mahdollistaa käyttäjille laskentaresurssien ja priorisointimaksujen hallinnanComputeBudgetInstruction
Address Lookup TableAddressLookupTab1e1111111111111111111111111Hallinnoi osoitehakutaulukoita, jotka mahdollistavat transaktioiden viitata useampiin tileihin kuin muuten mahtuisi transaktion tililuetteloonProgramInstruction
ZK ElGamal ProofZkE1Gama1Proof11111111111111111111111111111Tarjoaa nollatietotodistuksen varmennuksen ElGamal-salatulle datalle

Is this page helpful?

Sisällysluettelo

Muokkaa sivua

Hallinnoi

© 2025 Solana Foundation.
Kaikki oikeudet pidätetään.