Solana-dokumentaatioOhjelmien kehittäminen

Rajoitukset

Solana-lohkoketjussa ohjelmien kehittämiseen liittyy tiettyjä rajoituksia. Alla on luettelo yleisistä rajoituksista, joihin saatat törmätä.

Rust-kirjastot

Koska Rust-pohjaiset lohkoketjuohjelmat täytyy olla deterministisiä toimiessaan resurssirajoitteisessa, yksisäikeisessä ympäristössä, niillä on tiettyjä rajoituksia erilaisten kirjastojen käytössä.

Lohkoketjussa toimivat Rust-ohjelmat tukevat suurinta osaa Rustin libstd-, libcore- ja liballoc-kirjastoista sekä monia kolmannen osapuolen crate-paketteja.

Rajoituksia on kuitenkin, koska nämä ohjelmat toimivat resurssirajoitetussa, yksisäikeisessä ympäristössä ja niiden on oltava deterministisiä:

  • Ei pääsyä:
    • rand
    • std::fs
    • std::net
    • std::future
    • std::process
    • std::sync
    • std::task
    • std::thread
    • std::time
  • Rajoitettu pääsy:
    • std::hash
    • std::os
  • Bincode on erittäin laskennallisesti raskas sekä syklien että kutsusyvyyden osalta, ja sitä tulisi välttää
  • Merkkijonojen muotoilua tulisi välttää, koska se on myös laskennallisesti raskasta
  • Ei tukea println!:lle, print!:lle, käytä sen sijaan msg!-makroa
  • Runtime asettaa rajan ohjelman suorittamien käskyjen määrälle yhden käskyn käsittelyn aikana. Katso lisätietoja kohdasta laskentabudjetti

Laskentabudjetti

Lohkoketjun laskentaresurssien väärinkäytön estämiseksi jokaiselle transaktiolle on määritetty laskentabudjetti. Laskentabudjetin ylittäminen johtaa transaktion epäonnistumiseen.

Katso laskennalliset rajoitukset -dokumentaatiosta tarkempia tietoja.

Kutsupinon syvyys - CallDepthExceeded -virhe

Solana-ohjelmien on toimittava nopeasti, ja tämän helpottamiseksi ohjelman kutsupinon syvyys on rajoitettu 64 kehykseen.

Kun ohjelma ylittää sallitun kutsupinon syvyysrajan, se saa CallDepthExceeded -virheen.

CPI-kutsun syvyys - CallDepth -virhe

Cross-program-kutsut mahdollistavat ohjelmien kutsua muita ohjelmia suoraan, mutta syvyys on tällä hetkellä rajoitettu arvoon 4.

Kun ohjelma ylittää sallitun cross-program-kutsun syvyyden, se saa CallDepth -virheen

Liukulukutyyppien tuki Rustissa

Ohjelmat tukevat rajoitettua osajoukkoa Rustin liukulukuoperaatioista. Jos ohjelma yrittää käyttää liukulukuoperaatiota, jota ei tueta, ajoympäristö ilmoittaa ratkaisemattoman symbolin virheen.

Liukulukuoperaatiot suoritetaan ohjelmistokirjastojen avulla, erityisesti LLVM:n liukuluku built-in-toimintojen kautta. Ohjelmistoemuloinnin vuoksi ne kuluttavat enemmän laskentayksikköjä kuin kokonaislukuoperaatiot. Yleisesti ottaen kiintopisteoperaatioita suositellaan käytettäväksi mahdollisuuksien mukaan.

Solana Program Library math -testit raportoivat joidenkin matemaattisten operaatioiden suorituskyvyn. Suorittaaksesi testin, synkronoi repositorion ja suorita:

cargo test-sbf -- --nocapture --test-threads=1

Viimeaikaiset tulokset osoittavat, että liukulukuoperaatiot vaativat enemmän käskyjä verrattuna kokonaislukuvastaaviin. Kiintopistetoteutukset voivat vaihdella, mutta ne ovat myös vähemmän kuin liukulukuvastaavat:

u64 f32
Multiply 8 176
Divide 9 219

Staattinen kirjoitettava data

Ohjelmien jaetut objektit eivät tue kirjoitettavaa jaettua dataa. Ohjelmat jaetaan useiden rinnakkaisten suoritusten kesken käyttäen samaa jaettua vain luku -koodia ja dataa. Tämä tarkoittaa, että kehittäjien ei tulisi sisällyttää staattisia kirjoitettavia tai globaaleja muuttujia ohjelmiin. Tulevaisuudessa copy-on-write-mekanismi voitaisiin lisätä tukemaan kirjoitettavaa dataa.

Etumerkillinen jako

SBF-käskykanta ei tue etumerkillistä jakoa.

Is this page helpful?

Sisällysluettelo

Muokkaa sivua

Hallinnoi

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