Tổng quan
Trong lập trình Cadence của Flow, Access Control (Kiểm soát Truy cập) là một tính năng rất mạnh mẽ, giúp tăng cường bảo mật của các hợp đồng thông minh. Để thực hiện việc này, chúng ta sử dụng Access Modifiers (Điều chỉnh Truy cập) để xác định phạm vi đọc/ghi cho các biến, hằng số và trường.
Trong bài viết này, chúng ta đã tìm hiểu về các Access Modifiers khác nhau như pub, pub(set), access(account), access(contract) và priv/access(self). Mỗi Access Modifier có phạm vi đọc/ghi khác nhau và chúng ta nên chọn phù hợp với từng trường hợp cụ thể để đảm bảo tính bảo mật của hợp đồng thông minh của chúng ta.
Access Control và Access Modifiers
Kiểm soát Truy cập là một tính năng cực kỳ mạnh mẽ trong Cadence, và làm cho nó rất đặc biệt.
Kiểm soát Truy cập mô tả cách chúng ta có thể sử dụng các thứ được gọi là “Trình điều chỉnh Truy cập” để tăng cường bảo mật của các hợp đồng thông minh của chúng ta.
Trước đây, trong tất cả các bài học, chúng ta đã khai báo tất cả các biến và hàm bằng từ khóa pub
, như sau:
pub let x: Bool pub fun Somefunction(): Bool { return true }
Nhưng pub
chính xác có nghĩa là gì? Tại sao chúng ta đang đặt nó ở đó? Chúng ta có thể thay thế gì khác không?
Access Modifiers
pub
gọi là “Trình điều chỉnh Truy cập” trong Cadence. Một Trình điều chỉnh Truy cập về cơ bản là một mức độ bảo mật trong các hợp đồng thông minh của chúng ta. Nhưng có rất nhiều khác mà chúng ta cũng có thể sử dụng. Hãy nhìn vào sơ đồ này để giúp chúng ta có ý tưởng về tất cả các trình điều chỉnh truy cập khác nhau mà chúng ta có thể sử dụng.
Chúng ta sẽ chỉ tập trung vào các hàng var
, bởi vì let
không có phạm vi ghi vì nó là một hằng số.
Scope là gì?
Điều này có nghĩa là chúng ta có thể truy cập vào contract của mình từ bất cứ đâu. Bên trong hợp đồng, trong các giao dịch và tập lệnh, ở bất cứ đâu.
2. Current & Inner Scope
3. Containing Contract Scope
Điều này có nghĩa là chúng ta có thể truy cập vào thứ của mình ở bất kỳ đâu trong hợp đồng mà được xác định.
4. Account Scope
Điều này có nghĩa là chúng ta có thể truy cập vào thứ của mình ở bất kỳ đâu trong tài khoản mà nó được xác định. Điều này có nghĩa là tất cả các hợp đồng có trong tài khoản. Hãy nhớ rằng: chúng tôi có thể triển khai nhiều hợp đồng cho một tài khoản.
Access Modifiers cơ bản
pub(set)
pub(set)
là một phương thức áp dụng cho các biến, hằng số và trường (field). Các hàm không thể được thiết lập công khai. Đây cũng là phương thức sửa đổi nguy hiểm nhất và dễ dàng truy cập nhất.
pub(set) var x: String
Phạm vi viết – All Scope
Phạm vi đọc – All Scope
pub/access(all)
pub
cũng giống như access(all)
. Đây là lớp tiếp theo dưới pub(set)
.
pub var x: String access(all) var y: String pub fun testFuncOne() {} access(all) fun testFuncTwo() {}
Phạm vi viết – Current & Inner
Phạm vi đọc – All Scope
access(account)
access(account)
hạn chế hơn một chút so với pub
về phạm vi đọc
access(account) var x: String access(account) fun testFunc() {}
Phạm vi viết – Current & Inner
Phạm vi đọc – Tất cả contract trong Account
access(contract)
access(contract)
hạn chế hơn một chút so với quyền access(account)
về phạm vi đọc.
access(contract) var x: String access(contract) fun testFunc() {}
Phạm vi viết – Current & Inner
Phạm vi đọc – Containing Contract
priv/access(self)
priv
cũng giống như access(self)
. Đây là công cụ sửa đổi quyền truy cập hạn chế nhất (và an toàn).
priv var x: String access(self) var y: String priv fun testFuncOne() {} access(self) fun testFuncTwo() {}
Phạm vi viết – Current & Inner
Phạm vi đọc – Current & Inner
Kết luận
Với access modifiers, chúng ta phải tạo ra một sự phân biệt vô cùng quan trọng: Mặc dù một số access modifiers như “priv
” khiến cho các trường không thể đọc được trong mã Cadence của bạn, điều này không có nghĩa là mọi người không thể đọc thông tin này bằng cách nhìn vào blockchain. Mọi thứ trên blockchain đều là công khai, bất kể phạm vi đọc của nó là gì. Các bộ điều khiển truy cập chỉ cho phép bạn xác định điều gì có thể được đọc/ghi trong ngữ cảnh của mã Cadence của bạn. Đừng bao giờ lưu trữ thông tin riêng tư trên blockchain!