Phân tích hợp đồng nhà máy Sputnik DAO: Cơ chế cốt lõi để tạo ra và cập nhật DAO

Giải thích hợp đồng nhà máy Sputnik DAO

1. Hợp đồng nhà máy Sputnik-DAO

Sputnik-DAO áp dụng mô hình thiết kế nhà máy sáng tạo để thực hiện việc tạo và quản lý thống nhất tổ chức tự trị phi tập trung (DAO) trên nền tảng này.

Bài viết này sẽ giới thiệu chi tiết về thiết kế và thực hiện mô hình nhà máy của nền tảng Sputnik-DAO (sputnikdao-factory).

Kho mã nguồn của hợp đồng tương ứng nằm ở:

2. Giới thiệu chức năng mô-đun DAPP

Trang DAPP của nền tảng Sputnik DAO đã có nhiều tổ chức tự trị phi tập trung tạo ra và tùy chỉnh các đối tượng DAO của riêng họ ( hợp đồng Sputnikdaov2 ).

Tính đến tháng 3 năm 2022, DAO hoạt động tích cực nhất trên nền tảng này là news.sputnik-dao.near, với 3051 đề xuất (proposals) đang trong quá trình bỏ phiếu công khai hoặc đã kết thúc.

Thông qua NEAR Explorer, có thể phát hiện rằng các hợp đồng DAO của nền tảng này được triển khai đồng nhất bởi tài khoản NEAR sputnik-dao.near( và hợp đồng sputnikdao-factory).

Tức là tất cả các hợp đồng mẫu DAO được tạo ra dựa trên nền tảng Sputnik DAO đều được triển khai dưới các tài khoản con của tài khoản NEAR đó, ví dụ:

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

Tổ chức phi tập trung có thể công khai khởi xướng giao dịch trên mạng chính NEAR, thông qua việc gọi phương thức create() được cung cấp bởi hợp đồng sputnikdao-factory, để tạo ra các实例 DAO mới.

3. Giải thích mã hợp đồng sputnikdao-factory

3.1 Tạo DAO

trạng thái hợp đồng sputnikdao-factory chủ yếu được cấu thành từ hai phần như sau:

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

  • factory_manager: Triển khai logic chức năng nội bộ chính của hợp đồng, cung cấp một loạt các phương pháp để tạo/xóa/cập nhật các实例DAO.

  • daos: Sử dụng cấu trúc dữ liệu tập hợp, ghi lại địa chỉ tài khoản NEAR của tất cả các DAO đã được tạo ra trong lịch sử của nền tảng này.

Phương thức create() của hợp đồng sputnikdao-factory được sử dụng để tạo một thể hiện DAO được định nghĩa như sau:

gỉ #[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('Không thể tuần tự hóa'); self.factory_manager.create_contract( self.get_default_code_hash(), account_id, 'new', &args.0, 'on_create', &callback_args, ); }

Cách triển khai cụ thể của factory_manager.create_contract:

