Phân tích hợp đồng nhà máy SputnikDAO: Tạo và quản lý hàng loạt DAO trên chuỗi Near

robot
Đang tạo bản tóm tắt

Nhật ký phát triển hợp đồng thông minh Rust (10-2): Phân tích mã hợp đồng nhà máy SputnikDAO

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 Sputnik-DAO (sputnikdao-factory).

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

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

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

Trang DAPP của nền tảng Sputnik DAO có thể thấy đã có nhiều DAO tạo ra các đối tượng mẫu trên nền tảng này. Tính đến tháng 3 năm 2022, DAO hoạt động tích cực nhất là news.sputnik-dao.near, với 3051 đề xuất đang được bỏ phiếu công khai hoặc đã kết thúc.

Tất cả các hợp đồng mẫu DAO được tạo ra trên nền tảng Sputnik DAO đều được triển khai dưới tài khoản con của tài khoản sputnik-dao.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 có thể gọi phương thức create() của hợp đồng sputnikdao-factory trong mạng chính NEAR để 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 sau:

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

  • factory_manager: Cung cấp các phương thức để tạo/ xóa/ cập nhật các instance DAO.
  • daos: ghi lại địa chỉ tài khoản NEAR của tất cả các实例 DAO đã được tạo.

Phương thức create() để tạo ra 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(\u0026json!({ '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ụ 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], ) { // 1. Tải mã mẫu hợp đồng // 2. Xây dựng Promise // 3. Tạo tài khoản triển khai // 4. Chuyển khoản NEAR // 5. Triển khai hợp đồng thông minh // 6. Gọi hàm khởi tạo new() // 7. Callback on_create() }

Xử lý logic của hàm callback on_create:

  • Nếu bước 3-6 thực hiện không thành công, hoàn trả NEAR
  • Nếu thực hiện thành công, ghi lại địa chỉ tài khoản của phiên bản DAO mới

3.2 cập nhật DAO

Hợp đồng nhà máy cung cấp giao diện update() để nâng cấp DAO:

gỉ 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_dồng(id_tài_khoản, mã_băm, 'cập_nhật'); }

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

  • Kiểm soát quyền: phương thức loại view không thay đổi biến trạng thái
  • Kiểm soát quyền: Chức năng đặc quyền chỉ có thể được thực hiện bởi chủ sở hữu hợp đồng hoặc tài khoản DAO
  • Xử lý lỗi: Thực hiện cơ chế xử lý lỗi hợp lý cho các tình huống ngoại lệ

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
  • 5
  • Chia sẻ
Bình luận
0/400
ChainSpyvip
· 6giờ trước
Mô hình nhà máy đáng được nghiên cứu
Xem bản gốcTrả lời0
AirdropSweaterFanvip
· 6giờ trước
Người mới người mới必看教程
Xem bản gốcTrả lời0
SandwichVictimvip
· 6giờ trước
Mô hình nhà máy thật tuyệt
Xem bản gốcTrả lời0
RuntimeErrorvip
· 6giờ trước
Mô hình nhà máy rất cổ điển.
Xem bản gốcTrả lời0
Web3ExplorerLinvip
· 6giờ trước
Thiết kế DAOfactory thú vị
Xem bản gốcTrả lời0
  • Ghim
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)