Versi terbaru dari kompiler Solidity v0.8.22 telah dirilis. Kompiler 0.8.22 mencakup sejumlah peningkatan bahasa dan kompiler, seperti definisi peristiwa tingkat file, pengoptimalan tambahan loop yang tidak dicentang, dukungan untuk mengimpor JSON perakitan EVM, dan banyak lagi.
PENTING
Rilis ini menghentikan dukungan untuk EVM di bawah Konstantinopel (Konstantinopel), yang menjadi semakin sulit dipertahankan. Versi kuno ini telah lama usang di mainnet dan testnet Ethereum, dan kami menduga mereka tidak lagi relevan dengan jaringan lain juga. Jalur dan solusi kode yang kompleks memperlambat pengembangan dan pengujian fitur untuk versi baru, jadi kami berharap untuk berhenti mendukungnya dalam rilis kompiler mendatang. Jika Anda mengandalkan dukungan untuk versi EVM ini, silakan hubungi kami[6] 。
Sorotan fitur baru
kenaikan loop yang tidak dicentang
Penggunaan aritmatika yang tidak dicentang saat meningkatkan penghitung loop adalah untuk optimasi gas[7] praktik umum. Mari kita ilustrasikan dengan contoh loop dan counter i berikut:
untuk (uint i = 0; i < array.length; ++i) {
acc += array[i] ; Saya tidak dimodifikasi oleh badan loop
}
Dalam banyak kasus (lihat kondisi yang tepat di bawah), operasi perbandingan akan memastikan bahwa saya tidak pernah mencapai nilai maksimum jenisnya, sehingga aman untuk mengasumsikan bahwa loop akan berhenti sebelum nilai maksimum tercapai. Dalam hal ini, pemeriksaan keamanan konter akan berlebihan dan membuang-buang gas. Ini mendorong pengguna untuk menggunakan pola panjang yang tidak dicentang, yang membungkus penghitung secara bertahap dalam blok aritmatika yang tidak dicentang di dalam loop, melewati cek:
untuk (uint i = 0; i < array.length;) {
acc += array[i] ;
Tidak dicentang { i ++; } // Saya bertambah tanpa pemeriksaan luapan -- lebih sedikit gas yang digunakan
}
Solidity 0.8.22 memperkenalkan optimasi pemeriksaan overflow yang secara otomatis menghasilkan kenaikan aritmatika yang tidak dicentang untuk penghitung loop. Pengoptimalan baru ini menghilangkan kebutuhan untuk menggunakan pola delta panjang yang tidak dicentang di badan loop seperti yang ada pada contoh sebelumnya.
Sebaliknya, pengoptimalan baru memungkinkan pengguna untuk kembali ke kode mentah yang lebih mudah dibaca tanpa mengorbankan efisiensi gas.
Kondisi yang tepat untuk pemeriksaan penghindaran tumpahan yang baru dioptimalkan adalah sebagai berikut:
Kondisi siklus dalam bentuk i < ... di mana i adalah variabel lokal (selanjutnya disebut "loop counter").
Perbandingan ini harus dilakukan pada jenis yang sama dengan penghitung loop, yaitu jenis di sebelah kanan harus secara implisit dikonversi ke jenis penghitung loop sehingga penghitung loop tidak secara implisit diperpanjang sebelum perbandingan.
Penghitung loop harus merupakan variabel lokal dari tipe bilangan bulat bawaan.
Ekspresi loop harus berupa kenaikan awalan atau akhiran untuk penghitung loop, i++ atau ++i.
Penghitung siklus tidak dapat dimodifikasi dalam kondisi siklus atau dalam badan siklus.
Untuk memperjelas kondisi kedua, pertimbangkan cuplikan kode berikut:
untuk (uint8 i = 0; dalam < UINT16(1000); ++I) {
tubuh lingkaran
}
Dalam hal ini, i dikonversi ke uint16 sebelum perbandingan, dan kondisinya tidak pernah benar-benar salah, sehingga pemeriksaan luapan tambahan tidak dapat dihapus.
Juga, perhatikan bahwa < adalah satu-satunya operator perbandingan yang memicu pengoptimalan. Operator <= dan operator lain sengaja dikecualikan. Selain itu, operator harus built-in - < yang ditentukan pengguna tidak memenuhi syarat.
Pengoptimalannya mudah dan selalu bermanfaat, sehingga akan diaktifkan meskipun pengoptimal lainnya dinonaktifkan menggunakan pengaturan umum settings.optimizer.enabled. Anda dapat menonaktifkannya secara eksplisit dengan menyetel settings.optimizer.details.simpleCounterForLoopUncheckedIncrement ke false dalam input JSON standar. Itu tidak dapat dinonaktifkan menggunakan antarmuka baris perintah.
Sesuaikan pengoptimal Yul untuk meregenerasi nol literal
Versi baru dibangun di atas dukungan opcode PUSH0 yang diperkenalkan di versi 0.8.20 dengan menambahkan Rematerialiser[8] [9] Langkah pengoptimalan diperluas untuk selalu meregenerasi literal nol alih-alih menyimpannya sebagai referensi variabel, memungkinkan PUSH0 digunakan sebagai pengganti DUP untuk mengurangi biaya gas. Untuk memastikan bahwa ini dilakukan secara efektif, Rematerialiser dan UnusedPruner ditambahkan Langkah-langkah ditambahkan ke urutan pembersihan default pengoptimal Yul.
Tambahkan dukungan untuk mengimpor JSON perakitan EVM (eksperimental)
Rilis baru ini menambahkan dukungan eksperimental untuk mengimpor rakitan EVM, membuka kemungkinan bagi alat eksternal untuk melakukan pengoptimalan super sebelum pembuatan bytecode. Tujuan utama dari fitur ini adalah untuk menentukan format serialisasi untuk rakitan EVM tingkat rendah sehingga rakitan yang dihasilkan kompiler dapat diekspor, dimodifikasi, dan diimpor ulang, sehingga melanjutkan proses kompilasi normal.
Penting: Ini adalah fitur eksperimental dan saat ini tidak tersedia dalam produksi. Kami menawarkan fitur ini dalam rilis ini sehingga Anda dapat mencobanya dan memberikan umpan balik.
Memungkinkan peristiwa didefinisikan di tingkat file
Soliditas 0.8.22 memungkinkan Anda untuk menentukan peristiwa di tingkat file. Definisi acara sekarang dapat ditempatkan di luar ruang lingkup kontrak. Ini memberikan opsi lain untuk organisasi kode tanpa harus membungkus acara secara artifisial di pustaka.
Selain itu, rilis ini memperbaiki bug yang menyebabkan kesalahan saat membuat NatSpec saat memancarkan peristiwa yang ditentukan dalam kontrak atau antarmuka eksternal untuk kode. Dalam rilis sebelumnya (0.8.21), kompiler Solidity menambahkan dukungan untuk akses terbatas ke peristiwa yang didefinisikan dalam kontrak dan antarmuka yang tidak diwarisi dari kontrak saat ini, tetapi bug mencegah penggunaan penuh fitur tersebut.
Dengan perbaikan bug ini dan memungkinkan definisi peristiwa tingkat file, versi terbaru Solidity memungkinkan pengguna untuk mengkompilasi contoh berikut tanpa kesalahan:
antarmuka I {
acara ForeignEvent();
}
kontrak C {
acara ForeignEvent();
}
peristiwa E();
kontrak D {
fungsi f() publik {
Memancarkan peristiwa asing akan memicu kesalahan internal pada 0.8.21
memancarkan I.ForeignEvent();
memancarkan C.ForeignEvent();
Memancarkan peristiwa tingkat file. Fitur baru.
memancarkan E();
}
}
Catatan perubahan penuh
Fitur bahasa
Memungkinkan peristiwa didefinisikan pada tingkat file.
Fitur kompiler
Generator kode: Hapus pemeriksaan overflow redundan untuk beberapa loop ketika variabel hitungan tidak meluap.
Antarmuka Baris Perintah: Menambahkan opsi --no-import-callback untuk mencegah kompiler memuat file sumber yang tidak secara eksplisit diberikan dalam CLI atau input JSON standar.
Antarmuka Baris Perintah: Menambahkan opsi eksperimental --import-asm-json untuk mengimpor rakitan EVM dalam format yang digunakan oleh --asm-json.
Antarmuka Baris Perintah: Gunakan tingkat keparahan dan pewarnaan yang sesuai untuk pesan kesalahan yang dihasilkan di luar alur yang dikompilasi.
EVM: Dukungan usang untuk versi EVM "homestead", "tangerineWhistle", "spuriousDragon", dan "byzantium".
SMTChecker: Mendukung operator yang ditentukan pengguna.
Yul Optimizer: Jika PUSH0 didukung, lebih suka menggunakan nol literal daripada menyimpan nilai nol dalam variabel.
Yul Optimizer: Menjalankan langkah-langkah Rematerializer dan UnusedPruner di akhir urutan pembersihan default.
Perbaikan bug
Generator Kode: Memperbaiki masalah di mana output melalui generator kode IR bergantung pada file yang ditemukan dalam panggilan balik impor. Dalam beberapa kasus, penetapan ID AST yang berbeda dapat mengubah urutan fungsi dalam penjadwalan internal, menghasilkan bytecode yang tampaknya berbeda tetapi secara semantik setara.
NatSpec: Memperbaiki kesalahan internal saat meminta dokumentasi pengguna atau dokumentasi pengembangan untuk kontrak yang memancarkan peristiwa yang ditentukan dalam kontrak atau antarmuka eksternal.
SMTChecker: Memperbaiki kesalahan pengkodean yang menyebabkan loop meluas setelah selesai.
SMTChecker: Inkonsistensi tetap dalam pemeriksaan kondisi konstan ketika beberapa saat atau untuk loop dibatalkan sebelum pemeriksaan kondisi.
Yul Optimizer: Memperbaiki masalah di mana nama variabel Yul yang dihasilkan kompiler selama CSE memengaruhi keputusan penggantian, menghasilkan bytecode yang berbeda (tetapi setara) dalam beberapa kasus.
Lihat Asli
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
Versi baru Solidity, bahasa pengembangan kontrak pintar Ethereum yang paling populer, telah dirilis
Kompilasi: Rencana penerjemahan; Sumber: soliditylang.org
Versi terbaru dari kompiler Solidity v0.8.22 telah dirilis. Kompiler 0.8.22 mencakup sejumlah peningkatan bahasa dan kompiler, seperti definisi peristiwa tingkat file, pengoptimalan tambahan loop yang tidak dicentang, dukungan untuk mengimpor JSON perakitan EVM, dan banyak lagi.
PENTING
Rilis ini menghentikan dukungan untuk EVM di bawah Konstantinopel (Konstantinopel), yang menjadi semakin sulit dipertahankan. Versi kuno ini telah lama usang di mainnet dan testnet Ethereum, dan kami menduga mereka tidak lagi relevan dengan jaringan lain juga. Jalur dan solusi kode yang kompleks memperlambat pengembangan dan pengujian fitur untuk versi baru, jadi kami berharap untuk berhenti mendukungnya dalam rilis kompiler mendatang. Jika Anda mengandalkan dukungan untuk versi EVM ini, silakan hubungi kami[6] 。
Sorotan fitur baru
kenaikan loop yang tidak dicentang
Penggunaan aritmatika yang tidak dicentang saat meningkatkan penghitung loop adalah untuk optimasi gas[7] praktik umum. Mari kita ilustrasikan dengan contoh loop dan counter i berikut:
untuk (uint i = 0; i < array.length; ++i) {
acc += array[i] ; Saya tidak dimodifikasi oleh badan loop
}
Dalam banyak kasus (lihat kondisi yang tepat di bawah), operasi perbandingan akan memastikan bahwa saya tidak pernah mencapai nilai maksimum jenisnya, sehingga aman untuk mengasumsikan bahwa loop akan berhenti sebelum nilai maksimum tercapai. Dalam hal ini, pemeriksaan keamanan konter akan berlebihan dan membuang-buang gas. Ini mendorong pengguna untuk menggunakan pola panjang yang tidak dicentang, yang membungkus penghitung secara bertahap dalam blok aritmatika yang tidak dicentang di dalam loop, melewati cek:
untuk (uint i = 0; i < array.length;) {
acc += array[i] ;
Tidak dicentang { i ++; } // Saya bertambah tanpa pemeriksaan luapan -- lebih sedikit gas yang digunakan
}
Solidity 0.8.22 memperkenalkan optimasi pemeriksaan overflow yang secara otomatis menghasilkan kenaikan aritmatika yang tidak dicentang untuk penghitung loop. Pengoptimalan baru ini menghilangkan kebutuhan untuk menggunakan pola delta panjang yang tidak dicentang di badan loop seperti yang ada pada contoh sebelumnya.
Sebaliknya, pengoptimalan baru memungkinkan pengguna untuk kembali ke kode mentah yang lebih mudah dibaca tanpa mengorbankan efisiensi gas.
Kondisi yang tepat untuk pemeriksaan penghindaran tumpahan yang baru dioptimalkan adalah sebagai berikut:
Untuk memperjelas kondisi kedua, pertimbangkan cuplikan kode berikut:
untuk (uint8 i = 0; dalam < UINT16(1000); ++I) {
tubuh lingkaran
}
Dalam hal ini, i dikonversi ke uint16 sebelum perbandingan, dan kondisinya tidak pernah benar-benar salah, sehingga pemeriksaan luapan tambahan tidak dapat dihapus.
Juga, perhatikan bahwa < adalah satu-satunya operator perbandingan yang memicu pengoptimalan. Operator <= dan operator lain sengaja dikecualikan. Selain itu, operator harus built-in - < yang ditentukan pengguna tidak memenuhi syarat.
Pengoptimalannya mudah dan selalu bermanfaat, sehingga akan diaktifkan meskipun pengoptimal lainnya dinonaktifkan menggunakan pengaturan umum settings.optimizer.enabled. Anda dapat menonaktifkannya secara eksplisit dengan menyetel settings.optimizer.details.simpleCounterForLoopUncheckedIncrement ke false dalam input JSON standar. Itu tidak dapat dinonaktifkan menggunakan antarmuka baris perintah.
Sesuaikan pengoptimal Yul untuk meregenerasi nol literal
Versi baru dibangun di atas dukungan opcode PUSH0 yang diperkenalkan di versi 0.8.20 dengan menambahkan Rematerialiser[8] [9] Langkah pengoptimalan diperluas untuk selalu meregenerasi literal nol alih-alih menyimpannya sebagai referensi variabel, memungkinkan PUSH0 digunakan sebagai pengganti DUP untuk mengurangi biaya gas. Untuk memastikan bahwa ini dilakukan secara efektif, Rematerialiser dan UnusedPruner ditambahkan Langkah-langkah ditambahkan ke urutan pembersihan default pengoptimal Yul.
Tambahkan dukungan untuk mengimpor JSON perakitan EVM (eksperimental)
Rilis baru ini menambahkan dukungan eksperimental untuk mengimpor rakitan EVM, membuka kemungkinan bagi alat eksternal untuk melakukan pengoptimalan super sebelum pembuatan bytecode. Tujuan utama dari fitur ini adalah untuk menentukan format serialisasi untuk rakitan EVM tingkat rendah sehingga rakitan yang dihasilkan kompiler dapat diekspor, dimodifikasi, dan diimpor ulang, sehingga melanjutkan proses kompilasi normal.
Penting: Ini adalah fitur eksperimental dan saat ini tidak tersedia dalam produksi. Kami menawarkan fitur ini dalam rilis ini sehingga Anda dapat mencobanya dan memberikan umpan balik.
Memungkinkan peristiwa didefinisikan di tingkat file
Soliditas 0.8.22 memungkinkan Anda untuk menentukan peristiwa di tingkat file. Definisi acara sekarang dapat ditempatkan di luar ruang lingkup kontrak. Ini memberikan opsi lain untuk organisasi kode tanpa harus membungkus acara secara artifisial di pustaka.
Selain itu, rilis ini memperbaiki bug yang menyebabkan kesalahan saat membuat NatSpec saat memancarkan peristiwa yang ditentukan dalam kontrak atau antarmuka eksternal untuk kode. Dalam rilis sebelumnya (0.8.21), kompiler Solidity menambahkan dukungan untuk akses terbatas ke peristiwa yang didefinisikan dalam kontrak dan antarmuka yang tidak diwarisi dari kontrak saat ini, tetapi bug mencegah penggunaan penuh fitur tersebut.
Dengan perbaikan bug ini dan memungkinkan definisi peristiwa tingkat file, versi terbaru Solidity memungkinkan pengguna untuk mengkompilasi contoh berikut tanpa kesalahan:
antarmuka I {
acara ForeignEvent();
}
kontrak C {
acara ForeignEvent();
}
peristiwa E();
kontrak D {
fungsi f() publik {
Memancarkan peristiwa asing akan memicu kesalahan internal pada 0.8.21
memancarkan I.ForeignEvent();
memancarkan C.ForeignEvent();
Memancarkan peristiwa tingkat file. Fitur baru.
memancarkan E();
}
}
Catatan perubahan penuh
Fitur bahasa
Fitur kompiler
Perbaikan bug