RFC: Sử dụng this.balance
làm cơ chế khóa không cần lưu trữ sau Cancun
Sau nâng cấp Cancun và những thay đổi được giới thiệu bởi EIP-6780, khả năng khóa và mở khóa hợp đồng động đã trở nên khó khăn hơn, đặc biệt là trong các kịch bản mà việc truy vấn lưu trữ cho mỗi giao dịch không mong muốn. Tôi đề xuất một cơ chế tối thiểu để kích hoạt và khóa hợp đồng (cụ thể là hợp đồng định tuyến) bằng cách sử dụng biến this.balance
tích hợp sẵn làm cờ điều khiển.
Use Case
Hợp đồng định tuyến được đề cập:
- Giữ các phê duyệt của người dùng nhưng không có token hoặc logic kinh doanh đáng kể.
- Không giữ ETH trong hoạt động bình thường của nó.
- Cần một cách tin cậy, không cần lưu trữ để chuyển đổi giữa trạng thái hoạt động và không hoạt động.
Điều này đặc biệt hữu ích trong các trường hợp:
- Một lỗi được xác định trong hợp đồng và người dùng cần được ngăn không tương tác với nó cho đến khi được sửa chữa.
- Cần phải khóa định tuyến nhanh chóng mà không yêu cầu thu hồi thủ công các phê duyệt của người dùng.
Cơ chế đề xuất
Cơ chế này chỉ dựa vào số dư ETH của hợp đồng (this.balance
) để chuyển đổi trạng thái của nó. Logic như sau:
- Định nghĩa trạng thái:
- Không hoạt động:
this.balance == 0
. Hợp đồng từ chối tất cả các tương tác. - Hoạt động:
this.balance == 1 wei
. Hợp đồng hoạt động bình thường.
- Chuyển đổi trạng thái:
- Kích hoạt hợp đồng: Hàm
activate()
(giới hạn với địa chỉ DEACTIVATOR không thể thay đổi) gửi 1 wei đến hợp đồng, đặt nó vào trạng thái hoạt động. - Khóa hợp đồng: Hàm
deactivate()
(cũng bị giới hạn) chuyển tất cả ETH trong hợp đồng trở lại DEACTIVATOR, đặt số dư về không.
- Các tính năng chính:
- Định tuyến không có hàm
receive
, đảm bảo rằng ETH không thể được gửi vô tình hoặc độc hại đến nó. - Tất cả các chuyển đổi trạng thái chỉ dựa vào số dư ETH, loại bỏ nhu cầu truy vấn hoặc lưu trữ các biến trạng thái tùy chỉnh.
Lợi ích
- Không đọc lưu trữ: Kiểm tra trạng thái dựa trên
this.balance
, tránh chi phí gas của việc đọc từ lưu trữ. - Chuyển đổi trạng thái hiệu quả: Kích hoạt hoặc khóa chỉ liên quan đến các chuyển ETH tối thiểu.
- An toàn: Không có hàm
receive
đảm bảo rằng định tuyến không thể vô tình tích lũy ETH. - Lỗi trong các hợp đồng định tuyến buộc người dùng phải thu hồi thủ công các phê duyệt.
- Truy vấn trạng thái cho mỗi giao dịch không mong muốn do chi phí gas hoặc độ phức tạp.
Tại sao điều này hữu ích
Cơ chế này cung cấp một cách nhẹ nhàng để xử lý việc khóa định tuyến, đặc biệt là trong các kịch bản:
Sử dụng số dư ETH của hợp đồng làm cờ chuyển đổi tránh được nhu cầu sử dụng biến lưu trữ, đồng thời cho phép thay đổi trạng thái nhanh chóng và hiệu quả. Cách tiếp cận này có thể mang lại lợi ích cho các thiết kế hợp đồng khác yêu cầu các cơ chế kích hoạt/khóa tương tự trong bối cảnh không cần lưu trữ.