Değişiklik kuralları

Özet

Her talimat sonrası çalışma zamanı kontrolleri: yalnızca sahip lamports düşebilir veya veriyi değiştirebilir, veri talimat başına maksimum 10 KiB büyüyebilir, sahip değişiklikleri sıfırlanmış veri gerektirir ve çalıştırılabilir bayrak geri alınamaz.

Solana çalışma zamanı bu kuralları her talimat yürütüldükten sonra BorrowedInstructionAccount metotları aracılığıyla uygular. Her kural değişiklik noktasında kontrol edilir ve herhangi bir kontrol başarısız olursa işlem geri alınır.

Lamports kuralları

KuralUygulamaHata
Yalnızca sahip lamports düşebilirset_lamports(): lamports < current olduğunda is_owned_by_current_program() kontrolü yaparExternalAccountLamportSpend
Salt okunur hesapların lamports değeri değiştirilemezset_lamports(): is_writable() kontrolü yaparReadonlyLamportChange
Herhangi bir program yazılabilir hesaba lamports ekleyebilirset_lamports(): sahiplik kontrolü yalnızca yeni bakiye mevcut bakiyeden az olduğunda uygulanır; yazılabilirlik kontrolü hala geçerlidirReadonlyLamportChange
Lamports bir talimat boyunca dengede olmalıdırTransactionContext::pop(): get_lamports_delta() == 0 doğrulaması yaparUnbalancedInstruction

Veri kuralları

KuralUygulamaHata
Yalnızca sahip veriyi değiştirebilircan_data_be_changed(): is_owned_by_current_program() kontrolü yaparExternalAccountDataModified
Salt okunur hesapların verisi değiştirilemezcan_data_be_changed(): is_writable() kontrolü yaparReadonlyDataModified
Yalnızca sahip veri boyutunu değiştirebilircan_data_be_resized(): new_len != old_len olduğunda is_owned_by_current_program() kontrolü yaparAccountDataSizeChanged
Maksimum veri boyutu: 10 MiBTransactionAccounts::can_data_be_resized(): new_len <= MAX_ACCOUNT_DATA_LEN kontrolü yaparInvalidRealloc
Talimat başına maksimum büyüme: 10 KiBdeserialize_parameters_aligned() içinde deserializasyon: post_len - pre_len <= MAX_PERMITTED_DATA_INCREASE kontrolü yaparInvalidRealloc
İşlem başına maksimum büyüme: 20 MiBTransactionAccounts::can_data_be_resized(): kümülatif resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTION kontrolü yaparMaxAccountsDataAllocationsExceeded

Sahip kuralları

KuralUygulamaHata
Yalnızca mevcut sahip, sahipliği yeniden atayabilirset_owner(): is_owned_by_current_program() kontrolü yaparModifiedProgramId
Hesap yazılabilir olmalıdırset_owner(): is_writable() kontrolü yaparModifiedProgramId
Veri sıfır ile başlatılmış olmalıdırset_owner(): is_zeroed(data) kontrolü yaparModifiedProgramId

Çalıştırılabilir bayrak kuralları

KuralUygulamaHata
Hesap rent-exempt olmalıdırset_executable(): rent.is_exempt(lamports, data_len) kontrolü yaparExecutableAccountNotRentExempt
Yalnızca sahip bayrağı ayarlayabilirset_executable(): is_owned_by_current_program() kontrolü yaparExecutableModified
Hesap yazılabilir olmalıdırset_executable(): is_writable() kontrolü yaparExecutableModified

Rent durum geçişleri

Hesaplar üç RentState değerinden birinde bulunur: Uninitialized (0 lamport), RentPaying (0'ın üzerinde ancak rent-exempt minimumun altında) ve RentExempt (minimumda veya üzerinde). İzin verilmeyen geçişler TransactionError::InsufficientFundsForRent üretir.

Çalışma zamanı bu kuralları transition_allowed() aracılığıyla uygular:

  • Herhangi bir hesap Uninitialized (kapatma) veya RentExempt durumuna geçebilir.
  • Hiçbir hesap Uninitialized veya RentExempt durumundan RentPaying durumuna giremez. Tüm yeni hesaplar rent-exempt olmalıdır.

Hesap ödünç alma kuralları

Talimat yürütme sırasında, çalışma zamanı hesaplar üzerinde tek-yazıcı ödünç alma semantiklerini uygular. Bir program bir hesaba ya bir değiştirilebilir referans ya da birden fazla değiştirilemez referans alabilir, ancak ikisini aynı anda alamaz. Bir program zaten değiştirilebilir şekilde ödünç alınmış bir hesabı ödünç almaya çalışırsa (veya zaten değiştirilemez şekilde ödünç alınmış bir hesabı değiştirilebilir şekilde ödünç almaya çalışırsa), talimat try_borrow() ve try_borrow_mut() aracılığıyla AccountBorrowFailed ile başarısız olur. Bir talimat tamamlandığında hala bekleyen bir ödünç alma varsa, çalışma zamanı TransactionContext::pop() içinde AccountBorrowOutstanding döndürür.

Is this page helpful?

İçindekiler

Sayfayı Düzenle

Yönetici

© 2026 Solana Vakfı.
Tüm hakları saklıdır.
Bağlanın