Sebagai pengembang Solidity yang berpikiran keamanan, ini adalah tanda Anda untuk sangat berhati-hati saat menggunakan blok yang tidak dicentang dan perakitan sebaris. Pada 0.8.0 dan yang lebih baru, kompiler akan secara otomatis menangani under/overflow. Tapi apa yang terjadi jika variabel yang dibiarkan meluap kemudian digunakan dalam yul? EVM sebenarnya tidak memiliki konsep tipe sempit, jadi kode yul tingkat rendah beroperasi pada ukuran kata 256-bit penuh. Bisakah Anda melihat ke mana perginya? Dalam skenario yang sangat disederhanakan ini yang saya temui dalam keterlibatan @CyfrinAudits saya saat ini, variabel panjang diam-diam meluap uint8 di dalam blok yang tidak dicentang dan membungkus menjadi 254 seperti yang diharapkan. Namun, ketika digunakan untuk mengubah ukuran array dalam blok perakitan sebaris berikutnya, bit atas yang kotor tetap ada seolah-olah luapan tidak pernah terjadi! Ini menghasilkan panjang array yang jauh lebih besar dari yang diharapkan, meskipun kita mungkin mengharapkannya dibatasi modulo nilai maksimum yang dapat diwakili oleh variabel panjang. Dengan menggunakan debugger pengecoran dan cast --to-base <0xfe|0x01fe> dec, kita dapat mengonfirmasi bahwa asumsi kita salah dan bit atas memang tetap kotor saat menulis panjang ke memori. Meskipun contoh ini dapat disederhanakan lebih jauh, kuncinya adalah selalu sangat curiga terhadap blok yang tidak dicentang/rakitan dan mempertimbangkan bagaimana bagian atas dari jenis sempit dapat menjadi kotor, bahkan untuk sesuatu yang sederhana dalam yul sebagai tugas. Ini terkadang terasa seperti bug esoteris yang tidak mungkin dikenali tanpa pengetahuan mendalam tentang internal kompiler EVM dan Solidity, jadi begitu menyadari apa yang sedang terjadi, saya menemukan contoh konkret ini cukup membantu. Kirimkan komentar kepada saya di bawah jika Anda memiliki pertanyaan, tetapi semoga Anda juga menganggapnya bermanfaat!
7,74K