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 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 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
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ụ:
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, }
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:
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