
Một hợp đồng tiếp tục chạy sau một lời gọi thất bại hiện không có cách đáng tin cậy nào để xác định liệu bên được gọi có đã hoàn tác có chủ ý hay đơn giản là hết gas do người gửi chọn. Khoảng trống này là gốc rễ của hành vi gây rối do thiếu gas, và một đề xuất bản nháp mới cố gắng khắc phục nó ở cấp độ EVM. EIP-8456, được mở để thảo luận trên Ethereum Magicians vào thứ Hai, thêm một lệnh gọi là CALLSTATUS, tạm thời ở opcode 0xA5 với 2 gas. Nó đẩy trạng thái hoàn thành của lệnh gọi hoặc tạo gần nhất trong khung hiện tại dưới dạng ba bit. Bit 0 có nghĩa là hoàn tác, bit 1 có nghĩa là dừng bất thường như hết gas, và bit 2 có nghĩa là có điều gì đó trong khung bên dưới đã dừng. Tác giả chỉ ra rằng bằng chứng duy nhất hiện nay là phép tính gasleft() sau lời gọi, và mọi phân nhánh điều chỉnh giá gas đều đã phá vỡ các ngưỡng đó. Giá gas hai chiều được đề xuất trong EIP-8037 sẽ làm cho phép tính này yếu hơn nữa, vì nguồn dự trữ của nó không thể nhìn thấy qua opcode GAS. Vậy tại sao lại cần bit thứ ba? Hầu hết các lời gọi thực tế đều đi qua các trung gian như proxy, bao bọc functionCall của OpenZeppelin, Multicall3 hoặc trình kiểm tra chữ ký ERC-1271. Nếu chỉ báo trạng thái kết thúc của bên được gọi trực tiếp, thì một bao bọc bắt dừng do hết gas và hoàn tác với lý do sẽ trông giống như một hoàn tác có chủ ý. Bản nháp giữ một cờ dính di chuyển lên mọi khung, để người gửi chỉ kiểm soát gas không bao giờ có thể khiến người gọi đọc được một hoàn tác đơn thuần. Nó báo cáo kết quả thay vì nguyên nhân, và bên được gọi vẫn có thể tạo ra sự dừng có chủ ý bằng INVALID. Nó chỉ bảo vệ mã được viết sau khi nó được triển khai, vì các hợp đồng đã triển khai sẽ không đọc nó. Chưa có đánh giá bên ngoài nào, số opcode vẫn đang mở, và một bản mẫu cùng các bài kiểm tra cho 58 trường hợp được liệt kê vẫn đang chờ thực hiện. Liên kết - https://t.co/KnByUBgWrY
