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 suorittaa 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:
std::hash
std::os
- Bincode on laskennallisesti erittäin raskas sekä syklien 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
Cross Program Invocation -toiminto mahdollistaa ohjelmien kutsua muita ohjelmia
suoraan, mutta syvyys on tällä hetkellä rajoitettu arvoon 4
.
Kun ohjelma ylittää sallitun ohjelmien välisen kutsusyvyyden,
se saa CallDepth
virheen
Float Rust -tyyppien tuki
Ohjelmat tukevat rajoitettua osajoukkoa Rustin liukulukuoperaatioista. Jos ohjelma yrittää käyttää liukulukuoperaatiota, jota ei tueta, ajoympäristö ilmoittaa ratkaisemattoman symbolin virheen.
Liukulukuoperaatiot suoritetaan ohjelmistokirjastojen kautta, erityisesti LLVM:n float built-ins -toimintojen avulla. 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 repo 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?