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:
Tính khả dụng/có thể gọi của phương thức hợp đồng
Kiểm soát truy cập chức năng đặc quyền/Phân định quyền và trách nhiệm
1. Độ khả thi của hàm hợp đồng
Việc thiết lập tính khả thi của hàm hợp đồng thông minh có thể kiểm soát quyền truy cập vào hàm, bảo vệ các phần quan trọng không bị truy cập tùy ý. Lấy ví dụ từ sàn giao dịch Bancor Network, vào tháng 6 năm 2020 đã xảy ra sự cố an toàn tài sản do thiết lập tính khả thi của hàm sai.
Trong hợp đồng thông minh Rust, khả năng truy cập chức năng được kiểm soát bằng các cách sau:
pub fn: hàm công khai, có thể được gọi từ bên ngoài hợp đồng
fn: Hàm nội bộ, chỉ có thể được gọi trong hợp đồng.
pub(crate) fn: giới hạn gọi bên trong crate
Một cách khác để thiết lập phương thức nội bộ là định nghĩa một khối mã impl Contract độc lập, không sử dụng sửa đổi #[near_bindgen] .
Hàm callback cần được thiết lập là pub, nhưng phả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.
Rust mặc định tất cả nội dung là riêng tư, nhưng các thành phần trong trait và enum thì 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 việc thiết lập khả năng hiển thị của hàm, còn cần xây dựng cơ chế danh sách trắng kiểm soát truy cập. Tương tự như modifier onlyOwner trong Solidity, có thể định nghĩa các hàm đặc quyền chỉ có owner mới có thể gọi.
Trong Rust có thể triển khai trait Ownable tương tự:
Cách này có thể thực hiện kiểm soát truy cập đối với các chức năng đặc quyền. Có thể mở rộng thêm để thiết lập danh sách trắng nhiều người dùng hoặc nhiều nhóm danh sách trắng.
3. Các phương pháp kiểm soát truy cập khác
Còn có thể thực hiện:
Kiểm soát thời điểm gọi hợp đồng
Cơ chế gọi hàm hợp đồng đa chữ ký
Cơ chế quản trị ( DAO )
Cụ thể nội dung vui lòng theo dõi các thông báo tiếp theo.
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.
20 thích
Phần thưởng
20
4
Đăng lại
Chia sẻ
Bình luận
0/400
EthMaximalist
· 08-14 01:11
A ha, đây không phải là lỗ hổng mà Bancor đã gặp phải vào năm đó sao?
Xem bản gốcTrả lời0
HalfBuddhaMoney
· 08-12 19:17
Wuhu, lại đến thời gian viết bug.
Xem bản gốcTrả lời0
GhostAddressMiner
· 08-12 19:17
Lỗ hổng hợp đồng này thật sự quá sơ đẳng, tôi đã theo dõi 276 ví tiền hacker, từ lâu đã phát hiện dòng tiền của bancor có vấn đề.
Xem bản gốcTrả lời0
CoconutWaterBoy
· 08-12 18:50
Làm hợp đồng đã nhiều năm, pub fn cũng đã thất bại vô số lần.
Rust hợp đồng thông minh an toàn thực hành: Giải thích chi tiết về tính khả thi của hàm và kiểm soát quyền truy cập
Rust hợp đồng thông minh养成日记(7)合约安全之计算精度
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. Độ khả thi của hàm hợp đồng
Việc thiết lập tính khả thi của hàm hợp đồng thông minh có thể kiểm soát quyền truy cập vào hàm, bảo vệ các phần quan trọng không bị truy cập tùy ý. Lấy ví dụ từ sàn giao dịch Bancor Network, vào tháng 6 năm 2020 đã xảy ra sự cố an toàn tài sản do thiết lập tính khả thi của hàm sai.
Trong hợp đồng thông minh Rust, khả năng truy cập chức năng được kiểm soát bằng các cách sau:
Một cách khác để thiết lập phương thức nội bộ là định nghĩa một khối mã impl Contract độc lập, không sử dụng sửa đổi #[near_bindgen] .
Hàm callback cần được thiết lập là pub, nhưng phả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.
Rust mặc định tất cả nội dung là riêng tư, nhưng các thành phần trong trait và enum thì 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 việc thiết lập khả năng hiển thị của hàm, còn cần xây dựng cơ chế danh sách trắng kiểm soát truy cập. Tương tự như modifier onlyOwner trong Solidity, có thể định nghĩa các hàm đặc quyền chỉ có owner mới có thể gọi.
Trong Rust có thể triển khai trait Ownable tương tự:
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); }
Cách này có thể thực hiện kiểm soát truy cập đối với các chức năng đặc quyền. Có thể mở rộng thêm để thiết lập danh sách trắng nhiều người dùng hoặc nhiều nhóm danh sách trắng.
3. Các phương pháp kiểm soát truy cập khác
Còn có thể thực hiện:
Cụ thể nội dung vui lòng theo dõi các thông báo tiếp theo.