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:

LataajaOhjelmatunnusHuomautuksetOhjeet-linkki
nativeNativeLoader1111111111111111111111111111111Omistaa neljä muuta lataajaa
v1BPFLoader1111111111111111111111111111111111Hallintaohjeet on poistettu käytöstä, mutta ohjelmat suoritetaan silti
v2BPFLoader2111111111111111111111111111111111Hallintaohjeet on poistettu käytöstä, mutta ohjelmat suoritetaan siltiOhjeet
v3BPFLoaderUpgradeab1e11111111111111111111111Poistumassa käytöstäOhjeet
v4LoaderV411111111111111111111111111111111111v4:stä odotetaan tulevan standardilataajaOhjeet

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

OhjelmaOhjelma-IDKuvausOhjeet
Ed25519-ohjelmaEd25519SigVerify111111111111111111111111111Vahvistaa 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.

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
}

Allekirjoituksen vahvistamisen pseudokoodi:

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-ohjelma

OhjelmaOhjelma-IDKuvausOhjeet
Secp256k1-ohjelmaKeccakSecp256k11111111111111111111111111111Vahvistaa 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:

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
}

Palautuksen vahvistamisen pseudokoodi:

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

OhjelmaOhjelmatunnusKuvausOhjeet
Secp256r1-ohjelmaSecp256r1SigVerify1111111111111111111111111Varmentaa 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:

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
}

Allekirjoituksen varmennuksen pseudokoodi:

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
}

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.

OhjelmaOhjelmatunnusKuvausOhjeet
System Program11111111111111111111111111111111Luo uusia tilejä, allokoi tilitietoja, määrittää tilit omistaville ohjelmille, siirtää lamporteja System Program -omistamista tileistä ja maksaa tapahtumakuluja.SystemInstruction
Vote ProgramVote111111111111111111111111111111111111111Luo ja hallinnoi tilejä, jotka seuraavat validaattorin äänestystilaa ja palkkioita.VoteInstruction
Stake ProgramStake11111111111111111111111111111111111111Luo ja hallinnoi tilejä, jotka edustavat panoksia ja palkkioita validaattoreille delegoiduista panoksista.StakeInstruction
Config ProgramConfig1111111111111111111111111111111111111Lisää 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 ProgramComputeBudget111111111111111111111111111111Asettaa laskentayksikkörajat ja hinnat tapahtumille, mikä mahdollistaa käyttäjille laskentaresurssien ja priorisointimaksujen hallinnan.ComputeBudgetInstruction
Address Lookup Table ProgramAddressLookupTab1e1111111111111111111111111Hallinnoi osoitehakutaulukoita, joiden avulla tapahtumat voivat viitata useampiin tileihin kuin mitä muuten mahtuisi tapahtuman tililuetteloon.ProgramInstruction
ZK ElGamal Proof ProgramZkE1Gama1Proof11111111111111111111111111111Tarjoaa nollatietotodistuksen varmennuksen ElGamal-salatulle datalle.

Is this page helpful?

Sisällysluettelo

Muokkaa sivua