Rust akıllı sözleşmeler geliştirme serisi: Sözleşme yükseltme yöntemleri
Akıllı sözleşmeler bir program kodu olarak, kaçınılmaz olarak eksiklikler ve geliştirilmesi gereken yerler barındırmaktadır. Çok sayıda test ve denetimden geçirilmiş olmasına rağmen, sözleşmelerde hala açıklar bulunabilir. Bir kez açıklar saldırganlar tarafından kullanıldığında, kullanıcı varlıklarının kaybı gibi ciddi sonuçlara yol açabilir. Bu nedenle, sözleşmelerin yükseltilebilirliği son derece önemlidir; hem açıkları düzeltmek hem de yeni özellikler eklemek için kullanılabilir. Bu yazıda Rust akıllı sözleşmelerinin birkaç yükseltme yöntemini tanıtacağız.
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ında değişiklik yapılmamış güncelleme
Eğer sadece sözleşme mantığını değiştiriyorsanız ve veri yapısında bir değişiklik yoksa, yeni kodu yeniden dağıtmak için doğrudan near deploy komutunu kullanabilirsiniz.
Örneğin yeni bir fonksiyon eklemek:
pas
Option {
let account_id = env::signer_account_id)(;
self.records.insert)&account_id, &message###;
return self.records.get(&account_id);
}
Yeniden dağıtıldıktan sonra, mevcut veriler normal olarak okunabilir.
( 2. Akıllı sözleşmeler veri yapısı değişikliği yükseltmesi
Eğer sözleşmenin veri yapısı değiştirilirse, doğrudan yeniden dağıtım durumu tersine serileştirme hatasına yol açar.
Bu durumda yükseltme işlemi için Migrate yönteminin kullanılması gerekir.
) 3. Migrate yöntemini kullanarak yükseltme
Yeni sözleşmeye migrate yöntemi ekleyin:
pas
#(
#[init)ignore_state(]
Self {
let old_state: OldStatusMessage = env::state_read)###.expect###'başarısız'[private];
Kendisi {
sloganlar: eski_durum.kayıtları,
bios: LookupMap::new(b'b'.to_vec)(),
}
}
Dağıtım sırasında aynı anda migrate yöntemini çağırın:
yakın dağıtım
--wasmDosyası hedef/wasm32-bilinmeyen-bilinmeyen/salı/status_message.wasm
--initFunction 'migrate'
--initArgs '{}' \
--accountId durum mesajı.blocksec_upgrade.testnet
Bu şekilde eski veriler yeni veri yapısına başarıyla taşınabilir.
Sözleşme Güncellemesinin Güvenlik Değerlendirmesi
Yetki kontrolü - Yükseltme fonksiyonu owner'a özel olmalıdır, owner'ı DAO olarak ayarlamanız önerilir.
Göç fonksiyonundan önce #[init(ignore_state)] ekleyin
Göç tamamlandıktan sonra göç işlevini silin
Yeni veri yapıları göç sırasında başlatılır.
Rasyonel bir şekilde tasarlanmış bir yükseltme mekanizması ile, güvenliği sağlarken sözleşmelerin yükseltilebilirliğini gerçekleştirmek, uzun vadeli bakım ve optimizasyon için bir temel oluşturabilir.
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.
17 Likes
Reward
17
4
Share
Comment
0/400
PretendingToReadDocs
· 07-23 12:26
Temsilci sözleşmesi daha güvenli.
View OriginalReply0
ArbitrageBot
· 07-23 12:19
Yükseltmek, emiciler tarafından oyuna getirilmekten korkmak
Rust akıllı sözleşmeler yükseltme pratiği: NEAR ekosisteminde üç yöntem ve güvenlik değerlendirmeleri
Rust akıllı sözleşmeler geliştirme serisi: Sözleşme yükseltme yöntemleri
Akıllı sözleşmeler bir program kodu olarak, kaçınılmaz olarak eksiklikler ve geliştirilmesi gereken yerler barındırmaktadır. Çok sayıda test ve denetimden geçirilmiş olmasına rağmen, sözleşmelerde hala açıklar bulunabilir. Bir kez açıklar saldırganlar tarafından kullanıldığında, kullanıcı varlıklarının kaybı gibi ciddi sonuçlara yol açabilir. Bu nedenle, sözleşmelerin yükseltilebilirliği son derece önemlidir; hem açıkları düzeltmek hem de yeni özellikler eklemek için kullanılabilir. Bu yazıda Rust akıllı sözleşmelerinin birkaç yükseltme yöntemini tanıtacağız.
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.
StatusMessage akıllı sözleşmeler kod örneği:
pas #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct StatusMessage { kayıtlar: LookupMap<string, string="">, }
impl Default for StatusMessage { Self { Kendin { kayıtlar: LookupMap::new(b'r'.to_vec)((, } } }
#[near_bindgen] impl StatusMessage { pub fn set_status)&mut self, message: String) { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); }
Option { return self.records.get(&account_id); } }
( 1. Sözleşme veri yapısında değişiklik yapılmamış güncelleme
Eğer sadece sözleşme mantığını değiştiriyorsanız ve veri yapısında bir değişiklik yoksa, yeni kodu yeniden dağıtmak için doğrudan near deploy komutunu kullanabilirsiniz.
Örneğin yeni bir fonksiyon eklemek:
pas Option { let account_id = env::signer_account_id)(; self.records.insert)&account_id, &message###; return self.records.get(&account_id); }
Yeniden dağıtıldıktan sonra, mevcut veriler normal olarak okunabilir.
( 2. Akıllı sözleşmeler veri yapısı değişikliği yükseltmesi
Eğer sözleşmenin veri yapısı değiştirilirse, doğrudan yeniden dağıtım durumu tersine serileştirme hatasına yol açar.
Örneğin veri yapısını değiştirme:
rust pub struct DurumMesajı { sloganlar: LookupMap<string, string="">, bios: LookupMap<string, string="">, }
Bu durumda yükseltme işlemi için Migrate yönteminin kullanılması gerekir.
) 3. Migrate yöntemini kullanarak yükseltme
Yeni sözleşmeye migrate yöntemi ekleyin:
pas #( #[init)ignore_state(] Self { let old_state: OldStatusMessage = env::state_read)###.expect###'başarısız'[private]; Kendisi { sloganlar: eski_durum.kayıtları, bios: LookupMap::new(b'b'.to_vec)(), } }
Dağıtım sırasında aynı anda migrate yöntemini çağırın:
yakın dağıtım
--wasmDosyası hedef/wasm32-bilinmeyen-bilinmeyen/salı/status_message.wasm
--initFunction 'migrate'
--initArgs '{}' \ --accountId durum mesajı.blocksec_upgrade.testnet
Bu şekilde eski veriler yeni veri yapısına başarıyla taşınabilir.
Sözleşme Güncellemesinin Güvenlik Değerlendirmesi
Yetki kontrolü - Yükseltme fonksiyonu owner'a özel olmalıdır, owner'ı DAO olarak ayarlamanız önerilir.
Göç fonksiyonundan önce #[init(ignore_state)] ekleyin
Göç tamamlandıktan sonra göç işlevini silin
Yeni veri yapıları göç sırasında başlatılır.
Rasyonel bir şekilde tasarlanmış bir yükseltme mekanizması ile, güvenliği sağlarken sözleşmelerin yükseltilebilirliğini gerçekleştirmek, uzun vadeli bakım ve optimizasyon için bir temel oluşturabilir.
![](https://img-cdn.gateio.im/webp-social/moments-af3fe22c1999da5db0e2853b8a271276.webp(</string,></string,></string,>