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 hiển thị của phương thức hợp đồng và kiểm soát quyền truy cập vào các hàm đặc quyền.
1. Tính khả dụng của hàm hợp đồng
Khi viết hợp đồng thông minh, việc chỉ định tính khả thi của hàm có thể kiểm soát ai có thể gọi hàm cụ thể, từ đó bảo vệ các phần quan trọng trong hợp đồng.
Lấy ví dụ từ sự kiện an ninh xảy ra tại một sàn giao dịch vào ngày 18 tháng 6 năm 2020. Do việc thiết lập quyền truy cập vào các chức năng quan trọng của hợp đồng bị sai, đã dẫn đến rủi ro cho tài sản của người dùng. Trường hợp này làm nổi bật tầm quan trọng của việc thiết lập tính khả thi của các chức năng trong hợp đồng một cách chính xác.
Trong hợp đồng thông minh Rust, có một số loại tính khả dụng của hàm chính:
pub fn: Biểu thị rằng phương thức này là công khai, thuộc phần giao diện của hợp đồng, bất kỳ ai cũng có thể gọi từ bên ngoài.
fn: Nếu không chỉ định rõ pub, điều đó có nghĩa là hàm này chỉ có thể được gọi từ bên trong hợp đồng bởi các hàm khác.
pub(crate) fn: Giới hạn việc gọi phương thức ở trong phạm vi nội bộ của crate.
Một cách khác để đặt phương thức là nội bộ là định nghĩa trong khối mã impl Contract không được đánh dấu bằng #[near_bindgen].
Đối với hàm callback, nó phải được thiết lập là thuộc tính public để có thể gọi thông qua function call. Đồng thời, cần đảm bảo rằng hàm callback không thể bị gọi tùy ý, có thể sử dụng macro #[private] để thực hiện điều này.
Điều đáng chú ý là trong Rust, mặc định tất cả mọi thứ đều là riêng tư, ngoại trừ các thành phần con trong pub Trait và các biến trong pub Enum thì mặc định là công khai.
2. Kiểm soát truy cập của chức năng đặc quyền
Ngoài khả năng nhìn thấy hàm, còn cần thiết phải 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ừ góc độ ngữ nghĩa. Một số hàm đặc quyền (như khởi tạo hợp đồng, mở/ngừng, v.v.) 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ể thực hiện chức năng tương tự như bộ sửa đổi onlyOwner trong Solidity:
Sử dụng phương pháp này có thể thực hiện kiểm soát truy cập đối với các hàm đặc quyền, đảm bảo chỉ có chủ sở hữu hợp đồng mới có thể thực hiện đầy đủ các hàm này. Dựa trên nguyên tắc này, có thể thiết lập cơ chế danh sách trắng phức tạp hơn, thực hiện kiểm soát truy cập theo nhóm tinh vi.
3. Các phương pháp kiểm soát truy cập khác
Ngoài những phương pháp đã nêu, trong hợp đồng thông minh Rust còn có các phương thức kiểm soát truy cập khác, như kiểm soát thời điểm gọi hợp đồng, cơ chế gọi đa chữ ký và việc thực hiện quản trị (DAO) v.v. Những nội dung này sẽ được thảo luận chi tiết trong các bài viết sau.
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.
10 thích
Phần thưởng
10
4
Chia sẻ
Bình luận
0/400
ProxyCollector
· 4giờ trước
Lại là một cái bẫy trong việc thiết lập quyền, ai trúng chiêu thì khổ.
Xem bản gốcTrả lời0
SelfRugger
· 17giờ trước
Lại là vấn đề quyền hạn khiến tôi thất vọng.
Xem bản gốcTrả lời0
AllTalkLongTrader
· 17giờ trước
Hihi lại gặp cái hố của sàn giao dịch năm ngoái rồi.
Xem bản gốcTrả lời0
PermabullPete
· 18giờ trước
Quyền không kiểm soát được suýt nữa thì ngừng hoạt động.
Rust hợp đồng thông minh quyền kiểm soát: tính khả dụng của hàm và thực tiễn truy cập đặc quyền
Kiểm soát quyền 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 hiển thị của phương thức hợp đồng và kiểm soát quyền truy cập vào các hàm đặc quyền.
1. Tính khả dụng của hàm hợp đồng
Khi viết hợp đồng thông minh, việc chỉ định tính khả thi của hàm có thể kiểm soát ai có thể gọi hàm cụ thể, từ đó bảo vệ các phần quan trọng trong hợp đồng.
Lấy ví dụ từ sự kiện an ninh xảy ra tại một sàn giao dịch vào ngày 18 tháng 6 năm 2020. Do việc thiết lập quyền truy cập vào các chức năng quan trọng của hợp đồng bị sai, đã dẫn đến rủi ro cho tài sản của người dùng. Trường hợp này làm nổi bật tầm quan trọng của việc thiết lập tính khả thi của các chức năng trong hợp đồng một cách chính xác.
Trong hợp đồng thông minh Rust, có một số loại tính khả dụng của hàm chính:
Một cách khác để đặt phương thức là nội bộ là định nghĩa trong khối mã impl Contract không được đánh dấu bằng #[near_bindgen].
Đối với hàm callback, nó phải được thiết lập là thuộc tính public để có thể gọi thông qua function call. Đồng thời, cần đảm bảo rằng hàm callback không thể bị gọi tùy ý, có thể sử dụng macro #[private] để thực hiện điều này.
Điều đáng chú ý là trong Rust, mặc định tất cả mọi thứ đều là riêng tư, ngoại trừ các thành phần con trong pub Trait và các biến trong pub Enum thì mặc định là công khai.
2. Kiểm soát truy cập của chức năng đặc quyền
Ngoài khả năng nhìn thấy hàm, còn cần thiết phải 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ừ góc độ ngữ nghĩa. Một số hàm đặc quyền (như khởi tạo hợp đồng, mở/ngừng, v.v.) 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ể thực hiện chức năng tương tự như bộ sửa đổi 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); }
Sử dụng phương pháp này có thể thực hiện kiểm soát truy cập đối với các hàm đặc quyền, đảm bảo chỉ có chủ sở hữu hợp đồng mới có thể thực hiện đầy đủ các hàm này. Dựa trên nguyên tắc này, có thể thiết lập cơ chế danh sách trắng phức tạp hơn, thực hiện kiểm soát truy cập theo nhóm tinh vi.
3. Các phương pháp kiểm soát truy cập khác
Ngoài những phương pháp đã nêu, trong hợp đồng thông minh Rust còn có các phương thức kiểm soát truy cập khác, như kiểm soát thời điểm gọi hợp đồng, cơ chế gọi đa chữ ký và việc thực hiện quản trị (DAO) v.v. Những nội dung này sẽ được thảo luận chi tiết trong các bài viết sau.