Rust smart contract pengembangan jurnal (9) Upgrade kontrak
Smart contract pada dasarnya adalah program, cacat sulit dihindari. Meskipun telah melalui banyak pengujian dan audit, smart contract masih mungkin memiliki celah. Jika celah kontrak dimanfaatkan oleh penyerang, hal ini bisa mengakibatkan kehilangan aset pengguna, dengan konsekuensi yang serius. Perbaikan celah biasanya perlu dilakukan melalui pembaruan kontrak. Selain memperbaiki celah, penambahan fungsi baru juga memerlukan pembaruan kontrak. Oleh karena itu, kemampuan kontrak untuk diperbarui sangat penting. Artikel ini akan memperkenalkan cara pembaruan kontrak Rust.
1. Cara Umum untuk Memperbarui Kontrak Solidity
Kontrak pintar Ethereum memiliki ketidakberdayaan, setelah dikerahkan tidak dapat diubah. Jika kontrak memiliki kerentanan atau memerlukan fitur baru, satu-satunya cara adalah dengan mengerahkan kontrak baru ke blockchain.
Tantangan yang dihadapi metode ini adalah bahwa setiap kali kontrak dideploy, alamat baru akan dialokasikan. Semua DApp yang menggunakan kontrak tersebut perlu memodifikasi alamat kontrak untuk menyesuaikan dengan kontrak baru. Selain itu, status dalam kontrak versi lama perlu dipindahkan ke versi baru, dan pekerjaan migrasi status untuk kontrak yang kompleks memiliki beban kerja yang besar dan mudah untuk melakukan kesalahan.
Oleh karena itu, biasanya digunakan arsitektur pemisahan data dan logika, dengan menyimpan data dalam kontrak status yang tidak memproses logika, dan semua logika diimplementasikan dalam kontrak logika yang lain. Dengan cara ini, saat melakukan pembaruan, hanya perlu memperbarui kontrak logika tanpa perlu mempertimbangkan migrasi status.
Untuk menyelesaikan masalah ini, Anda dapat menggunakan kontrak proxy (Proxy Contract). Kontrak proxy digunakan untuk menyimpan data dan menggunakan deleGatecall untuk memanggil kontrak logika A, sehingga data yang dibaca dan ditulis oleh kontrak A disimpan di dalam kontrak proxy. Saat melakukan upgrade, deploy kontrak baru B, kemudian kirim transaksi agar kontrak proxy mengarah ke kontrak logika baru B.
2. Metode Umum untuk Memperbarui Kontrak NEAR
Sebagai contoh proyek StatusMessage, perkenalan metode peningkatan umum untuk kontrak NEAR.
2.1 Struktur data kontrak tidak diubah
Jika hanya mengubah logika kontrak tanpa melibatkan perubahan struktur data, Anda dapat langsung menggunakan near deploy untuk menerapkan kode baru. Data dalam kontrak lama dapat dibaca dengan sukses.
2.2 Struktur data kontrak telah dimodifikasi
Jika struktur data kontrak diubah, penyebaran ulang langsung akan menyebabkan ketidakmampuan untuk deserialisasi status kontrak. Ini karena status kontrak disimpan secara permanen dalam bentuk data terserial, setelah penyebaran ulang struktur data dalam kode telah berubah, tetapi status tetap sama, sehingga struktur data baru tidak dapat mencocokkan status lama.
2.3 Migrate upgrade smart contract
NEAR menyediakan metode Migrate untuk membantu memperbarui kontrak. Tambahkan metode migrate ke dalam kontrak baru:
karat
#[private]
#[init(ignore_state)]
Self {
let old_state: OldStatusMessage = env::state_read().expect('failed');
Diri {
taglines: old_state.records,
bios: LookupMap::new(b'b'.to_vec)((,
}
}
Panggil metode migrate saat mendepoy ulang kontrak:
Peningkatan keamanan kontrak harus terlebih dahulu mempertimbangkan kontrol akses, umumnya kontrak hanya dapat ditingkatkan oleh pengembang atau DAO. Fungsi peningkatan harus berupa fungsi only owner, memastikan hanya pemilik yang dapat memanggilnya.
Disarankan untuk mengatur owner kontrak sebagai DAO, untuk bersama-sama mengelola kontrak melalui proposal dan pemungutan suara. Akun pribadi sebagai owner akan menyebabkan kontrak sangat terpusat, owner dapat sembarangan mengubah data kontrak, dan ada risiko kehilangan kunci pribadi.
Selain itu, pengembang saat melakukan migrasi kontrak dapat mempertimbangkan saran berikut:
Tambahkan #[init(ignore_state)] sebelum fungsi migrasi, untuk memastikan tidak memuat status sebelum menjalankan fungsi migrasi.
Hapus fungsi migrasi setelah migrasi selesai, pastikan fungsi migrasi hanya dipanggil sekali.
Struktur data yang baru ditambahkan diinisialisasi saat migrasi.
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.
18 Suka
Hadiah
18
6
Bagikan
Komentar
0/400
TrustlessMaximalist
· 07-19 20:31
Kontrak tradisional lama terlalu banyak celah.
Lihat AsliBalas0
MetaDreamer
· 07-19 20:29
Kepemilikan yang tidak terdistribusi sama sekali tidak aman, saya mengerti hal ini.
Lihat AsliBalas0
YieldChaser
· 07-19 20:21
Pemberitahuan penting disarankan untuk dikerjakan secara bertahap!
Lihat AsliBalas0
MevTears
· 07-19 20:17
Rug Pull, hapus kode, mudah!
Lihat AsliBalas0
PseudoIntellectual
· 07-19 20:12
Tidak terlalu buruk, saya hanya menguasai trik ini.
Panduan Upgrade Kontrak Pintar Rust: Dari Migrasi Data ke Pertimbangan Keamanan
Rust smart contract pengembangan jurnal (9) Upgrade kontrak
Smart contract pada dasarnya adalah program, cacat sulit dihindari. Meskipun telah melalui banyak pengujian dan audit, smart contract masih mungkin memiliki celah. Jika celah kontrak dimanfaatkan oleh penyerang, hal ini bisa mengakibatkan kehilangan aset pengguna, dengan konsekuensi yang serius. Perbaikan celah biasanya perlu dilakukan melalui pembaruan kontrak. Selain memperbaiki celah, penambahan fungsi baru juga memerlukan pembaruan kontrak. Oleh karena itu, kemampuan kontrak untuk diperbarui sangat penting. Artikel ini akan memperkenalkan cara pembaruan kontrak Rust.
1. Cara Umum untuk Memperbarui Kontrak Solidity
Kontrak pintar Ethereum memiliki ketidakberdayaan, setelah dikerahkan tidak dapat diubah. Jika kontrak memiliki kerentanan atau memerlukan fitur baru, satu-satunya cara adalah dengan mengerahkan kontrak baru ke blockchain.
Tantangan yang dihadapi metode ini adalah bahwa setiap kali kontrak dideploy, alamat baru akan dialokasikan. Semua DApp yang menggunakan kontrak tersebut perlu memodifikasi alamat kontrak untuk menyesuaikan dengan kontrak baru. Selain itu, status dalam kontrak versi lama perlu dipindahkan ke versi baru, dan pekerjaan migrasi status untuk kontrak yang kompleks memiliki beban kerja yang besar dan mudah untuk melakukan kesalahan.
Oleh karena itu, biasanya digunakan arsitektur pemisahan data dan logika, dengan menyimpan data dalam kontrak status yang tidak memproses logika, dan semua logika diimplementasikan dalam kontrak logika yang lain. Dengan cara ini, saat melakukan pembaruan, hanya perlu memperbarui kontrak logika tanpa perlu mempertimbangkan migrasi status.
Untuk menyelesaikan masalah ini, Anda dapat menggunakan kontrak proxy (Proxy Contract). Kontrak proxy digunakan untuk menyimpan data dan menggunakan deleGatecall untuk memanggil kontrak logika A, sehingga data yang dibaca dan ditulis oleh kontrak A disimpan di dalam kontrak proxy. Saat melakukan upgrade, deploy kontrak baru B, kemudian kirim transaksi agar kontrak proxy mengarah ke kontrak logika baru B.
2. Metode Umum untuk Memperbarui Kontrak NEAR
Sebagai contoh proyek StatusMessage, perkenalan metode peningkatan umum untuk kontrak NEAR.
2.1 Struktur data kontrak tidak diubah
Jika hanya mengubah logika kontrak tanpa melibatkan perubahan struktur data, Anda dapat langsung menggunakan near deploy untuk menerapkan kode baru. Data dalam kontrak lama dapat dibaca dengan sukses.
2.2 Struktur data kontrak telah dimodifikasi
Jika struktur data kontrak diubah, penyebaran ulang langsung akan menyebabkan ketidakmampuan untuk deserialisasi status kontrak. Ini karena status kontrak disimpan secara permanen dalam bentuk data terserial, setelah penyebaran ulang struktur data dalam kode telah berubah, tetapi status tetap sama, sehingga struktur data baru tidak dapat mencocokkan status lama.
2.3 Migrate upgrade smart contract
NEAR menyediakan metode Migrate untuk membantu memperbarui kontrak. Tambahkan metode migrate ke dalam kontrak baru:
karat #[private] #[init(ignore_state)] Self { let old_state: OldStatusMessage = env::state_read().expect('failed'); Diri { taglines: old_state.records, bios: LookupMap::new(b'b'.to_vec)((, } }
Panggil metode migrate saat mendepoy ulang kontrak:
dekat menerapkan
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate' \ --initArgs '{}' \ --accountId statusmessage.blocksec_upgrade.testnet
Dengan cara ini, kontrak baru dapat berhasil dikerahkan dan data lama dapat dipindahkan.
![])https://img-cdn.gateio.im/webp-social/moments-73f5e5195fa71f1f25f5d35ba1e8b8ec.webp)
3. Pertimbangan Keamanan dalam Pembaruan Kontrak
Peningkatan keamanan kontrak harus terlebih dahulu mempertimbangkan kontrol akses, umumnya kontrak hanya dapat ditingkatkan oleh pengembang atau DAO. Fungsi peningkatan harus berupa fungsi only owner, memastikan hanya pemilik yang dapat memanggilnya.
Disarankan untuk mengatur owner kontrak sebagai DAO, untuk bersama-sama mengelola kontrak melalui proposal dan pemungutan suara. Akun pribadi sebagai owner akan menyebabkan kontrak sangat terpusat, owner dapat sembarangan mengubah data kontrak, dan ada risiko kehilangan kunci pribadi.
Selain itu, pengembang saat melakukan migrasi kontrak dapat mempertimbangkan saran berikut: