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ä:
randstd::fsstd::netstd::futurestd::processstd::syncstd::taskstd::threadstd::time
- Rajoitettu pääsy:
std::hashstd::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 sijaanmsg!-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 f32Multiply 8 176Divide 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?