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 tính
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 khía cạnh:
Độ khả dụng/khả năng gọi các phương thức hợp đồng
Kiểm soát truy cập của chức năng đặc quyền/phân chia quyền và nghĩa vụ
1. Độ hiển thị của hàm hợp đồng
Việc thiết lập tính khả thi của các hàm hợp đồng một cách hợp lý là rất quan trọng để bảo vệ an toàn cho hợp đồng. Lấy ví dụ từ sự cố an ninh xảy ra tại sàn giao dịch Bancor Network vào ngày 18 tháng 6 năm 2020, do vô tình thiết lập hàm chuyển tiền quan trọng thành public, dẫn đến việc tài sản của người dùng đối mặt với rủi ro nghiêm trọ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: hàm công khai, bất kỳ ai cũng có thể gọi từ bên ngoài hợp đồng
fn: mặc định là private, chỉ có thể được gọi từ bên trong hợp đồng
pub(crate) fn: giới hạn gọi bên trong crate
Ngoài ra, có thể thực hiện các phương thức internal bằng cách định nghĩa một khối impl không có #[near_bindgen].
Đối với hàm callback, phải được đặt là public nhưng cần kiểm soát truy cập bổ sung:
gỉ
#[private]
pub fn resolve_transfer(&mut self) {
env::log_str("Đây là một callback");
}
2. Kiểm soát truy cập chức năng đặc quyền
Ngoài khả năng hiển thị của các 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. Có thể tùy chỉnh Trait để đạt được hiệu ứng tương tự như modifier onlyOwner trong Solidity:
Điều này có thể giới hạn chỉ có owner mới có thể gọi một số hàm đặc quyền. Dựa trên điều này, có thể thiết lập danh sách trắng đa người dùng phức tạp hơn hoặc nhiều danh sách trắng, để thực hiện kiểm soát truy cập phân nhóm tinh vi.
Trong hợp đồng thông minh Rust còn có các phương pháp kiểm soát truy cập khác, như kiểm soát thời điểm gọi, cơ chế đa chữ ký, v.v., sẽ được giới thiệu trong các bài viết sau.
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.
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
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 tính
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 khía cạnh:
1. Độ hiển thị của hàm hợp đồng
Việc thiết lập tính khả thi của các hàm hợp đồng một cách hợp lý là rất quan trọng để bảo vệ an toàn cho hợp đồng. Lấy ví dụ từ sự cố an ninh xảy ra tại sàn giao dịch Bancor Network vào ngày 18 tháng 6 năm 2020, do vô tình thiết lập hàm chuyển tiền quan trọng thành public, dẫn đến việc tài sản của người dùng đối mặt với rủi ro nghiêm trọ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:
Ngoài ra, có thể thực hiện các phương thức internal bằng cách định nghĩa một khối impl không có #[near_bindgen].
Đối với hàm callback, phải được đặt là public nhưng cần kiểm soát truy cập bổ sung:
gỉ #[private] pub fn resolve_transfer(&mut self) { env::log_str("Đây là một callback"); }
2. Kiểm soát truy cập chức năng đặc quyền
Ngoài khả năng hiển thị của các 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. Có thể tùy chỉnh Trait để đạt được hiệu ứng tương tự như modifier onlyOwner trong Solidity:
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); }
Điều này có thể giới hạn chỉ có owner mới có thể gọi một số hàm đặc quyền. Dựa trên điều này, có thể thiết lập danh sách trắng đa người dùng phức tạp hơn hoặc nhiều danh sách trắng, để thực hiện kiểm soát truy cập phân nhóm tinh vi.
Trong hợp đồng thông minh Rust còn có các phương pháp kiểm soát truy cập khác, như kiểm soát thời điểm gọi, cơ chế đa chữ ký, v.v., sẽ được giới thiệu trong các bài viết sau.