Bài viết này sẽ giới thiệu về việc kiểm soát quyền trong hợp đồng thông minh Rust từ hai góc độ:
Tính khả thi của phương pháp hợp đồng
Kiểm soát truy cập của các hàm đặc quyền
1. Độ khả thi của hàm hợp đồng
Kiểm soát tính khả thi của các hàm hợp đồng là rất quan trọng để bảo vệ các chức năng then chốt. Lấy ví dụ về sự cố an ninh của sàn giao dịch Bancor Network vào tháng 6 năm 2020, do nhầm lẫn đặ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, có các loại khả năng truy cập hàm như sau:
pub fn: hàm công khai, có thể được gọi từ bên ngoài
fn: Hàm nội bộ, chỉ có thể được gọi bên trong hợp đồng
pub(crate) fn: Giới hạn gọi bên 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ể làm cho nó trở thành hàm nội bộ.
Đối với hàm callback, cần đặt là public nhưng đồng thời đảm bảo chỉ có thể được gọi bởi chính 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 tính khả dụng mặc định trong Rust là riêng tư, khác với tính công khai mặc định trong một số phiên bản Solidity. Ngoại lệ là các mục trong pub trait và pub enum mặc định là công khai.
2. Kiểm soát truy cập của các hàm đặc quyền
Ngoài khả năng hiển thị của hàm, cần phải thiết lập cơ chế danh sách trắng để kiểm soát quyền truy cập vào các hàm đặc quyền. Tương tự như modifier onlyOwner trong Solidity, có thể thực hiện một trait Ownable:
Sử dụng trait này có thể hạn chế chỉ có owner mới có thể gọi một số hàm quyền riêng. Dựa trên nguyên lý này, có thể thiết lập danh sách trắng phức tạp hơn để thực hiện kiểm soát truy cập chi tiết.
3. Các phương pháp kiểm soát truy cập khác
Cũng có thể xem xét việc kiểm soát thời điểm gọi hợp đồng, cơ chế gọi đa chữ ký, quản trị DAO và các phương pháp kiểm soát truy cập khác, những điều này sẽ được giới thiệu chi tiết trong các bài viết sau.
Xem bản gốc
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
7 thích
Phần thưởng
7
7
Chia sẻ
Bình luận
0/400
LootboxPhobia
· 11giờ trước
Bị kẹt rồi, không học nổi hợp đồng thông minh nữa.
Xem bản gốcTrả lời0
GasOptimizer
· 11giờ trước
Việc trực quan hóa tiêu thụ gas cho đa chữ ký lại là một chủ đề lớn.
Xem bản gốcTrả lời0
BridgeJumper
· 11giờ trước
Mã đã an toàn rồi chứ? Vẫn bị tiêm vào.
Xem bản gốcTrả lời0
UncleLiquidation
· 11giờ trước
Độ an toàn của đa ký thì cũng ổn.
Xem bản gốcTrả lời0
UncleWhale
· 11giờ trước
An toàn vẫn cần phải làm nghiêm túc.
Xem bản gốcTrả lời0
BankruptcyArtist
· 11giờ trước
Đa ký có tác dụng gì, có lỗ hổng vẫn bị khai thác.
Rust hợp đồng thông minh an toàn nâng cao: thực hành kiểm soát quyền và quản lý truy cập
Rust hợp đồng thông minh养成日记(7)合约安全之权限控制
Bài viết này sẽ giới thiệu về việc kiểm soát quyền trong hợp đồng thông minh Rust từ hai góc độ:
1. Độ khả thi của hàm hợp đồng
Kiểm soát tính khả thi của các hàm hợp đồng là rất quan trọng để bảo vệ các chức năng then chốt. Lấy ví dụ về sự cố an ninh của sàn giao dịch Bancor Network vào tháng 6 năm 2020, do nhầm lẫn đặ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, có các loại khả năng truy cập hàm như 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ể làm cho nó trở thành hàm nội bộ.
Đối với hàm callback, cần đặt là public nhưng đồng thời đảm bảo chỉ có thể được gọi bởi chính 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 tính khả dụng mặc định trong Rust là riêng tư, khác với tính công khai mặc định trong một số phiên bản Solidity. Ngoại lệ là các mục trong pub trait và pub enum mặc định là công khai.
2. Kiểm soát truy cập của các hàm đặc quyền
Ngoài khả năng hiển thị của hàm, cần phải thiết lập cơ chế danh sách trắng để kiểm soát quyền truy cập vào các hàm đặc quyền. Tương tự như modifier onlyOwner trong Solidity, có thể thực hiện một trait Ownable:
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 này có thể hạn chế chỉ có owner mới có thể gọi một số hàm quyền riêng. Dựa trên nguyên lý này, có thể thiết lập danh sách trắng phức tạp hơn để thực hiện kiểm soát truy cập chi tiết.
3. Các phương pháp kiểm soát truy cập khác
Cũng có thể xem xét việc kiểm soát thời điểm gọi hợp đồng, cơ chế gọi đa chữ ký, quản trị DAO và các phương pháp kiểm soát truy cập khác, những điều này sẽ được giới thiệu chi tiết trong các bài viết sau.