Rust smart contract pengembangan jurnal (7) Keamanan kontrak dan kontrol akses
Artikel ini akan memperkenalkan konten terkait pengendalian akses dalam smart contract Rust dari dua sudut pandang:
Visibilitas akses/panggilan metode (fungsi) kontrak
Kontrol akses fungsi privilese/pembagian tanggung jawab
1. Visibilitas Fungsi (Metode) Kontrak
Saat menulis smart contract, dengan menentukan visibilitas fungsi kontrak, Anda dapat mengontrol hak akses pemanggilan fungsi, melindungi bagian penting dari kontrak agar tidak diakses atau dikendalikan sembarangan.
Sebagai contoh, pada bursa Bancor Network, terjadi insiden keamanan aset pada 18 Juni 2020 akibat kesalahan pengaturan kontrol akses fungsi kunci kontrak. Kontrak tersebut ditulis dalam bahasa Solidity, dan visibilitas fungsi kontrak dibagi menjadi dua jenis: public/external dan private/internal. Yang pertama memungkinkan fungsi kontrak dipanggil oleh pemanggil eksternal.
Saat memperbaiki celah keamanan tertentu, karena kelalaian, beberapa fungsi transfer kunci dalam kontrak secara tidak sengaja diatur menjadi atribut public, yang memungkinkan siapa pun untuk memanggil fungsi-fungsi ini dari luar kontrak untuk melakukan operasi transfer, sehingga aset pengguna senilai 590.000 dolar menghadapi risiko serius.
Dalam smart contract Rust, kontrol visibilitas fungsi kontrak juga harus diperhatikan. Fungsi smart contract Rust yang dimodifikasi dengan makro #[near_bindgen] yang didefinisikan oleh NEAR SDK memiliki beberapa atribut visibilitas yang berbeda:
pub fn: Menunjukkan bahwa metode ini bersifat publik, merupakan bagian dari antarmuka kontrak, dan dapat dipanggil dari luar kontrak.
fn: Jika tidak secara eksplisit dinyatakan pub, itu berarti tidak dapat dipanggil secara langsung dari luar kontrak, hanya dapat dipanggil di dalam kontrak oleh fungsi lain.
pub(crate) fn: setara dengan pub(in crate), membatasi metode untuk dipanggil dalam cakupan internal crate.
Cara lain untuk mengatur metode kontrak menjadi internal adalah dengan mendefinisikan blok kode impl Contract yang terpisah dalam kontrak, di mana implementasi tersebut tidak dihiasi dengan #[near_bindgen].
Untuk fungsi callback (Callbacks), definisinya harus diatur sebagai atribut publik, tetapi perlu memastikan bahwa hanya kontrak itu sendiri yang dapat memanggilnya. NEAR SDK menyediakan makro #[private] untuk mencapai fungsi ini.
Perlu dicatat bahwa dalam bahasa Rust, secara default semua konten bersifat private, kecuali sub-proyek dalam pub Trait dan variabel Enum dalam pub Enum yang secara default bersifat public.
2. Kontrol Akses Fungsi Istimewa ( Mekanisme Daftar Putih )
Selain kontrol visibilitas fungsi, perlu juga untuk membangun mekanisme daftar putih kontrol akses yang lengkap dari sisi semantik kontrak. Beberapa fungsi istimewa ( seperti inisialisasi kontrak, membuka/menghentikan, dan transfer seragam ) hanya dapat dipanggil oleh pemilik kontrak ( owner ), fungsi-fungsi ini biasanya disebut sebagai fungsi "hanya pemilik".
Meskipun fungsi kunci ini harus disetel sebagai atribut publik, aturan kontrol akses dapat didefinisikan untuknya, hanya jika aturan yang sesuai dipenuhi, maka dapat dieksekusi sepenuhnya. Dalam kontrak pintar Rust, Trait kustom yang mirip dengan modifier onlyOwner di Solidity dapat diimplementasikan:
Dengan menggunakan trait ini, akses kontrol terhadap fungsi-fungsi istimewa dalam kontrak dapat diimplementasikan, di mana pemanggil harus merupakan pemilik kontrak. Berdasarkan prinsip ini, lebih banyak pengguna dapat ditetapkan dalam daftar putih melalui modifikasi atau trait yang lebih kompleks yang disesuaikan, atau beberapa daftar putih dapat ditetapkan untuk mencapai kontrol akses kelompok yang lebih rinci.
3. Metode kontrol akses lebih lanjut
Metode kontrol akses lainnya dalam kontrak pintar Rust termasuk:
Kontrol waktu pemanggilan kontrak
Mekanisme panggilan multisignature untuk fungsi kontrak
Pemerintahan(DAO) dalam pelaksanaannya
Konten ini akan diperkenalkan dalam artikel berikutnya dari seri buku harian pengembangan smart contract ini.
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.
12 Suka
Hadiah
12
6
Bagikan
Komentar
0/400
CompoundPersonality
· 08-01 17:53
Aku harus kembali berjuang cerdas dengan izin.
Lihat AsliBalas0
MEVSupportGroup
· 08-01 17:52
Kesalahan izin, merugi. Berkumpul untuk menghangatkan diri.
Lihat AsliBalas0
MetaMaximalist
· 08-01 17:51
ugh, kesalahan pemula tingkat bancor lagi... inilah mengapa kita perlu verifikasi formal untuk semua penerapan protokol jujur saja
Lihat AsliBalas0
TokenomicsTherapist
· 08-01 17:50
Jangan bilang tentang Bancor, saya masih ingat saat itu sangat kacau.
Lihat AsliBalas0
TokenEconomist
· 08-01 17:37
biarkan saya jelaskan - kontrol akses adalah benar-benar abc dari keamanan kontrak smh
Lihat AsliBalas0
Layer2Arbitrageur
· 08-01 17:33
lmao bayangkan menulis kontrak rust tanpa kontrol akses yang tepat... ngmi serius
Keamanan smart contract Rust: Panduan lengkap kontrol akses
Rust smart contract pengembangan jurnal (7) Keamanan kontrak dan kontrol akses
Artikel ini akan memperkenalkan konten terkait pengendalian akses dalam smart contract Rust dari dua sudut pandang:
1. Visibilitas Fungsi (Metode) Kontrak
Saat menulis smart contract, dengan menentukan visibilitas fungsi kontrak, Anda dapat mengontrol hak akses pemanggilan fungsi, melindungi bagian penting dari kontrak agar tidak diakses atau dikendalikan sembarangan.
Sebagai contoh, pada bursa Bancor Network, terjadi insiden keamanan aset pada 18 Juni 2020 akibat kesalahan pengaturan kontrol akses fungsi kunci kontrak. Kontrak tersebut ditulis dalam bahasa Solidity, dan visibilitas fungsi kontrak dibagi menjadi dua jenis: public/external dan private/internal. Yang pertama memungkinkan fungsi kontrak dipanggil oleh pemanggil eksternal.
Saat memperbaiki celah keamanan tertentu, karena kelalaian, beberapa fungsi transfer kunci dalam kontrak secara tidak sengaja diatur menjadi atribut public, yang memungkinkan siapa pun untuk memanggil fungsi-fungsi ini dari luar kontrak untuk melakukan operasi transfer, sehingga aset pengguna senilai 590.000 dolar menghadapi risiko serius.
Dalam smart contract Rust, kontrol visibilitas fungsi kontrak juga harus diperhatikan. Fungsi smart contract Rust yang dimodifikasi dengan makro #[near_bindgen] yang didefinisikan oleh NEAR SDK memiliki beberapa atribut visibilitas yang berbeda:
Cara lain untuk mengatur metode kontrak menjadi internal adalah dengan mendefinisikan blok kode impl Contract yang terpisah dalam kontrak, di mana implementasi tersebut tidak dihiasi dengan #[near_bindgen].
Untuk fungsi callback (Callbacks), definisinya harus diatur sebagai atribut publik, tetapi perlu memastikan bahwa hanya kontrak itu sendiri yang dapat memanggilnya. NEAR SDK menyediakan makro #[private] untuk mencapai fungsi ini.
Perlu dicatat bahwa dalam bahasa Rust, secara default semua konten bersifat private, kecuali sub-proyek dalam pub Trait dan variabel Enum dalam pub Enum yang secara default bersifat public.
2. Kontrol Akses Fungsi Istimewa ( Mekanisme Daftar Putih )
Selain kontrol visibilitas fungsi, perlu juga untuk membangun mekanisme daftar putih kontrol akses yang lengkap dari sisi semantik kontrak. Beberapa fungsi istimewa ( seperti inisialisasi kontrak, membuka/menghentikan, dan transfer seragam ) hanya dapat dipanggil oleh pemilik kontrak ( owner ), fungsi-fungsi ini biasanya disebut sebagai fungsi "hanya pemilik".
Meskipun fungsi kunci ini harus disetel sebagai atribut publik, aturan kontrol akses dapat didefinisikan untuknya, hanya jika aturan yang sesuai dipenuhi, maka dapat dieksekusi sepenuhnya. Dalam kontrak pintar Rust, Trait kustom yang mirip dengan modifier onlyOwner di Solidity dapat diimplementasikan:
karat pub trait Ownable { fn assert_owner(&self) { assert_eq!(env::predecessor_account_id(), self.get_owner()); } AccountId; fn set_owner(&mut self, owner: AccountId); }
Dengan menggunakan trait ini, akses kontrol terhadap fungsi-fungsi istimewa dalam kontrak dapat diimplementasikan, di mana pemanggil harus merupakan pemilik kontrak. Berdasarkan prinsip ini, lebih banyak pengguna dapat ditetapkan dalam daftar putih melalui modifikasi atau trait yang lebih kompleks yang disesuaikan, atau beberapa daftar putih dapat ditetapkan untuk mencapai kontrol akses kelompok yang lebih rinci.
3. Metode kontrol akses lebih lanjut
Metode kontrol akses lainnya dalam kontrak pintar Rust termasuk:
Konten ini akan diperkenalkan dalam artikel berikutnya dari seri buku harian pengembangan smart contract ini.