Analisis kontrak pabrik Sputnik DAO: Mekanisme inti untuk membuat dan memperbarui DAO

Penjelasan Kontrak Pabrik Sputnik DAO

1. Kontrak Pabrik Sputnik-DAO

Sputnik-DAO menerapkan pola desain pabrik penciptaan untuk mewujudkan penciptaan dan pengelolaan yang terintegrasi dari organisasi otonom terdesentralisasi (DAO) di bawah platform tersebut.

Artikel ini akan menjelaskan secara rinci tentang implementasi desain model pabrik Sputnik-DAO ( sputnikdao-factory ).

Repositori kode sumber untuk kontrak yang bersangkutan terletak di:

2. Pengenalan Fitur Modul DAPP

Halaman DAPP di platform Sputnik DAO telah banyak organisasi otonom terdesentralisasi yang dibuat dan disesuaikan dengan objek contoh DAO mereka sendiri ( kontrak Sputnikdaov2 ).

Hingga Maret 2022, DAO paling aktif yang dibuat di platform ini adalah news.sputnik-dao.near, yang memiliki 3051 proposal (proposals) yang sedang dalam voting publik atau statusnya telah selesai.

Melalui NEAR Explorer, dapat ditemukan bahwa kontrak instance DAO di platform ini dideploy secara seragam oleh akun NEAR sputnik-dao.near( kontrak sputnikdao-factory ).

yaitu semua kontrak instance DAO yang dibuat berdasarkan platform Sputnik DAO masing-masing dikerahkan di bawah sub-akun akun NEAR tersebut, misalnya:

  • pcp.sputnik-dao.near
  • test-dao-bro.sputnik-dao.near
  • blaqkstereo.sputnik-dao.near
  • octopode-dao.sputnik-dao.near

Organisasi terdesentralisasi dapat secara publik memulai transaksi di jaringan utama NEAR, dengan memanggil metode create() yang disediakan oleh kontrak sputnikdao-factory untuk membuat instansi DAO baru.

3. Penjelasan Kode Kontrak sputnikdao-factory

3.1 Membuat DAO

Status kontrak sputnikdao-factory terutama terdiri dari dua bagian berikut:

karat pub struct SputnikDAOFactory { factory_manager: FactoryManager, daos: UnorderedSet\u003caccountid\u003e, }

  • factory_manager: Implementasi logika fungsi internal utama kontrak, menyediakan serangkaian metode untuk membuat/menghapus/memperbarui instance DAO.

  • daos: Menggunakan struktur data koleksi, mencatat alamat akun NEAR dari semua instance DAO yang telah dibuat di platform ini.

Metode kontrak sputnikdao-factory yang digunakan untuk membuat instansi DAO create() didefinisikan sebagai berikut:

karat #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { let account_id: AccountId = format!('{}.{}', name, env::current_account_id()) .parse() .unwrap(); let callback_args = serde_json::to_vec(&json!({ 'account_id': account_id, 'attached_deposit': U128(env::attached_deposit()), 'predecessor_account_id': env::predecessor_account_id() })) .expect('Tidak dapat diserialisasi'); self.factory_manager.create_contract( self.get_default_code_hash(), account_id, 'baru', &args.0, 'on_create', &callback_args, ); }

Implementasi spesifik dari factory_manager.create_contract:

