Bài viết
Chia sẻ kiến thức của bạn.
Kiểm soát truy cập trong mô-đun di chuyển: Hạn chế quan sát thực địa dựa trên quyền sở hữu
Tôi đang tự hỏi liệu có được phép truy cập các trường của đối tượng như trong Solidity không nếu chủ sở hữu của đối tượng không phải là người gửi giao dịch. Ví dụ, hãy xem xét đoạn mã sau:
public entry fun observe(obj: &CustomStruct, ctx: &mut TxContext) {
// ...
}
Trong chức năng này, nếu chủ sở hữu của obj được cung cấp dưới dạng đầu vào không giống với người gửi giao dịch, điều này có vi phạm bất kỳ quy tắc hoặc hạn chế Solidity nào không? Việc cố gắng truy cập các trường của obj có bị coi là bất hợp pháp trong bối cảnh này không? Cảm ơn bạn đã làm rõ.
- Move
- Smart Contract
Câu trả lời
2Chắc chắn, bạn đang đi đúng hướng. Trong Move, việc truy cập các trường của một đối tượng từ một mô-đun Move khác đòi hỏi phải xem xét cẩn thận các ranh giới mô-đun. Nếu bạn có một đối tượng, ví dụ như X, được khai báo trong mô-đun A, và bạn muốn truy cập dữ liệu của X trong mô-đun B, bạn cần xác định các hàm accessor trong mô-đun A. Các hàm này sẽ hoạt động như cầu nối, cho phép truy cập được kiểm soát vào dữ liệu của X.
Điều khiển truy cập này dựa trên ranh giới mô-đun Move, không nhất thiết phải dựa trên việc người gửi có phải là chủ sở hữu của đối tượng hay không. Cách tiếp cận của Move đối với quyền sở hữu đối tượng là nghiêm ngặt và các mô-đun bên ngoài chỉ có thể truy cập vào các đối tượng thông qua các chức năng được xác định trước được cung cấp bởi mô-đun sở hữu.
Do đó, hãy đảm bảo rằng bạn có các hàm truy cập thích hợp được xác định trong mô-đun nơi đối tượng được khai báo (mô-đun A trong trường hợp của bạn). Các chức năng này sẽ cho phép truy cập được kiểm soát vào các trường của đối tượng từ các mô-đun khác, duy trì tính toàn vẹn và bảo mật của cơ sở mã của bạn.
Trong Solidity, không có hạn chế về việc đọc các trường của đối tượng nếu chủ sở hữu của đối tượng không phải là người gửi giao dịch. Người gửi giao dịch có thể đọc bất kỳ biến trạng thái công khai nào của hợp đồng. Tuy nhiên, họ chỉ có thể sửa đổi các biến trạng thái nếu chúng có quyền thích hợp.
Trong đoạn mã được cung cấp của bạn, hàm observer đang cố gắng truy cập các trường của một CustomStruct
đối tượng. Nếu CustomStruct
đối tượng được định nghĩa là một biến trạng thái công khai trong một hợp đồng, bất kỳ người dùng nào cũng có thể gọi hàm observer và đọc các trường của CustomStruct
đối tượng. Người gửi giao dịch không cần phải là chủ sở hữu của CustomStruct
đối tượng.
Dưới đây là một ví dụ về cách bạn có thể xác định một CustomStruct
đối tượng và một hàm quan sát trong Solidity:
pragma solidity ^0.8.4;
contract MyContract {
struct CustomStruct {
uint data;
}
CustomStruct public obj;
function observe() public view returns (uint) {
return obj.data;
}
}
Trong ví dụ này, hàm observer trả về trường dữ liệu của đối tượng obj. Bất kỳ người dùng nào cũng có thể gọi hàm observer và đọc trường dữ liệu của đối tượng obj, bất kể ai sở hữu đối tượng obj.
Tuy nhiên, nếu CustomStruct
đối tượng không được định nghĩa là một biến trạng thái công khai, người gửi giao dịch không thể truy cập các trường của nó. Trong trường hợp đó, bạn sẽ cần cung cấp một chức năng công khai trong hợp đồng trả về các trường của CustomStruct
đối tượng.
Xin lưu ý rằng mặc dù người gửi giao dịch có thể đọc bất kỳ biến trạng thái công khai nào của hợp đồng, họ chỉ có thể sửa đổi các biến trạng thái nếu họ có quyền thích hợp. Ví dụ: bạn có thể sử dụng công cụ onlyOwner
sửa đổi để hạn chế việc sửa đổi các biến trạng thái cho chủ sở hữu hợp đồng fravoll.github.io.
Bạn có biết câu trả lời không?
Hãy đăng nhập và chia sẻ nó.