
Smart contract maxis, Compiler Solidity Anda mungkin telah menghapus secara diam-diam sebuah penyimpanan yang Anda butuhkan, dan Anda tidak akan pernah melihatnya di sumber kode Anda. Solidity 0.8.38 dirilis Kamis lalu. Ini memperbaiki bug pada Yul optimiser yang ada di setiap rilis dari 0.8.19 hingga 0.8.37. Optimiser menyimpan catatan tentang apa yang ada di memori dan penyimpanan. Ia menggunakan catatan tersebut untuk mengganti pemuatan dengan nilai yang sudah diketahuinya, dan melewati penyimpanan yang menulis data yang sudah ada. Untuk menentukan apakah dua alamat dapat tumpang tindih, ia menggambarkan masing-masing sebagai variabel dasar ditambah offset. Basis yang sama, offset berbeda, jadi mereka pasti berada di slot yang berbeda. Deskripsi-deskripsi ini disimpan dalam cache. Kemudian seseorang menetapkan ulang variabel dasar. Optimiser tidak selalu menyadarinya. Sekarang ia membandingkan alamat yang dibangun dari nilai lama dengan alamat yang dibangun dari nilai baru seolah-olah keduanya berbagi basis yang sama. Ia memutuskan bahwa mereka berbeda, tetapi pada runtime keduanya menunjuk ke tempat yang sama. Hasilnya adalah catatan yang usang. Pemuatan selanjutnya dapat mengembalikan nilai lama. Penyimpanan yang Anda butuhkan dapat dihapus. Keccak256 atas lokasi tersebut dapat menghasilkan hash data yang sudah kadaluarsa. Hanya kode yang dikompilasi dengan optimiser aktif yang terpapar. Dengan via-IR, semua kode dapat terkena dampaknya, bahkan tanpa inline assembly. Dengan pipeline legacy default, hanya beberapa inline assembly dan helper yang dihasilkan compiler. Build tanpa optimasi aman. Tim menilai ini sebagai tingkat keparahan rendah, dan mereka melakukan sesuatu yang saya harap semua tim compiler lakukan. Mereka mengompilasi ulang setiap kontrak terverifikasi di database Sourcify dengan dan tanpa perbaikan, dan bytecode-nya identik untuk semuanya. Jadi, ini jarang terjadi. Jarang tidak sama dengan tidak pernah, terutama jika kode Anda baru dan belum dideploy. Bug ini ditemukan melalui bug bounty Ethereum Foundation, dan laporan kedua menunjukkan bahwa Solidity biasa tanpa assembly pun dapat memicunya.