karat pub fn create_contract( &self, code_hash: Base58CryptoHash, account_id: AccountId, new_method: &str, args: [u8], callback_method: &str, callback_args: &[u8], ) { let code_hash: CryptoHash = code_hash.into(); let attached_deposit = env::attached_deposit(); let factory_account_id = env::current_account_id().as_bytes().to_vec(); let account_id = account_id.as_bytes().to_vec(); tidak aman { // Periksa bahwa kontrak seperti itu ada. assert_eq!( sys::storage_has_key(code_hash.len() sebagai _, code_hash.as_ptr() sebagai _), 1, 'Kontrak tidak ada' ); // Muat kode wasm input ( ke dalam register 0. sys::storage_read)code_hash.len(( as _, code_hash.as_ptr)( as _, 0); // jadwalkan tx Promise ke account_id let promise_id = sys::promise_batch_create)account_id.len(( as _, account_id.as_ptr)( as _); // buat akun terlebih dahulu. sys::janji_batch_tindakan_buat_akun)id_janji(; // transfer deposit yang dilampirkan. sys::promise_batch_action_transfer)promise_id, &attached_deposit as *const u128 as _(; // deploy kontrak )kode diambil dari pendaftaran 0(. sys::promise_batch_action_deploy_contract)promise_id, u64::MAX as _, 0(; // panggil baru dengan argumen yang diberikan. sys::promise_batch_action_function_call) promise_id, new_method.len(( as _, new_method.as_ptr)( as _, args.len)( as _, args.as_ptr)( as _, &NO_DEPOSIT sebagai *const u128 sebagai _, CREATE_CALL_GAS.0, ); // lampirkan callback ke pabrik. biarkan _ = sys::promise_then) promise_id, factory_account_id.len(( as _, factory_account_id.as_ptr)( as _, callback_method.len)( as _, callback_method.as_ptr)( as _, callback_args.len)( as _, callback_args.as_ptr)( as _, &NO_DEPOSIT sebagai *const u128 sebagai _, ON_CREATE_CALL_GAS.0, ); sys::promise_return)promise_id(; } }

![])https://img-cdn.gateio.im/webp-social/moments-373080ddb66a4cb83e0722b387056be0.webp(

Implementasi kode internal dari fungsi callback on_create:

karat #) pub fn on_create[private] &mut self, account_id: AccountId, attached_deposit: U128, predecessor_account_id: AccountId, bool { jika near_sdk::is_promise_success() { self.daos.insert(&account_id); benar } else { Promise::new(predecessor_account_id).transfer(attached_deposit.0); salah } }

( 3.2 memperbarui DAO

Antarmuka kontrak yang disediakan oleh kontrak pabrik update)###:

karat /// Mencoba untuk memperbarui akun yang diberikan yang dibuat oleh pabrik ini ke kode yang ditentukan. pub fn update(&self, account_id: AccountId, code_hash: Base58CryptoHash) { let caller_id = env::predecessor_account_id(); assert!( caller_id == self.get_owner)( || caller_id == account_id, 'Harus diperbarui oleh pemilik pabrik atau DAO itu sendiri' (; assert!) self.daos.contains)&account_id(, 'Harus merupakan kontrak yang dibuat oleh pabrik' (; self.factory_manager .update_contract)account_id, code_hash, 'update'); }

factory_manager.update_contract() detail penanganan:

karat /// Memaksa pembaruan pada kontrak yang diberikan. /// Kontrak harus mendukung pembaruan oleh pabrik untuk ini melalui pemeriksaan izin. pub fn update_contract( &diri, account_id: AccountId, code_hash: Base58CryptoHash, method_name: &str, ) { let code_hash: CryptoHash = code_hash.into(); let account_id = account_id.as_bytes().to_vec(); tidak aman { // Periksa bahwa kontrak seperti itu ada. assert!(env::storage_has_key)&code_hash(, 'Kontrak tidak ada'(; // Muat hash dari penyimpanan. sys::storage_read)code_hash.len)( as _, code_hash.as_ptr() as _, 0(; // Buat janji untuk akun yang diberikan. let promise_id = sys::promise_batch_create)account_id.len)( as _, account_id.as_ptr() as _(; // Panggil metode pembaruan, yang juga harus menangani migrasi. sys::promise_batch_action_function_call) promise_id, method_name.len)( as _, method_name.as_ptr() as _, u64::MAX sebagai _, 0, &NO_DEPOSIT sebagai *const u128 sebagai _, (env::prepaid_gas)( - env::used_gas() - GAS_UPDATE_LEFTOVER(.0,); sys::promise_return)promise_id); } }

4. Analisis Keamanan Kontrak Sputnik-DAO Factory

Keamanan kontrak Sputnik-DAO Factory terutama dijamin dari beberapa aspek berikut:

  • Kontrol akses: Metode view yang terbuka dari kontrak tidak boleh mengubah variabel status kontrak, yaitu parameter pertama dalam definisi metode harus diatur sebagai &self, bukan &mut self.

  • Kontrol Akses: Fungsi privilese yang terbuka dalam kontrak, fungsi ini hanya dapat dieksekusi oleh pemilik kontrak ( atau akun kontrak DAO ), dan terdapat assertion yang sesuai dalam metode.

  • Penanganan Kesalahan: Kontrak Factory Sputnik-DAO telah menerapkan mekanisme penanganan kesalahan yang sesuai dan wajar untuk kemungkinan situasi yang tidak diinginkan. Misalnya, saat pengguna menggunakan kontrak Factory untuk membuat kontrak instance DAO baru, kontrak tersebut akan memeriksa apakah semua langkah pembuatan telah dilaksanakan dengan benar dan lengkap, jika tidak, pengguna tidak seharusnya mengalami kerugian.

SYS-7.96%
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
  • 7
  • Posting ulang
  • Bagikan
Komentar
0/400
GamefiEscapeArtistvip
· 07-26 22:26
Apa yang bisa dibicarakan tentang mode pabrik yang membosankan?
Lihat AsliBalas0
AirdropHunter007vip
· 07-26 03:54
Apakah pabrik ini masih bisa berproduksi sedikit?
Lihat AsliBalas0
DeFiVeteranvip
· 07-24 02:49
Panggil saya dao veteran
Lihat AsliBalas0
LonelyAnchormanvip
· 07-24 02:46
Saya sudah melihatnya tetapi tidak mengerti, sia-sia tiga detik saya.
Lihat AsliBalas0
MentalWealthHarvestervip
· 07-24 02:32
Wah, apakah pola pabrik sekompleks ini?
Lihat AsliBalas0
BakedCatFanboyvip
· 07-24 02:22
Tolong seseorang terjemahkan ini, saya bingung.
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)