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 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! tai print! -toiminnoille, käytä sen sijaan msg! -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 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