Quản lý quyền truy cập và tính khả thi của hàm trong hợp đồng thông minh Rust

Nhật ký phát triển hợp đồng thông minh Rust (7) Kiểm soát quyền hạn an toàn hợp đồng

Bài viết này sẽ giới thiệu nội dung liên quan đến kiểm soát quyền hạn trong hợp đồng thông minh Rust từ hai góc độ:

  1. Độ khả thấy của các phương thức (hàm) hợp đồng được truy cập/gọi
  2. Kiểm soát truy cập/Phân quyền chức năng đặc quyền

1. Độ khả dụng của hàm (phương thức) hợp đồng

Khi viết hợp đồng thông minh, việc chỉ định độ khả thi của các hàm hợp đồng có thể kiểm soát quyền truy cập vào các hàm. Điều này rất quan trọng để bảo vệ các phần quan trọng trong hợp đồng khỏi việc truy cập hoặc thao tác ngẫu nhiên.

Lấy sàn giao dịch Bancor Network làm ví dụ, vào ngày 18 tháng 6 năm 2020 đã xảy ra một sự kiện an ninh do việc thiết lập quyền truy cập cho các hàm quan trọng của hợp đồng bị sai. Hợp đồng này được viết bằng ngôn ngữ Solidity, tính khả dụng của hàm được chia thành hai loại: public/external và private/internal.

Trong quá trình sửa lỗi bảo mật, Bancor đã vô tình đặt một số hàm chuyển tiền quan trọng thành thuộc tính public, khiến bất kỳ ai cũng có thể gọi những 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àm tài sản 590.000 USD của người dùng đối mặt với rủi ro nghiêm trọng.

Trong hợp đồng thông minh Rust, việc kiểm soát tính khả dụng của hàm cũng rất quan trọng. Các thuộc tính khả dụng khác nhau của hàm hợp đồng được chú thích bằng macro #[near_bindgen] được định nghĩa bởi NEAR SDK như sau:

  • pub fn: hàm công khai, là một phần của giao diện hợp đồng, có thể được gọi từ bên ngoài hợp đồng.
  • fn: Hàm không chỉ định pub, chỉ có thể được gọi bên trong hợp đồng.
  • pub(crate) fn: Giới hạn gọi trong phạm vi nội bộ của crate.

Một cách khác để thiết lập phương thức thành internal là định nghĩa trong khối mã impl Contract không được trang trí bởi #[near_bindgen].

Đối với hàm callback, 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 hàm callback chỉ có thể được gọi bởi chính hợp đồng, có thể sử dụng macro #[private] để thực hiện.

2. Kiểm soát truy cập của hàm đặ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. Một số hàm đặc quyền (như khởi tạo hợp đồng, mở/tạm dừng, chuyển tiền thống nhất, v.v.) chỉ có thể được gọi bởi chủ sở hữu hợp đồng (owner).

Có thể thực hiện Trait tùy chỉnh để kiểm soát quyền truy cập vào các hàm đặc quyền, kiểm tra xem người gọi giao dịch có phải là chủ sở hữu hợp đồng hay không:

rỉ sét pub trait Ownable { fn assert_owner(&self) { assert_eq!(env::predecessor_account_id(), self.get_owner()); } AccountId; fn set_owner(&mut self, owner: AccountId); }

Dựa trên nguyên lý này, có thể thiết lập nhiều người dùng hoặc nhiều danh sách trắng trong danh sách trắng bằng cách tùy chỉnh các trait phức tạp hơn, thực hiện kiểm soát truy cập nhóm chi tiết.

3. Nhiều phương pháp kiểm soát truy cập hơn

Các phương pháp kiểm soát truy cập khác trong hợp đồng thông minh Rust bao gồm:

  • Kiểm soát thời điểm gọi hợp đồng
  • Cơ chế gọi đa chữ ký của hàm hợp đồng
  • Quản trị(DAO) được thực hiện

Những nội dung này sẽ được giới thiệu chi tiết trong loạt nhật ký phát triển hợp đồng thông minh sau này.

NEAR-0.93%
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.
  • Phần thưởng
  • 4
  • Chia sẻ
Bình luận
0/400
not_your_keysvip
· 3giờ trước
Tôi vẫn không hiểu rõ về lỗ hổng của Bancor từ lần đó đến giờ.
Xem bản gốcTrả lời0
SigmaBrainvip
· 22giờ trước
Quả thật, bài học từ Bancor đã để lại ấn tượng sâu sắc.
Xem bản gốcTrả lời0
NewPumpamentalsvip
· 22giờ trước
Lại đang nói về kiểm soát quyền hạn, sao không học bài học từ Bancor?
Xem bản gốcTrả lời0
ChainWallflowervip
· 22giờ trước
Vấn đề quyền này đã được làm rõ rồi~
Xem bản gốcTrả lời0
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)