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

  1. Kontrol akses - Fungsi upgrade harus eksklusif untuk pemilik, disarankan untuk menetapkan pemilik sebagai DAO

  2. Tambahkan #[init(ignore_state)] sebelum fungsi migrasi

  3. Hapus fungsi migrasi setelah migrasi selesai

  4. 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,>

GET-3.47%
Lihat Asli
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.
  • Hadiah
  • 4
  • Bagikan
Komentar
0/400
PretendingToReadDocsvip
· 07-23 12:26
Kontrak perwakilan lebih aman
Lihat AsliBalas0
ArbitrageBotvip
· 07-23 12:19
Upgrade takut dianggap bodoh
Lihat AsliBalas0
LiquidityNinjavip
· 07-23 12:10
Upgrade kontrak itu sulit ya
Lihat AsliBalas0
EthMaximalistvip
· 07-23 12:04
Upgrade juga mungkin memiliki celah
Lihat AsliBalas0
Perdagangkan Kripto Di Mana Saja Kapan Saja
qrCode
Pindai untuk mengunduh aplikasi Gate
Komunitas
Bahasa Indonesia
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)