Kontrol Akses untuk Smart Contract Rust: Praktik Visibilitas Fungsi dan Akses Istimewa

robot
Pembuatan abstrak sedang berlangsung

Kontrol Akses dalam Kontrak Pintar Rust

Artikel ini akan membahas masalah kontrol akses dalam smart contract Rust dari dua aspek: visibilitas metode kontrak dan kontrol akses fungsi istimewa.

1. Visibilitas Fungsi Kontrak

Dalam menulis smart contract, dengan menentukan visibilitas fungsi, kita dapat mengontrol siapa yang dapat memanggil fungsi tertentu, sehingga melindungi bagian-bagian penting dalam kontrak.

Sebagai contoh, pada peristiwa keamanan yang terjadi di suatu bursa pada 18 Juni 2020. Karena kesalahan pengaturan kontrol akses fungsi kunci pada kontrak, aset pengguna terancam risiko. Kasus ini menyoroti pentingnya pengaturan visibilitas fungsi kontrak yang benar.

Dalam smart contract Rust, visibilitas fungsi terutama terdiri dari beberapa jenis berikut:

  • pub fn: Menunjukkan bahwa metode ini bersifat publik, merupakan bagian dari antarmuka kontrak, dan siapa pun dapat memanggilnya dari luar.
  • fn: Jika tidak secara eksplisit dinyatakan pub, maka fungsi tersebut hanya dapat dipanggil di dalam kontrak oleh fungsi lain.
  • pub(crate) fn: Batasi metode untuk dipanggil dalam ruang lingkup crate.

Cara lain untuk mengatur metode sebagai internal adalah dengan mendefinisikannya di dalam blok kode impl Contract yang tidak diberi modifikasi #[near_bindgen].

Untuk fungsi callback, harus diatur sebagai atribut publik agar dapat dipanggil melalui fungsi call. Selain itu, perlu memastikan bahwa fungsi callback tidak dapat dipanggil sembarangan, dapat menggunakan makro #[private] untuk mewujudkan hal ini.

Perlu dicatat bahwa di Rust, secara default semua konten bersifat privat, kecuali subproyek di pub Trait dan variabel di pub Enum yang secara default bersifat publik.

2. Kontrol Akses Fungsi Privilege

Selain visibilitas fungsi, perlu juga membangun mekanisme daftar putih kontrol akses yang lengkap dari sisi semantik. Fungsi-fungsi tertentu yang memiliki hak istimewa (seperti inisialisasi kontrak, mengaktifkan/menghentikan, dll.) hanya dapat dipanggil oleh pemilik kontrak.

Dalam kontrak pintar Rust, Anda dapat mengimplementasikan fungsi yang mirip dengan modifier onlyOwner di Solidity:

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); }

Menggunakan metode ini dapat mencapai kontrol akses terhadap fungsi-fungsi istimewa, memastikan hanya pemilik kontrak yang dapat sepenuhnya menjalankan fungsi-fungsi tersebut. Berdasarkan prinsip ini, mekanisme daftar putih yang lebih kompleks dapat diatur untuk mencapai kontrol akses berbasis grup yang lebih rinci.

3. Metode kontrol akses lainnya

Selain metode yang disebutkan di atas, ada cara lain untuk mengontrol akses dalam smart contract Rust, seperti pengendalian waktu pemanggilan kontrak, mekanisme pemanggilan multi-tanda tangan, dan implementasi tata kelola (DAO) dan lain-lain. Konten ini akan dibahas secara rinci dalam artikel selanjutnya.

GET-5.42%
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
ProxyCollectorvip
· 5jam yang lalu
Ini adalah jebakan pengaturan izin, siapa yang terjebak siapa yang sial.
Lihat AsliBalas0
SelfRuggervip
· 18jam yang lalu
Ini adalah masalah izin lagi.
Lihat AsliBalas0
AllTalkLongTradervip
· 18jam yang lalu
Hehe, saya melihat lubang yang sama dari pertukaran tahun lalu.
Lihat AsliBalas0
PermabullPetevip
· 18jam yang lalu
Izin tidak terjaga hampir saja berhenti.
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)