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
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
10
Chia sẻ
Bình luận
0/400
Anon32942
· 07-14 23:24
Mã này hơi khó nhằn.
Xem bản gốcTrả lời0
GasFeeCrier
· 07-14 20:16
Sự an toàn này thực sự an toàn đến mức nào?
Xem bản gốcTrả lời0
MeaninglessApe
· 07-14 14:35
Cái này cũng phải cuốn? Đã viết Rust rồi.
Xem bản gốcTrả lời0
LootboxPhobia
· 07-12 09:38
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
· 07-12 09:38
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
· 07-12 09:37
Mã đã an toàn rồi chứ? Vẫn bị tiêm vào.
Xem bản gốcTrả lời0
UncleLiquidation
· 07-12 09:37
Độ an toàn của đa ký thì cũng ổn.
Xem bản gốcTrả lời0
UncleWhale
· 07-12 09:30
An toàn vẫn cần phải làm nghiêm túc.
Xem bản gốcTrả lời0
BankruptcyArtist
· 07-12 09:22
Đ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.