gỉ 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(); không an toàn { // Kiểm tra rằng hợp đồng như vậy tồn tại. assert_eq!( sys::storage_has_key(code_hash.len() như _, code_hash.as_ptr() như _), 1, 'Hợp đồng không tồn tại' ); // Tải mã wasm đầu vào ( vào thanh ghi 0. sys::storage_read)code_hash.len(( as _, code_hash.as_ptr)( as _, 0); // lên lịch một giao dịch Promise cho account_id let promise_id = sys::promise_batch_create)account_id.len(( as _, account_id.as_ptr)( as _); // tạo tài khoản trước. sys::promise_batch_action_create_account)promise_id(; // chuyển tiền gửi đính kèm. sys::promise_batch_action_transfer)promise_id, &attached_deposit as *const u128 as _(; // triển khai hợp đồng ) mã được lấy từ đăng ký 0(. sys::promise_batch_action_deploy_contract)promise_id, u64::MAX as _, 0(; // gọi mới với các đối số đã cho. 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 as *const u128 as _, CREATE_CALL_GAS.0, ); // gán callback cho nhà máy. let _ = 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 as *const u128 as _, ON_CREATE_CALL_GAS.0, ); sys::promise_return)promise_id(; } }

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

Cài đặt mã nội bộ của hàm callback on_create:

gỉ #) pub fn on_create[private] &mut self, account_id: AccountId, attached_deposit: U128, predecessor_account_id: AccountId, bool { nếu near_sdk::is_promise_success() { self.daos.insert(\u0026account_id); đúng } else { Promise::new(predecessor_account_id).transfer(attached_deposit.0); sai } }

( Cập nhật 3.2 DAO

Giao diện hợp đồng do hợp đồng nhà máy cung cấp update)###:

gỉ /// Cố gắng cập nhật tài khoản đã được tạo bởi nhà máy này với mã được chỉ định. 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, 'Phải được cập nhật bởi chủ sở hữu nhà máy hoặc chính DAO' (; assert!) self.daos.contains)&account_id(, 'Phải là hợp đồng được tạo bởi nhà máy' (; self.factory_manager .cập_nhật_hợp_đồng)id_tài_khoản, mã_băm, 'cập_nhật'); }

factory_manager.update_contract() xử lý chi tiết:

gỉ /// Cập nhật lực lượng trên hợp đồng đã cho. /// Hợp đồng phải hỗ trợ cập nhật bởi nhà máy cho điều này thông qua kiểm tra quyền. pub fn update_contract( &self, 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(); không an toàn { // Kiểm tra rằng hợp đồng như vậy tồn tại. assert!(env::storage_has_key)&code_hash(, 'Hợp đồng không tồn tại'(; // Tải băm từ bộ nhớ. sys::storage_read)code_hash.len)( as _, code_hash.as_ptr() as _, 0(; // Tạo một lời hứa đối với tài khoản đã cho. let promise_id = sys::promise_batch_create)account_id.len)( as _, account_id.as_ptr() as _(; // Gọi phương thức cập nhật, mà cũng nên xử lý các di cư. sys::promise_batch_action_function_call) promise_id, method_name.len)( as _, method_name.as_ptr() as _, u64::MAX như _, 0, &NO_DEPOSIT as *const u128 as _, (env::prepaid_gas)( - env::used_gas() - GAS_UPDATE_LEFTOVER(.0,); sys::promise_return)promise_id); } }

4. Phân tích an toàn hợp đồng Sputnik-DAO Factory

Bảo mật của hợp đồng Sputnik-DAO Factory chủ yếu được đảm bảo từ một số khía cạnh sau:

  • Kiểm soát quyền: Các phương thức view mở của hợp đồng không nên sửa đổi biến trạng thái của hợp đồng, tức là tham số đầu tiên trong định nghĩa phương thức cần được đặt là &self, chứ không phải &mut self.

  • Kiểm soát quyền: Các hàm đặc quyền mở của hợp đồng, những hàm này chỉ có thể được thực hiện bởi chủ sở hữu hợp đồng ( hoặc tài khoản hợp đồng DAO ), và trong phương thức có các assertion tương ứng.

  • Xử lý lỗi: Hợp đồng Sputnik-DAO Factory đã triển khai các cơ chế xử lý lỗi hợp lý cho các tình huống bất thường có thể xảy ra. Ví dụ, khi người dùng sử dụng hợp đồng Factory để tạo ra hợp đồng thể thức DAO mới, cuối cùng sẽ kiểm tra xem tất cả các bước tạo đã được thực hiện đầy đủ và bình thường, nếu không thì không nên gây thiệt hại cho người dùng.

SYS-3.49%
Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
  • Phần thưởng
  • 7
  • Đăng lại
  • Chia sẻ
Bình luận
0/400
GamefiEscapeArtistvip
· 07-26 22:26
Mô hình nhà máy nhàm chán có gì hay ho để nói?
Xem bản gốcTrả lời0
AirdropHunter007vip
· 07-26 03:54
Nhà máy này còn có thể hoạt động một chút nữa không?
Xem bản gốcTrả lời0
DeFiVeteranvip
· 07-24 02:49
Gọi tôi là lão binh dao
Xem bản gốcTrả lời0
LonelyAnchormanvip
· 07-24 02:46
Lại xem nhưng không hiểu. Lãng phí tôi ba giây.
Xem bản gốcTrả lời0
MentalWealthHarvestervip
· 07-24 02:32
Chà, mô hình nhà máy phức tạp như vậy sao?
Xem bản gốcTrả lời0
BakedCatFanboyvip
· 07-24 02:22
Có ai đó dịch giúp tôi, tôi đang cảm thấy bối rối.
Xem bản gốcTrả lời0
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)