Khi một người tìm cách phân biệt giữa Web2 và Web3, một giá trị quan trọng giúp phân biệt hai loại này là khái niệm về quyền sở hữu.
Nói một cách đơn giản, những gì bạn tạo ra là những gì bạn sở hữu và có thể kiếm tiền. Đơn giản là nó nên thế. Không hơn không kém. Trên thực tế, ngày bạn đúc NFT đầu tiên của mình là khi bạn đã tạo nó trong Web3 với tư cách là chủ sở hữu, nhờ vào tính bất biến của chuỗi khối. Nếu bất cứ điều gì, cảm giác được bảo vệ là vô giá.
Nói về điều này, khái niệm quyền sở hữu này cũng quan trọng đối với các hợp đồng thông minh đối với các chức năng có thể truy cập và thay đổi trạng thái được phép.
Vì vậy, tại sao việc bạn 'sở hữu' hợp đồng thông minh mà bạn đã viết lại quan trọng?
Hãy nghĩ về điều này: nếu bạn sở hữu một chiếc xe đạp, bạn có ngần ngại lưu giữ hồ sơ sở hữu không? Đề phòng ai đó đánh cắp và sử dụng nó vào mục đích bất chính? Dĩ nhiên là không.
Đó cũng chính là lý do tại sao bạn muốn chứng minh quyền sở hữu của mình đối với NFT hoặc hợp đồng thông minh. Chà, ai đó có thể có được quyền truy cập trái phép và hưởng lợi về mặt tài chính từ nó, phải không?
Giả sử bạn làm việc với Dunzo và đã viết hợp đồng thông minh này, trong đó bạn có thể đặt giá trọn gói cộng với phí giao hàng cùng với việc người mua có thanh toán hay không.
Trong trường hợp lý tưởng, bạn có thể đặt tên của người mua, tổng giá của gói hàng và giao hàng thành một số tiền nhất định và đặt setPackageDelivered thành true. Tất nhiên, khi bạn đã hoàn thành việc giao gói hàng.
Nhưng, như tất cả chúng ta đều biết, không có gì đi theo kế hoạch.
Bây giờ, điều gì sẽ xảy ra nếu người mua có quyền truy cập vào các chức năng của hợp đồng và khả năng đặt lại giá trị packageDelivered thành sai hoặc thay đổi giá trị packageDeliveryPrice thành giá trị thấp hơn? Họ không chỉ có thể trả ít tiền hơn cho sản phẩm mà còn không phải trả bất cứ khoản nào.
Rõ ràng, ngoài Dunzo, không ai khác có quyền truy cập để thực hiện những thay đổi như vậy và đó là lý do tại sao việc đặt kiểm soát truy cập lại quan trọng.
Bây giờ, hãy triển khai hợp đồng thông minh này và xem kẻ xâm nhập dễ dàng thay đổi giá trị trong các biến trạng thái như thế nào.
Với cả chức năng setPrice và setPackageDelivered đều có thể truy cập được, bất kỳ ai cũng có thể thực hiện các thay đổi có thể dẫn đến tổn thất tài chính cho việc giao hàng của Dunzo.
Nếu Dunzo đã đặt giá ban đầu của mặt hàng là 5 ETH, giờ đây khách hàng có thể thay đổi giá trị đó thành 3 ETH. Tất nhiên, vì khách hàng cũng có thể truy cập hàm setPackageDelivered và thay đổi giá trị boolean thành false, nên anh ta có thể nhận được một lần gửi khác của cùng một mặt hàng. Vì vậy, trong cả hai trường hợp, Dunzo đều có khả năng mất tiền và thậm chí có thể không nhận ra điều đó cho đến khi quá muộn.
Ví dụ: giả sử sản phẩm được giao trị giá 5 ETH, như hình bên dưới:
Sau khi triển khai, không ai ngoài Dunzo có thể sửa đổi các điều khoản hợp đồng. Tuy nhiên, khi chúng tôi chuyển đổi địa chỉ trong Remix và đặt lại giá thành 3, điều này có thể xảy ra do không có biện pháp bảo vệ nào.
Chúng tôi thậm chí có thể thay đổi trạng thái setPackageDelivered từ true thành false. Ngay cả khi gói hàng đã được giao cho khách hàng.
Như bạn có thể thấy, điều quan trọng là phải phân biệt giữa chủ sở hữu và những người dùng khác đối với hợp đồng thông minh nói trên. Vì vậy, hãy xem xét 4 bản sửa lỗi sẽ thiết lập quyền kiểm soát truy cập thích hợp cho hợp đồng thông minh này và kết quả là đảm bảo an toàn cho nó.
Vì vậy, làm thế nào một người có thể phân biệt giữa chủ sở hữu và những người dùng khác khi viết hợp đồng thông minh?
Rõ ràng, điều này là cần thiết do tổn thất tài chính có thể xảy ra nếu bỏ qua.
Phương pháp #1: Sử dụng câu lệnh yêu cầu
Như bạn có thể thấy trong mã bên dưới, chủ sở hữu biến trạng thái mới của loại địa chỉ đã được thêm vào cùng với câu lệnh 'yêu cầu'. Trong hàm tạo, biến trạng thái chủ sở hữu lưu trữ địa chỉ được sử dụng khi triển khai hợp đồng. Như bạn đã biết, hàm tạo trong hợp đồng thông minh chỉ được gọi một lần nên không thể thay đổi địa chỉ.
Bây giờ, khi bạn gọi hàm setPrice với giá trị nhỏ hơn và địa chỉ khác, giao dịch sẽ được hoàn nguyên về trạng thái ban đầu, giống như thông báo bên dưới:
Như bạn có thể thấy, lý do được cung cấp bởi hợp đồng liên quan đến thông báo lỗi mà chúng tôi đã thêm vào câu lệnh 'yêu cầu'. Điều đó nói rằng, không ai ngoài chủ sở hữu của hợp đồng - trong trường hợp này là Dunzo - có thể thay đổi các điều khoản mua bán.
Phương pháp #2: Sử dụng công cụ sửa đổi chức năng
Đơn giản như việc thêm câu lệnh 'yêu cầu' với điều kiện phù hợp, công cụ sửa đổi là một khối mã mà bạn có thể sử dụng nhiều lần. Điều này chắc chắn có ý nghĩa hơn nhiều so với việc viết nhiều câu lệnh 'yêu cầu' cho một lần kiểm tra như vậy.
Trong mã được chia sẻ trước đó, chỉ có hàm setPrice được bảo vệ bởi câu lệnh 'require' nhưng không có gì được thực hiện cho hàm setPackageDelivered ở đây. Sử dụng công cụ sửa đổi sẽ thực hiện thủ thuật, như được hiển thị trong mã Solidity bên dưới:
Bây giờ, nếu bạn cố gắng truy cập các hàm setPrice hoặc setPackageDelivered, bạn sẽ nhận được thông báo lỗi giống như đã nhận được trước đó và như được hiển thị bên dưới:
Phương pháp #3: Có thể sở hữu
Bản sửa lỗi này yêu cầu bạn sử dụng hợp đồng thông minh Có thể sở hữu do OpenZeppelin cung cấp. Trước tiên, bạn phải nhập hợp đồng thông minh Có thể sở hữu và sau đó thêm công cụ sửa đổi onlyOwner vào các chức năng mà bạn muốn bảo vệ. Vì vậy, như được hiển thị bên dưới, cả hai hàm setPrice và setPackageDelivered đều có công cụ sửa đổi onlyOwner bên dưới.
Bây giờ, vì hợp đồng thông minh dunzoDelivery sẽ sử dụng một số chức năng trong Ownable.sol, nên “is Ownable” cũng được thêm vào tên hợp đồng.
Điều đó nói rằng, có hai chức năng khác mà người ta có thể truy cập khi sử dụng hợp đồng thông minh Có thể sở hữu: từ bỏ Quyền sở hữu và chuyển Quyền sở hữu. Mặc dù tài khoản được sử dụng để triển khai hợp đồng thường được coi là chủ sở hữu, nhưng điều này có thể được thay đổi bằng cách sử dụng các chức năng này.
Ngoài việc xem địa chỉ của chủ sở hữu và các chi tiết thỏa thuận khác, bạn có thể xem các hàm từ bỏQuyền sở hữu và chuyển nhượng Quyền sở hữu để sử dụng bên dưới:
Theo dự kiến, khi bạn cố gắng gọi hàm setPrice bằng địa chỉ khác, giao dịch sẽ không được thực hiện. Thay vào đó, nó trở lại trạng thái ban đầu, với lý do được cung cấp bên dưới:
Sử dụng hợp đồng thông minh Có thể sở hữu là tốt nếu bạn chỉ yêu cầu một chủ sở hữu duy nhất trong số những người dùng khác. Nếu bạn đang tìm kiếm nhiều thứ bậc hơn, thì nên sử dụng hợp đồng thông minh AccessControl.sol.
Phương pháp #4: AccessControl
Bản sửa lỗi cuối cùng này yêu cầu bạn truy cập hợp đồng thông minh AccessControl của Open Zeppelin.
Để bắt đầu, bạn phải thêm siêu liên kết Kiểm soát truy cập vào câu lệnh nhập cũng như thêm “is AccessControl” vào câu lệnh hợp đồng.
Như đã đề cập trước đó, hợp đồng thông minh này cho phép bạn thêm một số vai trò trong hệ thống phân cấp và vai trò này bạn phải khai báo, như trong hai dòng đầu tiên của hợp đồng thông minh được hiển thị bên dưới:
Trong hợp đồng này, có hai vai trò là Dunzo và Khách hàng. Bây giờ, khi bạn triển khai hợp đồng, bạn sẽ phải chỉ định các vai trò đã khai báo ở trên cho các địa chỉ đã nói, để xác định ai có thể truy cập những gì. Ngoài ra, hai câu lệnh 'yêu cầu' đã được thêm vào các hàm setPrice và setPackageDelivered.
Như bạn có thể biết, chỉ tài khoản đã được chỉ định vai trò Dunzo mới có thể thay đổi các điều khoản bán hàng được đề cập trong thời gian triển khai chứ không phải bất kỳ tài khoản nào khác. Điều đó nói rằng, bạn có thể chỉ định một số vai trò với các mức truy cập khác nhau vào các chức năng của hợp đồng thông minh bằng cách sử dụng AccessControl.sol trong khi Ownable.sol sẽ không đi sâu vào vấn đề đó.
Bây giờ, đây không phải là giải pháp duy nhất có sẵn để thực hiện kiểm soát truy cập trong hợp đồng thông minh. RBAC.sol và WhitelistCrowdSale.sol trước đây cũng đã có sẵn và cũng có thể liên kết vai trò với địa chỉ, giống như AccessControl.sol và Ownable.sol.
Vì vậy, nếu bạn muốn hiểu thấu đáo về quá trình phát triển của việc triển khai kiểm soát truy cập, thì bạn cũng nên dành thời gian xem qua mã trong hai hợp đồng thông minh này.
Cũng được xuất bản ở đây.
Hình ảnh chính cho bài viết này được tạo bởiTrình tạo hình ảnh AI của HackerNoon thông qua lời nhắc "quét sinh trắc học bị từ chối truy cập".