Nhật ký phát triển hợp đồng thông minh Rust (7) Kiểm soát quyền hạn trong an toàn hợp đồng
Bài viết này sẽ giới thiệu về các nội dung liên quan đến kiểm soát quyền trong hợp đồng thông minh Rust từ hai khía cạnh:
Độ khả dụng của phương thức (hàm) hợp đồng được truy cập/gọi
Kiểm soát truy cập chức năng đặc quyền/Phân chia quyền và trách nhiệm
1. Độ khả kiến của hàm (phương thức) hợp đồng
Khi viết hợp đồng thông minh, việc chỉ định tính khả dụng của các hàm trong hợp đồng có thể kiểm soát quyền truy cập của các hàm, từ đó bảo vệ các phần quan trọng trong hợp đồng không bị truy cập hoặc thao tác một cách ngẫu nhiên.
Lấy ví dụ từ sàn giao dịch Bancor Network, vào ngày 18 tháng 6 năm 2020 đã xảy ra một sự kiện an ninh do lỗi thiết lập quyền truy cập các hàm chính của hợp đồng. Hợp đồng này được viết bằng ngôn ngữ Solidity, độ khả dụng của các hàm trong hợp đồng được chia thành public/external và private/internal. Loại đầu tiên cho phép các hàm của hợp đồng được gọi bởi các bên bên ngoài, có thể xem như một phần của giao diện hợp đồng.
Mạng Bancor đã vô tình đặt một số hàm chuyển tiền quan trọng trong hợp đồng thành thuộc tính public khi sửa một lỗ hổng bảo mật, dẫn đến việc bất kỳ ai cũng có thể gọi các hàm này từ bên ngoài hợp đồng để thực hiện các thao tác chuyển tiền. Lỗ hổng này đã đặt tài sản 590.000 USD của người dùng vào nguy cơ nghiêm trọng.
Trong hợp đồng thông minh Rust, cũng phải chú trọng đến việc kiểm soát tính khả dụng của các hàm hợp đồng. Macro #[near_bindgen] được định nghĩa bởi NEAR SDK có thể được sử dụng để sửa đổi các hàm hợp đồng thông minh Rust, có một số thuộc tính khả dụng khác nhau như sau:
pub fn: Biểu thị rằng phương thức hợp đồng 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 hợp đồng.
fn: Nếu không chỉ định rõ pub, thì có nghĩa là không thể gọi hàm đó trực tiếp từ bên ngoài hợp đồng, chỉ có thể được gọi bởi các hàm khác bên trong hợp đồng.
pub(crate) fn: Tương đương với pub( trong crate), tương tự như fn, giới hạn việc gọi các phương thức hợp đồng trong phạm vi nội bộ của crate.
Một cách khác để đặt phương thức hợp đồng thành internal là định nghĩa một khối mã impl Contract độc lập trong hợp đồng, mà không có dấu hiệu #[near_bindgen].
Đối với hàm gọi lại (Callbacks), định nghĩa của nó phải được đặt thành thuộc tính public, nhưng đồng thời cần đảm bảo chỉ có thể được gọi bởi chính hợp đồng. NEAR SDK cung cấp macro #[private] để thực hiện chức năng này.
Cần lưu ý rằng trong ngôn ngữ Rust, tất cả mọi thứ đều mặc định là riêng tư, ngoại trừ các thành phần con trong pub Trait và các biến Enum 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 (cơ chế danh sách trắng)
Ngoài khả năng hiển thị của hàm, cần 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 của hợp đồng. Một số hàm đặc quyền, chẳng hạn như khởi tạo hợp đồng, mở/ngừng, chuyển tiền đồng nhất, thường chỉ có thể được gọi bởi chủ sở hữu hợp đồng (owner).
Các hàm đặc quyền này phải được đặt thành thuộc tính public để có thể được gọi từ bên ngoài, nhưng đồng thời cần định nghĩa các quy tắc kiểm soát truy cập để đảm bảo chỉ những người dùng đáp ứng điều kiện mới có thể thực hiện đầy đủ.
Trong hợp đồng thông minh Rust, có thể thực hiện chức năng tương tự như modifier của Solidity, thông qua việc tùy chỉnh Trait để thực hiện kiểm soát truy cập cho các hàm đặc quyền:
Sử dụng trait này có thể thực hiện kiểm soát quyền truy cập vào các hàm đặc quyền trong hợp đồng, yêu cầu người gọi giao dịch phải là chủ sở hữu hợp đồng. Dựa trên nguyên lý này, có thể tùy chỉnh các modifier hoặc trait phức tạp hơn để thiết lập nhiều người dùng hoặc nhiều danh sách trắng, thực hiện kiểm soát quyền truy cập nhóm chi tiết.
3. Nhiều phương pháp kiểm soát truy cập hơn
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 pháp 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 nhiều chữ ký cho các hàm hợp đồng, thực hiện quản trị (DAO), v.v. Những nội dung này sẽ được giới thiệu chi tiết trong các bài viết tiếp theo của nhật ký nuôi dưỡng hợp đồng thông minh trong series này.
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.
14 thích
Phần thưởng
14
3
Chia sẻ
Bình luận
0/400
Rugpull幸存者
· 12giờ trước
Đợt này lại là trò lừa bịp danh sách cho phép mới phải không?
Xem bản gốcTrả lời0
RektHunter
· 12giờ trước
Người mới rust必看!靠谱~
Xem bản gốcTrả lời0
MetaLord420
· 12giờ trước
Chào, Danh sách cho phép cũng có thể bị đen đúng không~
An toàn hợp đồng thông minh Rust: Thực tiễn tốt nhất về khả năng hiển thị hàm và kiểm soát quyền truy cập
Nhật ký phát triển hợp đồng thông minh Rust (7) Kiểm soát quyền hạn trong an toàn hợp đồng
Bài viết này sẽ giới thiệu về các nội dung liên quan đến kiểm soát quyền trong hợp đồng thông minh Rust từ hai khía cạnh:
1. Độ khả kiến của hàm (phương thức) hợp đồng
Khi viết hợp đồng thông minh, việc chỉ định tính khả dụng của các hàm trong hợp đồng có thể kiểm soát quyền truy cập của các hàm, từ đó bảo vệ các phần quan trọng trong hợp đồng không bị truy cập hoặc thao tác một cách ngẫu nhiên.
Lấy ví dụ từ sàn giao dịch Bancor Network, vào ngày 18 tháng 6 năm 2020 đã xảy ra một sự kiện an ninh do lỗi thiết lập quyền truy cập các hàm chính của hợp đồng. Hợp đồng này được viết bằng ngôn ngữ Solidity, độ khả dụng của các hàm trong hợp đồng được chia thành public/external và private/internal. Loại đầu tiên cho phép các hàm của hợp đồng được gọi bởi các bên bên ngoài, có thể xem như một phần của giao diện hợp đồng.
Mạng Bancor đã vô tình đặt một số hàm chuyển tiền quan trọng trong hợp đồng thành thuộc tính public khi sửa một lỗ hổng bảo mật, dẫn đến việc bất kỳ ai cũng có thể gọi các hàm này từ bên ngoài hợp đồng để thực hiện các thao tác chuyển tiền. Lỗ hổng này đã đặt tài sản 590.000 USD của người dùng vào nguy cơ nghiêm trọng.
Trong hợp đồng thông minh Rust, cũng phải chú trọng đến việc kiểm soát tính khả dụng của các hàm hợp đồng. Macro #[near_bindgen] được định nghĩa bởi NEAR SDK có thể được sử dụng để sửa đổi các hàm hợp đồng thông minh Rust, có một số thuộc tính khả dụng khác nhau như sau:
Một cách khác để đặt phương thức hợp đồng thành internal là định nghĩa một khối mã impl Contract độc lập trong hợp đồng, mà không có dấu hiệu #[near_bindgen].
Đối với hàm gọi lại (Callbacks), định nghĩa của nó phải được đặt thành thuộc tính public, nhưng đồng thời cần đảm bảo chỉ có thể được gọi bởi chính hợp đồng. NEAR SDK cung cấp macro #[private] để thực hiện chức năng này.
Cần lưu ý rằng trong ngôn ngữ Rust, tất cả mọi thứ đều mặc định là riêng tư, ngoại trừ các thành phần con trong pub Trait và các biến Enum 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 (cơ chế danh sách trắng)
Ngoài khả năng hiển thị của hàm, cần 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 của hợp đồng. Một số hàm đặc quyền, chẳng hạn như khởi tạo hợp đồng, mở/ngừng, chuyển tiền đồng nhất, thường chỉ có thể được gọi bởi chủ sở hữu hợp đồng (owner).
Các hàm đặc quyền này phải được đặt thành thuộc tính public để có thể được gọi từ bên ngoài, nhưng đồng thời cần định nghĩa các quy tắc kiểm soát truy cập để đảm bảo chỉ những người dùng đáp ứng điều kiện mới có thể thực hiện đầy đủ.
Trong hợp đồng thông minh Rust, có thể thực hiện chức năng tương tự như modifier của Solidity, thông qua việc tùy chỉnh Trait để thực hiện kiểm soát truy cập cho các hàm đặc quyền:
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ể thực hiện kiểm soát quyền truy cập vào các hàm đặc quyền trong hợp đồng, yêu cầu người gọi giao dịch phải là chủ sở hữu hợp đồng. Dựa trên nguyên lý này, có thể tùy chỉnh các modifier hoặc trait phức tạp hơn để thiết lập nhiều người dùng hoặc nhiều danh sách trắng, thực hiện kiểm soát quyền truy cập nhóm chi tiết.
3. Nhiều phương pháp kiểm soát truy cập hơn
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 pháp 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 nhiều chữ ký cho các hàm hợp đồng, thực hiện quản trị (DAO), v.v. Những nội dung này sẽ được giới thiệu chi tiết trong các bài viết tiếp theo của nhật ký nuôi dưỡng hợp đồng thông minh trong series này.