Nhật ký phát triển hợp đồng thông minh Rust (7) An toàn hợp đồng và độ chính xác của phép toán
Bài viết này sẽ giới thiệu về kiểm soát quyền trong hợp đồng thông minh Rust từ hai góc độ:
Tính khả dụng của các phương thức hợp đồng được truy cập/gọi
Kiểm soát truy cập của các chức năng đặc quyền/phân chia quyền và trách nhiệm
1. Khả năng nhìn thấy hàm hợp đồng
Việc thiết lập độ khả kiến của hàm hợp đồng một cách hợp lý là rất quan trọng để bảo vệ các phần quan trọng không bị truy cập hoặc thao tác một cách ngẫu nhiên. Lấy ví dụ từ sự kiện bảo mật của sàn giao dịch Bancor Network vào tháng 6 năm 2020, do vô tình đặt hàm chuyển tiền quan trọng thành public, đã dẫn đến rủi ro cho tài sản của người dùng.
Trong hợp đồng thông minh Rust, tính khả thi của hàm chủ yếu có các loại sau:
pub fn: public hàm, có thể gọi từ bên ngoài hợp đồng
fn: Không thể gọi trực tiếp từ bên ngoài, chỉ có thể gọi trong hợp đồng.
pub(crate) fn: Giới hạn gọi trong phạm vi crate
Một cách khác để thiết lập phương thức internal là định nghĩa một khối mã impl Contract độc lập, và không sử dụng dấu hiệu #[near_bindgen].
Hàm callback cần được đặt là public, nhưng phải đảm bảo chỉ có thể được gọi bởi hợp đồng. Có thể sử dụng macro #[private] để thực hiện chức năng này.
Cần lưu ý rằng Rust mặc định tất cả nội dung là private, nhưng các mục trong trait và enum thì ngoại lệ.
2. Kiểm soát truy cập của chức năng đặc quyền
Ngoài khả năng hiển thị của hàm, cần thiết lập một cơ chế danh sách trắng kiểm soát truy cập hoàn chỉnh từ cấp độ ngữ nghĩa. Tương tự như onlyOwner trong Solidity, một số hàm đặc quyền chỉ có thể được gọi bởi chủ sở hữu hợp đồng.
Trong hợp đồng thông minh Rust, có thể triển khai Trait tùy chỉnh để kiểm soát quyền truy cập vào các hàm đặc quyền:
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.
Rust hợp đồng thông minh an toàn thực hành: Tính khả thi của hàm và kiểm soát truy cập đặc quyền
Nhật ký phát triển hợp đồng thông minh Rust (7) An toàn hợp đồng và độ chính xác của phép toán
Bài viết này sẽ giới thiệu về kiểm soát quyền trong hợp đồng thông minh Rust từ hai góc độ:
1. Khả năng nhìn thấy hàm hợp đồng
Việc thiết lập độ khả kiến của hàm hợp đồng một cách hợp lý là rất quan trọng để bảo vệ các phần quan trọng không bị truy cập hoặc thao tác một cách ngẫu nhiên. Lấy ví dụ từ sự kiện bảo mật của sàn giao dịch Bancor Network vào tháng 6 năm 2020, do vô tình đặt hàm chuyển tiền quan trọng thành public, đã dẫn đến rủi ro cho tài sản của người dùng.
Trong hợp đồng thông minh Rust, tính khả thi của hàm chủ yếu có các loại sau:
Một cách khác để thiết lập phương thức internal là định nghĩa một khối mã impl Contract độc lập, và không sử dụng dấu hiệu #[near_bindgen].
Hàm callback cần được đặt là public, nhưng phải đảm bảo chỉ có thể được gọi bởi hợp đồng. Có thể sử dụng macro #[private] để thực hiện chức năng này.
Cần lưu ý rằng Rust mặc định tất cả nội dung là private, nhưng các mục trong trait và enum thì ngoại lệ.
2. Kiểm soát truy cập của chức năng đặc quyền
Ngoài khả năng hiển thị của hàm, cần thiết lập một cơ chế danh sách trắng kiểm soát truy cập hoàn chỉnh từ cấp độ ngữ nghĩa. Tương tự như onlyOwner trong Solidity, một số hàm đặc quyền chỉ có thể được gọi bởi chủ sở hữu hợp đồng.
Trong hợp đồng thông minh Rust, có thể triển khai Trait tùy chỉnh để kiểm soát quyền truy cập vào các hàm đặc quyền:
gỉ pub trait Ownable { fn assert_owner(&self) { assert_eq!(env::predecessor_account_id(), self.get_owner()); } AccountId; fn set_owner(&mut self, owner: AccountId); }
Dựa trên điều này, có thể thực hiện cơ chế danh sách trắng phức tạp hơn, đạt được kiểm soát truy cập nhóm tinh vi.
3. Các phương pháp kiểm soát truy cập khác
Còn một số phương pháp kiểm soát truy cập khác, chẳng hạn như:
Những nội dung này sẽ được trình bày chi tiết trong các bài viết sau.