Bài viết này sẽ khám phá vấn đề kiểm soát quyền trong hợp đồng thông minh Rust từ hai khía cạnh:
Tính khả thi của phương thức hợp đồng
Kiểm soát truy cập của chức năng đặc quyền
Khả năng nhìn thấy hàm hợp đồng
Trong hợp đồng thông minh Rust, việc kiểm soát tính khả dụng của hàm là vô cùng quan trọng. Lấy ví dụ về sự kiện bảo mật xảy ra tại sàn giao dịch Bancor Network vào năm 2020, việc thiết lập sai 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 của NEAR, khả năng truy cập của hàm chủ yếu có các loại sau:
pub fn: hàm công khai, có thể gọi từ bên ngoài hợp đồng
fn: chỉ có thể gọi bên trong hợp đồng
pub(crate) fn: giới hạn gọi trong crate
Ngoài ra, việc định nghĩa hàm trong khối impl không được đánh dấu bằng #[near_bindgen] cũng có thể được đặt thành hàm nội bộ.
Đối với hàm callback, cần phải đặt thành public nhưng đồng thời phải giới hạn chỉ có hợp đồng tự gọi. Có thể sử dụng macro #[private] để thực hiện điều này.
Cần lưu ý rằng, trong Rust, mặc định tất cả nội dung đều là riêng tư, ngoại trừ các mục trong pub Trait và pub Enum.
Kiểm soát truy cập của hàm đặ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ế kiểm soát truy cập hoàn chỉnh từ cấp độ ngữ nghĩa. Tương tự như bộ sửa đổi onlyOwner trong Solidity, chúng ta có thể định nghĩa một trait tương tự trong Rust:
Sử dụng trait như vậy có thể thực hiện kiểm soát truy cập cho các hàm đặc quyền, đảm bảo chỉ có chủ sở hữu hợp đồng mới có thể gọi những hàm này.
Dựa trên nguyên lý này, chúng ta có thể thực hiện kiểm soát truy cập tinh vi cho nhiều người dùng trong danh sách trắng hoặc nhiều nhóm danh sách trắng bằng cách tùy chỉnh các trait phức tạp hơn.
Ngoài ra, còn có thể thực hiện kiểm soát thời điểm gọi, cơ chế ký đa chữ ký và nhiều phương pháp kiểm soát truy cập khác, để đáp ứng nhu cầu an toàn trong các tình huống khác nhau.
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.
Quản lý quyền truy cập và khả năng hiển thị hàm trong hợp đồng thông minh Rust
Quyền kiểm soát trong hợp đồng thông minh Rust
Bài viết này sẽ khám phá vấn đề kiểm soát quyền trong hợp đồng thông minh Rust từ hai khía cạnh:
Khả năng nhìn thấy hàm hợp đồng
Trong hợp đồng thông minh Rust, việc kiểm soát tính khả dụng của hàm là vô cùng quan trọng. Lấy ví dụ về sự kiện bảo mật xảy ra tại sàn giao dịch Bancor Network vào năm 2020, việc thiết lập sai 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 của NEAR, khả năng truy cập của hàm chủ yếu có các loại sau:
Ngoài ra, việc định nghĩa hàm trong khối impl không được đánh dấu bằng #[near_bindgen] cũng có thể được đặt thành hàm nội bộ.
Đối với hàm callback, cần phải đặt thành public nhưng đồng thời phải giới hạn chỉ có hợp đồng tự gọi. Có thể sử dụng macro #[private] để thực hiện điều này.
Cần lưu ý rằng, trong Rust, mặc định tất cả nội dung đều là riêng tư, ngoại trừ các mục trong pub Trait và pub Enum.
Kiểm soát truy cập của hàm đặ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ế kiểm soát truy cập hoàn chỉnh từ cấp độ ngữ nghĩa. Tương tự như bộ sửa đổi onlyOwner trong Solidity, chúng ta có thể định nghĩa một trait tương tự trong Rust:
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); }
Sử dụng trait như vậy có thể thực hiện kiểm soát truy cập cho các hàm đặc quyền, đảm bảo chỉ có chủ sở hữu hợp đồng mới có thể gọi những hàm này.
Dựa trên nguyên lý này, chúng ta có thể thực hiện kiểm soát truy cập tinh vi cho nhiều người dùng trong danh sách trắng hoặc nhiều nhóm danh sách trắng bằng cách tùy chỉnh các trait phức tạp hơn.
Ngoài ra, còn có thể thực hiện kiểm soát thời điểm gọi, cơ chế ký đa chữ ký và nhiều phương pháp kiểm soát truy cập khác, để đáp ứng nhu cầu an toàn trong các tình huống khác nhau.