Rajoitukset
Solana-lohkoketjussa ohjelmien kehittämiseen liittyy tiettyjä rajoituksia. Alla on luettelo yleisistä rajoituksista, joihin saatat törmätä.
Rust-kirjastot
Koska Rust-pohjaisten lohkoketjuohjelmien täytyy toimia deterministisesti resurssirajoitetussa, yksisäikeisessä ympäristössä, niillä on tiettyjä rajoituksia eri 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ä seuraaviin:
rand
std::fs
std::net
std::future
std::process
std::sync
std::task
std::thread
std::time
- Rajoitettu pääsy seuraaviin:
std::hash
std::os
- Bincode on laskennallisesti erittäin raskas sekä suoritusjaksojen että kutsusyvyyden osalta, joten sitä tulisi välttää
- Merkkijonojen muotoilua tulisi välttää, koska se on myös laskennallisesti raskasta
- Ei tukea
println!
taiprint!
-toiminnoille, käytä sen sijaanmsg!
-makroa - Ajoympäristö asettaa rajoituksen ohjelman suorittamien käskyjen määrälle yhden käskyn käsittelyn aikana. Katso lisätietoja laskentabudjetista
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 virheen
CallDepthExceeded
.
CPI-kutsusyvyys - CallDepth
virhe
Ohjelmien väliset kutsut (cross-program invocations) mahdollistavat ohjelmien
kutsua toisia ohjelmia suoraan, mutta syvyys on tällä hetkellä rajoitettu arvoon
4
.
Kun ohjelma ylittää sallitun ohjelmien välisen kutsusyvyyden,
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?