Rust hợp đồng thông minh an toàn: Hướng dẫn toàn diện về kiểm soát quyền truy cập

robot
Đang tạo bản tóm tắt

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

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 góc độ:

  • Độ khả dụng của phương thức (hàm) hợp đồng truy cập/gọi
  • Kiểm soát truy cập của hàm đặc quyền/Phân chia quyền và nghĩa vụ

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

Khi viết hợp đồng thông minh, việc chỉ định tí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, 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 tùy tiệ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, sàn giao dịch này đã xảy ra một sự kiện an toàn tài sản do lỗi trong việc thiết lập quyền truy cập vào chức năng chính của hợp đồng. Hợp đồng này được viết bằng ngôn ngữ Solidity, với tính khả dụng của các chức năng hợp đồng được chia thành hai loại: public/external và private/internal. Loại đầu tiên cho phép các chức năng hợp đồng bị gọi bởi các bên bên ngoài.

Trong quá trình sửa đổi một lỗ hổng bảo mật, do sơ suất, một số chức năng chuyển tiền quan trọng trong hợp đồng đã được đặt thành thuộc tính public, dẫn đến việc bất kỳ ai cũng có thể gọi các chức năng này từ bên ngoài hợp đồng để thực hiện các thao tác chuyển tiền, khiến tài sản 590.000 đô la 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, cũng phải chú ý đến việc kiểm soát tính khả dụng của các hàm trong hợp đồng. Các thuộc tính khả dụng khác nhau của các hàm hợp đồng thông minh Rust được đánh dấu bởi macro #[near_bindgen] được định nghĩa trong NEAR SDK như sau:

  • pub fn: biểu thị phương thức này là public, thuộc phần giao diện của hợp đồng, có thể được 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 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), giới hạn việc gọi phương thức 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à phần thực hiện này không được đánh dấu bằng #[near_bindgen].

Đối với hàm callback (Callbacks), định nghĩa của nó phải được thiết lập là thuộc tính public, nhưng cần đảm bảo chỉ có thể được gọi bởi hợp đồng tự nó. 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, mặc định tất cả nội dung đều là private, ngoại trừ các thành phần con trong pub Trait và các biến Enum trong pub Enum là công khai.

2. Kiểm soát quyền truy cập hàm đặc quyền( cơ chế danh sách trắng)

Ngoài việc kiểm soát tính khả dụng của hàm, cần phải 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 ( như khởi tạo hợp đồng, mở/ngừng, chuyển khoản thống nhất ) chỉ có thể được gọi bởi chủ sở hữu hợp đồng (owner), những hàm này thường được gọi là hàm "only owner".

Mặc dù các hàm chính này phải được đặt thành thuộc tính public, nhưng có thể định nghĩa các quy tắc kiểm soát truy cập cho chúng, chỉ những ai đáp ứng các quy tắc tương ứng mới có thể thực hiện đầy đủ. Trong hợp đồng thông minh Rust, có thể triển khai Trait tùy chỉnh tương tự như modifier onlyOwner trong Solidity:

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 truy cập đối với các hàm đặc quyền trong hợp đồng, yêu cầu người gọi phải là chủ sở hữu hợp đồng. Dựa trên nguyên lý này, có thể thông qua việc 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 trong danh sách trắng, hoặc thiết lập nhiều danh sách trắng để thực hiện kiểm soát truy cập theo nhóm một cách tinh vi.

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 ký của hàm hợp đồng
  • Quản trị(DAO)thực hiện

Những nội dung này sẽ được giới thiệu trong các bài viết tiếp theo của nhật ký phát triển hợp đồng thông minh trong series này.

GET3.34%
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
  • 6
  • Chia sẻ
Bình luận
0/400
CompoundPersonalityvip
· 21giờ trước
Lại phải đấu trí với quyền hạn rồi.
Xem bản gốcTrả lời0
MEVSupportGroupvip
· 21giờ trước
Lỗi quyền, thiệt hại rồi. Cùng nhau giữ ấm.
Xem bản gốcTrả lời0
MetaMaximalistvip
· 21giờ trước
ugh, một sai lầm tân binh ở mức bancor nữa... đây là lý do tại sao chúng ta cần xác minh chính thức cho tất cả các giao thức triển khai thật ra.
Xem bản gốcTrả lời0
TokenomicsTherapistvip
· 21giờ trước
Cỏ, bạn đừng nói về Bancor, tôi vẫn nhớ, lúc đó thật sự hỗn loạn.
Xem bản gốcTrả lời0
TokenEconomistvip
· 21giờ trước
để tôi giải thích - kiểm soát truy cập thực sự là abc của bảo mật hợp đồng smh
Xem bản gốcTrả lời0
Layer2Arbitrageurvip
· 21giờ trước
lmao tưởng tượng viết hợp đồng rust mà không có kiểm soát truy cập đúng cách... ngmi thật sự
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)