
Các chuyên gia hợp đồng thông minh, Trình biên dịch Solidity của bạn có thể đã xóa lặng lẽ một phép ghi giá trị mà bạn cần, và bạn sẽ không bao giờ thấy điều đó trong mã nguồn. Solidity 0.8.38 đã được phát hành vào thứ Năm tuần trước. Nó sửa một lỗi trong trình tối ưu hóa Yul, lỗi này tồn tại trong mọi phiên bản từ 0.8.19 đến 0.8.37. Trình tối ưu hóa ghi lại các ghi chú về những gì đang có trong bộ nhớ và lưu trữ. Nó sử dụng những ghi chú này để thay thế một phép tải bằng giá trị mà nó đã biết, và bỏ qua một phép ghi nếu giá trị cần ghi đã tồn tại. Để xác định xem hai địa chỉ có thể chồng lấn hay không, nó mô tả mỗi địa chỉ dưới dạng biến cơ sở cộng với độ lệch. Cùng biến cơ sở, độ lệch khác nhau, vậy chúng phải là các ô khác nhau. Những mô tả này được lưu vào bộ nhớ đệm. Sau đó, ai đó gán lại biến cơ sở. Trình tối ưu hóa không luôn nhận ra điều đó. Bây giờ nó so sánh một địa chỉ được xây dựng từ giá trị cũ với một địa chỉ được xây dựng từ giá trị mới, như thể chúng chia sẻ cùng một biến cơ sở. Nó kết luận rằng chúng khác nhau, nhưng ở thời điểm chạy, chúng lại trỏ đến cùng một vị trí. Kết quả là một ghi chú lỗi thời. Một phép tải sau đó có thể trả về giá trị cũ. Một phép ghi mà bạn cần có thể bị xóa bỏ. Một hàm keccak256 trên vị trí đó có thể băm dữ liệu lỗi thời. Chỉ mã được biên dịch với trình tối ưu hóa bật mới bị ảnh hưởng. Với via-IR, bất kỳ mã nào cũng có thể gặp lỗi này, ngay cả khi không dùng inline assembly. Với pipeline truyền thống mặc định, chỉ một số inline assembly và các hàm trợ giúp do trình biên dịch tạo ra. Các bản dựng không tối ưu hóa thì an toàn. Đội ngũ đánh giá mức độ nghiêm trọng thấp, và họ đã làm điều mà tôi mong muốn mọi đội ngũ trình biên dịch đều làm: Họ đã biên dịch lại tất cả các hợp đồng đã xác minh trong cơ sở dữ liệu Sourcify với và không có bản sửa lỗi, và bytecode của tất cả chúng đều giống nhau. Vì vậy, lỗi này rất hiếm. Hiếm không có nghĩa là không bao giờ xảy ra, đặc biệt nếu mã của bạn mới và chưa được triển khai. Lỗi này được phát hiện thông qua chương trình bounty của Ethereum Foundation, và một báo cáo thứ hai cho thấy mã Solidity thuần không dùng assembly cũng có thể kích hoạt nó.
