Aturan modifikasi

Ringkasan

Pemeriksaan runtime setelah setiap instruksi: hanya pemilik yang dapat mendebit lamport atau memodifikasi data, data dapat bertambah maksimal 10 KiB per instruksi, perubahan pemilik memerlukan data yang diinisialisasi nol, dan flag executable bersifat ireversibel.

Runtime Solana menerapkan aturan-aturan ini setelah setiap instruksi dieksekusi melalui metode BorrowedInstructionAccount. Setiap aturan diperiksa pada titik modifikasi, dan transaksi akan dibatalkan jika ada pemeriksaan yang gagal.

Aturan lamport

AturanPenerapanError
Hanya pemilik yang dapat mendebit lamportset_lamports(): memeriksa is_owned_by_current_program() ketika lamports < currentExternalAccountLamportSpend
Akun read-only tidak dapat mengubah lamportset_lamports(): memeriksa is_writable()ReadonlyLamportChange
Program apa pun dapat mengkredit lamport ke akun yang dapat ditulisset_lamports(): pemeriksaan kepemilikan hanya berlaku ketika saldo baru kurang dari saldo saat ini; pemeriksaan writable tetap berlakuReadonlyLamportChange
Lamport harus seimbang di seluruh instruksiTransactionContext::pop(): memverifikasi get_lamports_delta() == 0UnbalancedInstruction

Aturan data

AturanPenerapanError
Hanya pemilik yang dapat memodifikasi datacan_data_be_changed(): memeriksa is_owned_by_current_program()ExternalAccountDataModified
Akun read-only tidak dapat memodifikasi datacan_data_be_changed(): memeriksa is_writable()ReadonlyDataModified
Hanya pemilik yang dapat mengubah ukuran datacan_data_be_resized(): memeriksa is_owned_by_current_program() ketika new_len != old_lenAccountDataSizeChanged
Ukuran data maksimal: 10 MiBTransactionAccounts::can_data_be_resized(): memeriksa new_len <= MAX_ACCOUNT_DATA_LENInvalidRealloc
Pertumbuhan maksimal per instruksi: 10 KiBDeserialisasi di deserialize_parameters_aligned(): memeriksa post_len - pre_len <= MAX_PERMITTED_DATA_INCREASEInvalidRealloc
Pertumbuhan maksimal per transaksi: 20 MiBTransactionAccounts::can_data_be_resized(): memeriksa kumulatif resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTIONMaxAccountsDataAllocationsExceeded

Aturan pemilik

AturanPenegakanError
Hanya pemilik saat ini yang dapat menetapkan ulang pemilikset_owner(): memeriksa is_owned_by_current_program()ModifiedProgramId
Akun harus dapat ditulisset_owner(): memeriksa is_writable()ModifiedProgramId
Data harus diinisialisasi dengan nolset_owner(): memeriksa is_zeroed(data)ModifiedProgramId

Aturan flag executable

AturanPenegakanError
Akun harus bebas rentset_executable(): memeriksa rent.is_exempt(lamports, data_len)ExecutableAccountNotRentExempt
Hanya pemilik yang dapat mengatur flagset_executable(): memeriksa is_owned_by_current_program()ExecutableModified
Akun harus dapat ditulisset_executable(): memeriksa is_writable()ExecutableModified

Transisi status rent

Akun berada dalam salah satu dari tiga nilai RentState: Uninitialized (0 lamport), RentPaying (di atas 0 tetapi di bawah minimum bebas rent), dan RentExempt (pada atau di atas minimum). Transisi yang tidak diizinkan menghasilkan TransactionError::InsufficientFundsForRent.

Runtime menegakkan aturan ini melalui transition_allowed():

  • Akun apa pun dapat bertransisi ke Uninitialized (tutup) atau RentExempt.
  • Tidak ada akun yang dapat memasuki RentPaying dari Uninitialized atau RentExempt. Semua akun baru harus bebas rent.

Aturan peminjaman akun

Selama eksekusi instruksi, runtime menegakkan semantik peminjaman single-writer pada akun. Sebuah program dapat memperoleh satu referensi mutable atau beberapa referensi immutable ke sebuah akun, tetapi tidak keduanya secara bersamaan. Jika sebuah program mencoba meminjam akun yang sudah dipinjam secara mutable (atau meminjam secara mutable akun yang sudah dipinjam secara immutable), instruksi gagal dengan AccountBorrowFailed melalui try_borrow() dan try_borrow_mut(). Jika sebuah instruksi selesai sementara peminjaman masih berlangsung, runtime mengembalikan AccountBorrowOutstanding di TransactionContext::pop().

Is this page helpful?

Daftar Isi

Edit Halaman

Dikelola oleh

© 2026 Yayasan Solana.
Semua hak dilindungi.
Terhubung