Seri Pengembangan Smart Contract Rust: Metode Peningkatan Kontrak
Kontrak pintar sebagai jenis kode program, tidak dapat dihindari akan memiliki cacat dan perlu perbaikan. Meskipun telah melalui banyak pengujian dan audit, kontrak masih mungkin memiliki celah. Begitu celah tersebut dimanfaatkan oleh penyerang, dapat mengakibatkan kerugian aset pengguna dan konsekuensi serius lainnya. Oleh karena itu, kemampuan kontrak untuk diperbarui sangat penting, baik untuk memperbaiki celah maupun untuk menambahkan fungsi baru. Artikel ini akan memperkenalkan beberapa cara untuk memperbarui kontrak pintar Rust.
Metode Pemutakhiran Kontrak NEAR
Menggunakan proyek StatusMessage sebagai contoh, memperkenalkan metode umum untuk meningkatkan kontrak NEAR.
Jika hanya mengubah logika kontrak, tanpa melibatkan perubahan struktur data, Anda dapat langsung menggunakan perintah near deploy untuk mendeply kode baru.
Dengan cara ini, data lama dapat berhasil dipindahkan ke struktur data baru.
Pertimbangan Keamanan dalam Upgrade Kontrak
Kontrol akses - Fungsi upgrade harus eksklusif untuk pemilik, disarankan untuk menetapkan pemilik sebagai DAO
Tambahkan #[init(ignore_state)] sebelum fungsi migrasi
Hapus fungsi migrasi setelah migrasi selesai
Struktur data baru diinisialisasi saat migrasi
Dengan merancang mekanisme peningkatan yang wajar, dapat mencapai kemampuan kontrak untuk ditingkatkan dengan menjamin keamanan, yang menjadi dasar untuk pemeliharaan dan optimasi jangka panjang.
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
Praktik Upgrade Smart Contract Rust: Tiga Metode dan Pertimbangan Keamanan dalam Ekosistem NEAR
Seri Pengembangan Smart Contract Rust: Metode Peningkatan Kontrak
Kontrak pintar sebagai jenis kode program, tidak dapat dihindari akan memiliki cacat dan perlu perbaikan. Meskipun telah melalui banyak pengujian dan audit, kontrak masih mungkin memiliki celah. Begitu celah tersebut dimanfaatkan oleh penyerang, dapat mengakibatkan kerugian aset pengguna dan konsekuensi serius lainnya. Oleh karena itu, kemampuan kontrak untuk diperbarui sangat penting, baik untuk memperbaiki celah maupun untuk menambahkan fungsi baru. Artikel ini akan memperkenalkan beberapa cara untuk memperbarui kontrak pintar Rust.
Metode Pemutakhiran Kontrak NEAR
Menggunakan proyek StatusMessage sebagai contoh, memperkenalkan metode umum untuk meningkatkan kontrak NEAR.
StatusMessage kode contoh kontrak:
karat #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct StatusMessage { catatan: LookupMap<string, string="">, }
impl Default for StatusMessage { Self { Diri { catatan: 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. Upgrade struktur data kontrak tidak diubah
Jika hanya mengubah logika kontrak, tanpa melibatkan perubahan struktur data, Anda dapat langsung menggunakan perintah near deploy untuk mendeply kode baru.
Misalnya menambahkan fungsi baru:
karat Option { let account_id = env::signer_account_id)(; self.records.insert)&account_id, &message###; return self.records.get(&account_id); }
Setelah penyebaran ulang, data lama masih dapat dibaca dengan normal.
( 2. Upgrade struktur data kontrak
Jika struktur data kontrak diubah, redeploy langsung akan menyebabkan kegagalan deserialisasi status.
Misalnya mengubah struktur data:
karat pub struct StatusMessage { taglines: LookupMap<string, string="">, bios: LookupMap<string, string="">, }
Dalam situasi ini, perlu menggunakan metode Migrate untuk melakukan upgrade.
) 3. Menggunakan metode Migrate untuk peningkatan
Tambahkan metode migrate di kontrak baru:
karat #( #[init)ignore_state(] Self { let old_state: OldStatusMessage = env::state_read)###.expect###'failed'[private]; Diri { taglines: old_state.records, bios: LookupMap::new(b'b'.to_vec)(), } }
Panggil metode migrate saat melakukan penyebaran:
dekat deploy
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate' \ --initArgs '{}'
--accountId statusmessage.blocksec_upgrade.testnet
Dengan cara ini, data lama dapat berhasil dipindahkan ke struktur data baru.
Pertimbangan Keamanan dalam Upgrade Kontrak
Kontrol akses - Fungsi upgrade harus eksklusif untuk pemilik, disarankan untuk menetapkan pemilik sebagai DAO
Tambahkan #[init(ignore_state)] sebelum fungsi migrasi
Hapus fungsi migrasi setelah migrasi selesai
Struktur data baru diinisialisasi saat migrasi
Dengan merancang mekanisme peningkatan yang wajar, dapat mencapai kemampuan kontrak untuk ditingkatkan dengan menjamin keamanan, yang menjadi dasar untuk pemeliharaan dan optimasi jangka panjang.
![](https://img-cdn.gateio.im/webp-social/moments-af3fe22c1999da5db0e2853b8a271276.webp(</string,></string,></string,>