Zasady modyfikacji

Podsumowanie

Kontrole w czasie wykonywania po każdej instrukcji: tylko właściciel może obciążać konto lamportami lub modyfikować dane, dane mogą rosnąć maksymalnie o 10 KiB na instrukcję, zmiana właściciela wymaga danych wyzerowanych, a flaga wykonywalności jest nieodwracalna.

Środowisko uruchomieniowe Solana egzekwuje te zasady po wykonaniu każdej instrukcji za pomocą metod BorrowedInstructionAccount. Każda zasada jest sprawdzana w momencie modyfikacji, a transakcja jest wycofywana, jeśli którakolwiek kontrola się nie powiedzie.

Zasady dotyczące lamportów

ZasadaEgzekwowanieBłąd
Tylko właściciel może obciążać konto lamportamiset_lamports(): sprawdza is_owned_by_current_program(), gdy lamports < currentExternalAccountLamportSpend
Konta tylko do odczytu nie mogą mieć zmienianych lamportówset_lamports(): sprawdza is_writable()ReadonlyLamportChange
Każdy program może dodać lamporty do zapisywalnego kontaset_lamports(): kontrola właściciela dotyczy tylko sytuacji, gdy nowy bilans jest mniejszy niż obecny; kontrola zapisywalności nadal obowiązujeReadonlyLamportChange
Bilans lamportów musi się zgadzać w ramach instrukcjiTransactionContext::pop(): weryfikuje get_lamports_delta() == 0UnbalancedInstruction

Zasady dotyczące danych

ZasadaEgzekwowanieBłąd
Tylko właściciel może modyfikować danecan_data_be_changed(): sprawdza is_owned_by_current_program()ExternalAccountDataModified
Konta tylko do odczytu nie mogą mieć modyfikowanych danychcan_data_be_changed(): sprawdza is_writable()ReadonlyDataModified
Tylko właściciel może zmieniać rozmiar danychcan_data_be_resized(): sprawdza is_owned_by_current_program(), gdy new_len != old_lenAccountDataSizeChanged
Maksymalny rozmiar danych: 10 MiBTransactionAccounts::can_data_be_resized(): sprawdza new_len <= MAX_ACCOUNT_DATA_LENInvalidRealloc
Maksymalny przyrost na instrukcję: 10 KiBDeserializacja w deserialize_parameters_aligned(): sprawdza post_len - pre_len <= MAX_PERMITTED_DATA_INCREASEInvalidRealloc
Maksymalny przyrost na transakcję: 20 MiBTransactionAccounts::can_data_be_resized(): sprawdza sumarycznie resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTIONMaxAccountsDataAllocationsExceeded

Zasady właściciela

ZasadaEgzekwowanieBłąd
Tylko obecny właściciel może zmienić właścicielaset_owner(): sprawdza is_owned_by_current_program()ModifiedProgramId
Konto musi być zapisywalneset_owner(): sprawdza is_writable()ModifiedProgramId
Dane muszą być wyzerowaneset_owner(): sprawdza is_zeroed(data)ModifiedProgramId

Zasady flagi wykonywalności

ZasadaEgzekwowanieBłąd
Konto musi być zwolnione z rentset_executable(): sprawdza rent.is_exempt(lamports, data_len)ExecutableAccountNotRentExempt
Tylko właściciel może ustawić flagęset_executable(): sprawdza is_owned_by_current_program()ExecutableModified
Konto musi być zapisywalneset_executable(): sprawdza is_writable()ExecutableModified

Przejścia stanów rent

Konta istnieją w jednym z trzech RentState stanów: Uninitialized (0 lamportów), RentPaying (powyżej 0, ale poniżej minimum zwolnienia z rent), oraz RentExempt (na poziomie minimum lub powyżej). Niedozwolone przejścia powodują TransactionError::InsufficientFundsForRent.

Środowisko wykonawcze egzekwuje te zasady przez transition_allowed():

  • Każde konto może przejść do Uninitialized (zamknięcie) lub RentExempt.
  • Żadne konto nie może wejść w RentPaying z Uninitialized ani RentExempt. Wszystkie nowe konta muszą być zwolnione z rent.

Zasady pożyczania konta

Podczas wykonywania instrukcji środowisko wykonawcze egzekwuje semantykę pojedynczego zapisu na kontach. Program może uzyskać albo jedno mutowalne odwołanie, albo wiele niemutowalnych odwołań do konta, ale nie oba jednocześnie. Jeśli program spróbuje pożyczyć konto, które jest już mutowalnie pożyczone (lub mutowalnie pożyczyć konto, które jest już niemutowalnie pożyczone), instrukcja zakończy się niepowodzeniem z AccountBorrowFailed przez try_borrow() oraz try_borrow_mut(). Jeśli instrukcja zakończy się, gdy pożyczka nadal trwa, środowisko wykonawcze zwraca AccountBorrowOutstanding w TransactionContext::pop().

Is this page helpful?

Spis treści

Edytuj stronę

Zarządzane przez

© 2026 Solana Foundation.
Wszelkie prawa zastrzeżone.
Bądź na bieżąco