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
| Aturan | Penerapan | Error |
|---|---|---|
| Hanya pemilik yang dapat mendebit lamport | set_lamports(): memeriksa is_owned_by_current_program() ketika lamports < current | ExternalAccountLamportSpend |
| Akun read-only tidak dapat mengubah lamport | set_lamports(): memeriksa is_writable() | ReadonlyLamportChange |
| Program apa pun dapat mengkredit lamport ke akun yang dapat ditulis | set_lamports(): pemeriksaan kepemilikan hanya berlaku ketika saldo baru kurang dari saldo saat ini; pemeriksaan writable tetap berlaku | ReadonlyLamportChange |
| Lamport harus seimbang di seluruh instruksi | TransactionContext::pop(): memverifikasi get_lamports_delta() == 0 | UnbalancedInstruction |
Aturan data
| Aturan | Penerapan | Error |
|---|---|---|
| Hanya pemilik yang dapat memodifikasi data | can_data_be_changed(): memeriksa is_owned_by_current_program() | ExternalAccountDataModified |
| Akun read-only tidak dapat memodifikasi data | can_data_be_changed(): memeriksa is_writable() | ReadonlyDataModified |
| Hanya pemilik yang dapat mengubah ukuran data | can_data_be_resized(): memeriksa is_owned_by_current_program() ketika new_len != old_len | AccountDataSizeChanged |
| Ukuran data maksimal: 10 MiB | TransactionAccounts::can_data_be_resized(): memeriksa new_len <= MAX_ACCOUNT_DATA_LEN | InvalidRealloc |
| Pertumbuhan maksimal per instruksi: 10 KiB | Deserialisasi di deserialize_parameters_aligned(): memeriksa post_len - pre_len <= MAX_PERMITTED_DATA_INCREASE | InvalidRealloc |
| Pertumbuhan maksimal per transaksi: 20 MiB | TransactionAccounts::can_data_be_resized(): memeriksa kumulatif resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTION | MaxAccountsDataAllocationsExceeded |
Aturan pemilik
| Aturan | Penegakan | Error |
|---|---|---|
| Hanya pemilik saat ini yang dapat menetapkan ulang pemilik | set_owner(): memeriksa is_owned_by_current_program() | ModifiedProgramId |
| Akun harus dapat ditulis | set_owner(): memeriksa is_writable() | ModifiedProgramId |
| Data harus diinisialisasi dengan nol | set_owner(): memeriksa is_zeroed(data) | ModifiedProgramId |
Aturan flag executable
| Aturan | Penegakan | Error |
|---|---|---|
| Akun harus bebas rent | set_executable(): memeriksa rent.is_exempt(lamports, data_len) | ExecutableAccountNotRentExempt |
| Hanya pemilik yang dapat mengatur flag | set_executable(): memeriksa is_owned_by_current_program() | ExecutableModified |
| Akun harus dapat ditulis | set_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) atauRentExempt. - Tidak ada akun yang dapat memasuki
RentPayingdariUninitializedatauRentExempt. 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?