Smart contract sebagai salah satu jenis program, tidak dapat dihindari akan memiliki cacat dan celah. Meskipun telah melalui banyak pengujian dan audit, tetap saja mungkin ada masalah yang belum terdeteksi. Begitu celah kontrak dimanfaatkan oleh penyerang, dapat menyebabkan kerugian aset pengguna, yang berakibat serius. Oleh karena itu, kemampuan untuk meng-upgrade kontrak sangat penting, baik untuk memperbaiki celah maupun untuk menambahkan fitur baru. Artikel ini akan memperkenalkan metode upgrade kontrak Rust di platform NEAR.
Metode Pembaruan Kontrak NEAR
Sebagai contoh proyek StatusMessage, perkenalan metode upgrade umum untuk kontrak NEAR.
1. Struktur data kontrak tidak diubah
Jika hanya mengubah logika kontrak, tanpa melibatkan perubahan struktur data, Anda dapat langsung menggunakan perintah near deploy untuk mendepoloy kode baru. Misalnya, kita menambahkan sebuah fungsi baru pada kontrak asli:
Setelah dikompilasi, Anda dapat menggunakan near deploy untuk menyebarkan kembali. Data dalam kontrak asli masih dapat dibaca dengan normal.
( 2. Struktur data kontrak telah dimodifikasi
Jika struktur data kontrak diubah, redeploy langsung akan menyebabkan kegagalan deserialisasi status. Misalnya, kita mengubah struktur kontrak sebagai berikut:
Kontrol Akses: Fungsi upgrade harus diatur sebagai fungsi only owner, memastikan hanya dapat dipanggil oleh owner.
Disarankan untuk mengatur pemilik kontrak sebagai DAO, melalui proposal dan pemungutan suara untuk mengelola kontrak.
Tambahkan #[init)ignore_state)] sebelum fungsi migrasi, pastikan tidak memuat status sebelum eksekusi.
Setelah migrasi selesai, hapus fungsi migrasi, pastikan hanya dipanggil sekali.
Struktur data baru diinisialisasi saat migrasi.
Pembaruan kontrak adalah proses yang kompleks dan perlu ditangani dengan hati-hati. Melalui desain yang tepat dan pengujian yang ketat, pembaruan kontrak yang aman dan andal dapat dicapai.
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.
Panduan Upgrade Smart Contract Rust: Penjelasan Metode Pembaruan Keamanan Platform NEAR
Panduan Upgrade Kontrak Pintar Rust
Smart contract sebagai salah satu jenis program, tidak dapat dihindari akan memiliki cacat dan celah. Meskipun telah melalui banyak pengujian dan audit, tetap saja mungkin ada masalah yang belum terdeteksi. Begitu celah kontrak dimanfaatkan oleh penyerang, dapat menyebabkan kerugian aset pengguna, yang berakibat serius. Oleh karena itu, kemampuan untuk meng-upgrade kontrak sangat penting, baik untuk memperbaiki celah maupun untuk menambahkan fitur baru. Artikel ini akan memperkenalkan metode upgrade kontrak Rust di platform NEAR.
Metode Pembaruan Kontrak NEAR
Sebagai contoh proyek StatusMessage, perkenalan metode upgrade umum untuk kontrak NEAR.
1. Struktur data kontrak tidak diubah
Jika hanya mengubah logika kontrak, tanpa melibatkan perubahan struktur data, Anda dapat langsung menggunakan perintah near deploy untuk mendepoloy kode baru. Misalnya, kita menambahkan sebuah fungsi baru pada kontrak asli:
karat #[near_bindgen] impl StatusMessage { Option { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); return self.records.get(&account_id); } }
Setelah dikompilasi, Anda dapat menggunakan near deploy untuk menyebarkan kembali. Data dalam kontrak asli masih dapat dibaca dengan normal.
( 2. Struktur data kontrak telah dimodifikasi
Jika struktur data kontrak diubah, redeploy langsung akan menyebabkan kegagalan deserialisasi status. Misalnya, kita mengubah struktur kontrak sebagai berikut:
karat #[near_bindgen] #[derive)BorshDeserialize, BorshSerialize###] pub struct StatusMessage { taglines: LookupMap<string, string="">, bios: LookupMap<string, string="">, }
Dalam kasus ini, perlu menggunakan metode Migrate untuk melakukan upgrade. Tambahkan metode migrate di kontrak baru:
karat #( #[init)ignore_state[private]] Self { let old_state: OldStatusMessage = env::state_read().expect("failed"); Diri { taglines: old_state.records, bios: LookupMap::new(b"b".to_vec)(), } }
Kemudian panggil metode migrate saat penyebaran:
dekat menerapkan
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction "migrate"
--initArgs "{}"
--accountId statusmessage.blocksec_upgrade.testnet
Dengan cara ini, Anda dapat berhasil memperbarui kontrak dan memigrasi data lama.
ignore_state)] sebelum fungsi migrasi, pastikan tidak memuat status sebelum eksekusi.
Setelah migrasi selesai, hapus fungsi migrasi, pastikan hanya dipanggil sekali.
Struktur data baru diinisialisasi saat migrasi.
Pembaruan kontrak adalah proses yang kompleks dan perlu ditangani dengan hati-hati. Melalui desain yang tepat dan pengujian yang ketat, pembaruan kontrak yang aman dan andal dapat dicapai.