Rust smart contract pengembangan jurnal (10-2): Analisis kode kontrak pabrik SputnikDAO
Artikel ini akan menjelaskan secara rinci implementasi desain dari model pabrik Sputnik-DAO (sputnikdao-factory).
1. Sputnik-DAO factory smart contract
Sputnik-DAO menggunakan pola desain pabrik penciptaan untuk mewujudkan penciptaan dan pengelolaan terpadu dari organisasi otonom terdesentralisasi (DAO) di platform ini.
2. Pengenalan Fungsi Modul DAPP
Halaman DAPP platform Sputnik DAO menunjukkan bahwa sudah ada banyak DAO yang telah membuat objek instan di platform ini. Hingga Maret 2022, DAO yang paling aktif adalah news.sputnik-dao.near, dengan 3051 proposal yang sedang dalam pemungutan suara publik atau telah selesai.
Semua kontrak contoh DAO yang dibuat berdasarkan platform Sputnik DAO dideploy di bawah subakun akun sputnik-dao.near, seperti:
pcp.sputnik-dao.near
test-dao-bro.sputnik-dao.near
blaqkstereo.sputnik-dao.near
octopode-dao.sputnik-dao.near
Organisasi dapat memanggil metode create() dari kontrak sputnikdao-factory di jaringan utama NEAR 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:
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],
) {
// 1. Memuat kode template kontrak
// 2. Membangun Promise
// 3. Buat akun penyebaran
// 4. Transfer NEAR
// 5. Deploy kontrak
// 6. Memanggil fungsi inisialisasi new()
// 7. Callback on_create()
}
Logika pemrosesan fungsi callback on_create:
Jika langkah 3-6 gagal dilaksanakan, kembalikan NEAR
Jika berhasil dijalankan, catat alamat akun instans DAO baru
3.2 memperbarui DAO
Kontrak pabrik menyediakan antarmuka update() untuk memperbarui DAO:
karat
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 kontrak yang dibuat oleh pabrik'
);
self.factory_manager
.update_contract(account_id, code_hash, 'update');
}
4. Analisis Keamanan Kontrak Sputnik-DAO Factory
Kontrol hak akses: metode jenis view tidak mengubah variabel status
Kontrol izin: Fungsi istimewa hanya dapat dijalankan oleh pemilik kontrak atau akun DAO.
Penanganan kesalahan: Menerapkan mekanisme penanganan kesalahan yang wajar untuk situasi yang tidak terduga.
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.
Analisis Kontrak Pabrik SputnikDAO: Pembuatan dan Manajemen DAO secara Massal di Near on-chain
Rust smart contract pengembangan jurnal (10-2): Analisis kode kontrak pabrik SputnikDAO
Artikel ini akan menjelaskan secara rinci implementasi desain dari model pabrik Sputnik-DAO (sputnikdao-factory).
1. Sputnik-DAO factory smart contract
Sputnik-DAO menggunakan pola desain pabrik penciptaan untuk mewujudkan penciptaan dan pengelolaan terpadu dari organisasi otonom terdesentralisasi (DAO) di platform ini.
2. Pengenalan Fungsi Modul DAPP
Halaman DAPP platform Sputnik DAO menunjukkan bahwa sudah ada banyak DAO yang telah membuat objek instan di platform ini. Hingga Maret 2022, DAO yang paling aktif adalah news.sputnik-dao.near, dengan 3051 proposal yang sedang dalam pemungutan suara publik atau telah selesai.
Semua kontrak contoh DAO yang dibuat berdasarkan platform Sputnik DAO dideploy di bawah subakun akun sputnik-dao.near, seperti:
Organisasi dapat memanggil metode create() dari kontrak sputnikdao-factory di jaringan utama NEAR 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, }
Definisi metode create() untuk membuat contoh DAO adalah 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('Gagal untuk 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], ) { // 1. Memuat kode template kontrak // 2. Membangun Promise // 3. Buat akun penyebaran // 4. Transfer NEAR // 5. Deploy kontrak // 6. Memanggil fungsi inisialisasi new() // 7. Callback on_create() }
Logika pemrosesan fungsi callback on_create:
3.2 memperbarui DAO
Kontrak pabrik menyediakan antarmuka update() untuk memperbarui DAO:
karat 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 kontrak yang dibuat oleh pabrik' ); self.factory_manager .update_contract(account_id, code_hash, 'update'); }
4. Analisis Keamanan Kontrak Sputnik-DAO Factory