Akıllı sözleşmeler bir program türü olarak, eksiklikler ve açıklar barındırabilir. Çok sayıda test ve denetimden geçmesine rağmen, hala keşfedilmemiş sorunlar olabilir. Bir kez sözleşme açığı saldırganlar tarafından kullanıldığında, kullanıcı varlıklarının kaybına neden olabilir ve sonuçları ciddi olabilir. Bu nedenle, sözleşmelerin güncellenebilirliği son derece önemlidir; hem açıkları düzeltmek hem de yeni özellikler eklemek için kullanılabilir. Bu yazıda, NEAR platformunda Rust sözleşmelerinin güncellenme yöntemleri tanıtılacaktır.
NEAR akıllı sözleşmeler yükseltme yöntemi
StatusMessage projesini örnek alarak, NEAR akıllı sözleşmelerinin yaygın güncelleme yöntemlerini tanıtın.
1. Sözleşme veri yapısı değiştirilmedi
Eğer yalnızca sözleşme mantığını değiştiriyorsanız ve veri yapısında bir değişiklik yoksa, doğrudan near deploy komutunu kullanarak yeni kodu yeniden dağıtabilirsiniz. Örneğin, orijinal sözleşme üzerine yeni bir fonksiyon ekliyoruz:
pas
#[near_bindgen]
impl StatusMessage {
Option {
let account_id = env::signer_account_id();
self.records.insert(&account_id, &message);
return self.records.get(&account_id);
}
}
Derleme tamamlandıktan sonra, near deploy ile yeniden dağıtım yapabilirsiniz. Orijinal sözleşmedeki veriler hala normal bir şekilde okunabilir.
( 2. Sözleşme veri yapısı değiştirildi.
Eğer sözleşmenin veri yapısı değiştirilirse, doğrudan yeniden dağıtım durumunun tersine serileştirilmesi hatasına neden olacaktır. Örneğin, sözleşme yapısını aşağıdaki gibi değiştirdik:
Akıllı sözleşmelerin yükseltilmesinin güvenlik değerlendirmesi
Yetki kontrolü: Yükseltme fonksiyonu only owner fonksiyonu olarak ayarlanmalı, böylece yalnızca owner tarafından çağrılmasını sağlamalıdır.
Sözleşme sahibini DAO olarak ayarlamanızı öneririz, sözleşmeyi yönetmek için öneri ve oylama yoluyla.
Göç fonksiyonundan önce #[init)ignore_state)] ekleyin, böylece yürütmeden önce durum yüklenmez.
Göç tamamlandıktan sonra göç fonksiyonunu silin, sadece bir kez çağrıldığından emin olun.
Yeni veri yapıları taşınırken başlatılır.
Sözleşme yükseltmesi karmaşık bir süreçtir ve dikkatle ele alınmalıdır. Mantıklı bir tasarım ve sıkı testler ile güvenli ve güvenilir bir sözleşme yükseltmesi gerçekleştirilebilir.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
Rust akıllı sözleşmeler yükseltme kılavuzu: NEAR platform güvenlik güncelleme yöntemleri detaylı açıklama
Rust akıllı sözleşmeler yükseltme kılavuzu
Akıllı sözleşmeler bir program türü olarak, eksiklikler ve açıklar barındırabilir. Çok sayıda test ve denetimden geçmesine rağmen, hala keşfedilmemiş sorunlar olabilir. Bir kez sözleşme açığı saldırganlar tarafından kullanıldığında, kullanıcı varlıklarının kaybına neden olabilir ve sonuçları ciddi olabilir. Bu nedenle, sözleşmelerin güncellenebilirliği son derece önemlidir; hem açıkları düzeltmek hem de yeni özellikler eklemek için kullanılabilir. Bu yazıda, NEAR platformunda Rust sözleşmelerinin güncellenme yöntemleri tanıtılacaktır.
NEAR akıllı sözleşmeler yükseltme yöntemi
StatusMessage projesini örnek alarak, NEAR akıllı sözleşmelerinin yaygın güncelleme yöntemlerini tanıtın.
1. Sözleşme veri yapısı değiştirilmedi
Eğer yalnızca sözleşme mantığını değiştiriyorsanız ve veri yapısında bir değişiklik yoksa, doğrudan near deploy komutunu kullanarak yeni kodu yeniden dağıtabilirsiniz. Örneğin, orijinal sözleşme üzerine yeni bir fonksiyon ekliyoruz:
pas #[near_bindgen] impl StatusMessage { Option { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); return self.records.get(&account_id); } }
Derleme tamamlandıktan sonra, near deploy ile yeniden dağıtım yapabilirsiniz. Orijinal sözleşmedeki veriler hala normal bir şekilde okunabilir.
( 2. Sözleşme veri yapısı değiştirildi.
Eğer sözleşmenin veri yapısı değiştirilirse, doğrudan yeniden dağıtım durumunun tersine serileştirilmesi hatasına neden olacaktır. Örneğin, sözleşme yapısını aşağıdaki gibi değiştirdik:
pas #[near_bindgen] #[derive)BorshDeserialize, BorshSerialize###] pub struct StatusMessage { sloganlar: LookupMap<string, string="">, bios: LookupMap<string, string="">, }
Bu durumda, yükseltme için Migrate yönteminin kullanılması gerekmektedir. Yeni sözleşmeye migrate yöntemini ekleyin:
pas #( #[init)ignore_state[private]] Self { let old_state: OldStatusMessage = env::state_read().expect("başarısız"); Kendin { taglines: old_state.records, bios: LookupMap::new(b"b".to_vec)(), } }
Sonra dağıtım sırasında migrate yöntemini çağırın:
yakın dağıtım
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction "migrate"
--initArgs "{}"
--accountId statusmessage.blocksec_upgrade.testnet
Böylece sözleşmeyi başarıyla güncelleyebilir ve eski verileri taşıyabilirsiniz.
ignore_state)] ekleyin, böylece yürütmeden önce durum yüklenmez.
Göç tamamlandıktan sonra göç fonksiyonunu silin, sadece bir kez çağrıldığından emin olun.
Yeni veri yapıları taşınırken başlatılır.
Sözleşme yükseltmesi karmaşık bir süreçtir ve dikkatle ele alınmalıdır. Mantıklı bir tasarım ve sıkı testler ile güvenli ve güvenilir bir sözleşme yükseltmesi gerçekleştirilebilir.