Nhật ký phát triển hợp đồng thông minh Rust (10-2): Phân tích hợp đồng nhà máy Sputnik DAO
Bài viết này sẽ giải thích sâu về việc triển khai mã hợp đồng của nền tảng 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 ra và quản lý đồng nhất tổ chức tự trị phi tập trung (DAO) trên nền tảng này.
1. Hợp đồng thông minh nhà máy Sputnik-DAO
Trạng thái chính của hợp đồng thông minh Sputnik-DAO được chia thành hai phần:
factory_manager: cung cấp logic chức năng nội bộ để tạo/xóa/cập nhật các实例 DAO
daos: ghi lại địa chỉ tài khoản NEAR của tất cả các DAO đã được tạo trên nền tảng này
2. Tạo DAO
Hợp đồng nhà máy cung cấp phương thức create() để tạo ra các phiên bản DAO mới:
gỉ
#[payable]
pub fn create(&mut self, name: AccountId, args: Base64VecU8) {
// Xây dựng tài khoản triển khai hợp đồng DAO
let account_id: AccountId = format!("{}.{}", name, env::current_account_id())
.parse()
.unwrap();
// Xây dựng tham số callback
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");
// Gọi factory_manager để tạo hợp đồng
self.factory_manager.create_contract(
self.get_default_code_hash(),
account_id,
"new",
&args.0,
"on_create",
&callback_args,
);
}
các bước chính của phương pháp create_contract() bao gồm:
Tải mã mẫu hợp đồng DAO
Tạo tài khoản triển khai
Chuyển khoản vốn ban đầu
Triển khai mã hợp đồng
Gọi hàm khởi tạo hợp đồng
Gọi lại hàm on_create()
3. Cập nhật DAO
Hợp đồng nhà máy cung cấp phương pháp update() để nâng cấp hợp đồng 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 ninh
An toàn của hợp đồng trong nhà máy Sputnik-DAO chủ yếu được đảm bảo từ các khía cạnh sau:
Kiểm soát quyền: phương thức view không thay đổi trạng thái, hàm đặc quyền chỉ có thể được gọi bởi owner
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ệ
Kiểm tra xác nhận: Thêm kiểm tra xác nhận cần thiết cho các thao tác quan trọng
Hợp đồng nhà máy đã từng tồn tại một lỗ hổng bảo mật nghiêm trọng, có thể cho phép bất kỳ người dùng nào nâng cấp hợp đồng DAO. Lỗi này đã được khắc phục bằng cách thêm cơ chế kiểm tra whitelist hợp lý.
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.
15 thích
Phần thưởng
15
4
Chia sẻ
Bình luận
0/400
BearMarketMonk
· 5giờ trước
Có chút bò, vừa học rust vừa làm hợp đồng
Xem bản gốcTrả lời0
AirdropChaser
· 5giờ trước
Lại một bài phân tích mã nữa. Chóng mặt.
Xem bản gốcTrả lời0
ProbablyNothing
· 5giờ trước
Xem mã hợp đồng mà chóng cả mặt, cái này viết cái gì vậy?
Phân tích mã hợp đồng nhà máy Sputnik DAO: Logic cốt lõi để tạo và nâng cấp DAO
Nhật ký phát triển hợp đồng thông minh Rust (10-2): Phân tích hợp đồng nhà máy Sputnik DAO
Bài viết này sẽ giải thích sâu về việc triển khai mã hợp đồng của nền tảng 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 ra và quản lý đồng nhất tổ chức tự trị phi tập trung (DAO) trên nền tảng này.
1. Hợp đồng thông minh nhà máy Sputnik-DAO
Trạng thái chính của hợp đồng thông minh Sputnik-DAO được chia thành hai phần:
gỉ pub struct SputnikDAOFactory { factory_manager: FactoryManager, daos: UnorderedSet, }
2. Tạo DAO
Hợp đồng nhà máy cung cấp phương thức create() để tạo ra các phiên bản DAO mới:
gỉ #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { // Xây dựng tài khoản triển khai hợp đồng DAO let account_id: AccountId = format!("{}.{}", name, env::current_account_id()) .parse() .unwrap();
}
các bước chính của phương pháp create_contract() bao gồm:
3. Cập nhật DAO
Hợp đồng nhà máy cung cấp phương pháp update() để nâng cấp hợp đồng 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 ninh
An toàn của hợp đồng trong nhà máy Sputnik-DAO chủ yếu được đảm bảo từ các khía cạnh sau:
Hợp đồng nhà máy đã từng tồn tại một lỗ hổng bảo mật nghiêm trọng, có thể cho phép bất kỳ người dùng nào nâng cấp hợp đồng DAO. Lỗi này đã được khắc phục bằng cách thêm cơ chế kiểm tra whitelist hợp lý.