Yhteenveto
Ajonaikaiset tarkistukset jokaisen ohjeen jälkeen: vain omistaja voi vähentää lamportteja tai muokata dataa, data voi kasvaa enintään 10 KiB per ohje, omistajan vaihdot vaativat nolla-alustetun datan, ja suoritettava lippu on peruuttamaton.
Solana-ajonaikainen ympäristö valvoo näitä sääntöjä jokaisen ohjeen suorituksen
jälkeen
BorrowedInstructionAccount-metodien
kautta. Jokainen sääntö tarkistetaan muokkaushetkellä, ja transaktio
peruutetaan, jos jokin tarkistus epäonnistuu.
Lamportti-säännöt
| Sääntö | Valvonta | Virhe |
|---|---|---|
| Vain omistaja voi vähentää lamportteja | set_lamports(): tarkistaa is_owned_by_current_program() kun lamports < current | ExternalAccountLamportSpend |
| Vain luku -tilien lamportteja ei voi muuttaa | set_lamports(): tarkistaa is_writable() | ReadonlyLamportChange |
| Mikä tahansa ohjelma voi hyvittää lamportteja kirjoitettavalle tilille | set_lamports(): omistajuustarkistus koskee vain silloin, kun uusi saldo on pienempi kuin nykyinen saldo; kirjoitettavuustarkistus pätee edelleen | ReadonlyLamportChange |
| Lamporttien on oltava tasapainossa ohjeen yli | TransactionContext::pop(): varmistaa get_lamports_delta() == 0 | UnbalancedInstruction |
Data-säännöt
| Sääntö | Valvonta | Virhe |
|---|---|---|
| Vain omistaja voi muokata dataa | can_data_be_changed(): tarkistaa is_owned_by_current_program() | ExternalAccountDataModified |
| Vain luku -tilien dataa ei voi muokata | can_data_be_changed(): tarkistaa is_writable() | ReadonlyDataModified |
| Vain omistaja voi muuttaa datan kokoa | can_data_be_resized(): tarkistaa is_owned_by_current_program() kun new_len != old_len | AccountDataSizeChanged |
| Datan enimmäiskoko: 10 MiB | TransactionAccounts::can_data_be_resized(): tarkistaa new_len <= MAX_ACCOUNT_DATA_LEN | InvalidRealloc |
| Enimmäiskasvu per ohje: 10 KiB | Deserialisointi deserialize_parameters_aligned(): tarkistaa post_len - pre_len <= MAX_PERMITTED_DATA_INCREASE | InvalidRealloc |
| Enimmäiskasvu per transaktio: 20 MiB | TransactionAccounts::can_data_be_resized(): tarkistaa kumulatiivisen resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTION | MaxAccountsDataAllocationsExceeded |
Omistajasäännöt
| Sääntö | Valvonta | Virhe |
|---|---|---|
| Vain nykyinen omistaja voi määrittää omistajan uudelleen | set_owner(): tarkistaa is_owned_by_current_program() | ModifiedProgramId |
| Tilin on oltava kirjoitettavissa | set_owner(): tarkistaa is_writable() | ModifiedProgramId |
| Datan on oltava nolla-alustettu | set_owner(): tarkistaa is_zeroed(data) | ModifiedProgramId |
Suoritettavuuslippusäännöt
| Sääntö | Valvonta | Virhe |
|---|---|---|
| Tilin on oltava rent-vapaa | set_executable(): tarkistaa rent.is_exempt(lamports, data_len) | ExecutableAccountNotRentExempt |
| Vain omistaja voi asettaa lipun | set_executable(): tarkistaa is_owned_by_current_program() | ExecutableModified |
| Tilin on oltava kirjoitettavissa | set_executable(): tarkistaa is_writable() | ExecutableModified |
Rent-tilasiirtymät
Tilit ovat yhdessä kolmesta
RentState
-arvosta: Uninitialized (0 lamportia), RentPaying (yli 0 mutta alle
rent-vapaan minimin) ja RentExempt (minimissä tai sen yli). Kielletyt
siirtymät tuottavat TransactionError::InsufficientFundsForRent.
Ajonaikainen ympäristö valvoo näitä sääntöjä
transition_allowed()-funktion
kautta:
- Mikä tahansa tili voi siirtyä tilaan
Uninitialized(sulkeminen) taiRentExempt. - Mikään tili ei voi siirtyä tilaan
RentPayingtilastaUninitializedtaiRentExempt. Kaikkien uusien tilien on oltava rent-vapaita.
Tilin lainaussäännöt
Käskyn suorituksen aikana ajonaikainen ympäristö valvoo tilien yhden
kirjoittajan lainaussematiikkaa. Ohjelma voi saada joko yhden muutettavan
viitteen tai useita muuttumattomia viitteitä tiliin, mutta ei molempia
samanaikaisesti. Jos ohjelma yrittää lainata tiliä, joka on jo muutettavasti
lainattu (tai muutettavasti lainata tiliä, joka on jo muuttumattomasti
lainattu), käsky epäonnistuu virheellä AccountBorrowFailed
try_borrow()-
ja
try_borrow_mut()-funktioiden
kautta. Jos käsky valmistuu lainauksen ollessa vielä voimassa, ajonaikainen
ympäristö palauttaa virheen AccountBorrowOutstanding
TransactionContext::pop()-funktiossa.
Is this page helpful?