10 Praktik Terbaik untuk Optimasi Gas dalam Smart Contract Ethereum

Menengah1/3/2025, 11:25:57 AM
Artikel ini menjelajahi masalah biaya Gas di jaringan utama Ethereum dan metode untuk optimasi. Ini berfokus pada mekanisme Gas dari EVM, konsep inti untuk mengoptimalkan biaya Gas, dan praktik terbaik untuk mengembangkan smart contract. Ini termasuk mengurangi penggunaan penyimpanan, pengemasan variabel, mengoptimalkan tipe data, dan menggunakan variabel berukuran tetap.

Dengan mengikuti praktik ini, pengembang dapat mengurangi konsumsi Gas dalam smart contract, mengurangi biaya transaksi, dan menciptakan aplikasi yang lebih efisien dan ramah pengguna.

Biaya gas di jaringan utama Ethereum selalu menjadi masalah utama, terutama selama periode kemacetan jaringan. Pada saat-saat sibuk, pengguna sering perlu membayar biaya transaksi yang sangat tinggi. Oleh karena itu, mengoptimalkan biaya Gas selama fase pengembangan kontrak pintar sangat penting. Optimasi Gas tidak hanya dapat secara efektif mengurangi biaya transaksi tetapi juga meningkatkan efisiensi transaksi, memberikan pengalaman blockchain yang lebih ekonomis dan efisien bagi pengguna.

Artikel ini akan menjelaskan mekanisme biaya Gas dari Mesin Virtual Ethereum (EVM), konsep inti yang terkait dengan optimasi biaya Gas, dan praktik terbaik untuk mengoptimalkan biaya Gas saat mengembangkan smart contract. Diharapkan konten ini akan menginspirasi dan membantu para pengembang, sambil juga membantu pengguna biasa untuk lebih memahami bagaimana sistem biaya Gas EVM bekerja, bersama-sama menangani tantangan dalam ekosistem blockchain.

Gambaran Mekanisme Biaya Gas EVM

Pada jaringan yang kompatibel dengan EVM, 'Gas' mengacu pada unit yang digunakan untuk mengukur kekuatan komputasi yang diperlukan untuk menjalankan operasi tertentu.

Diagram di bawah ini menggambarkan struktur EVM. Dalam diagram tersebut, konsumsi Gas dibagi menjadi tiga bagian: eksekusi operasi, panggilan pesan eksternal, dan baca/tulis memori dan penyimpanan.

Sumber: Situs Web Resmi Ethereum[1]

Sejak aktivasi EIP-1559 (London Hard Fork), biaya gas dihitung menggunakan rumus berikut:

Biaya gas = unit gas yang digunakan * (biaya dasar + biaya prioritas)

Biaya dasar dibakar, sedangkan biaya prioritas berfungsi sebagai insentif untuk mendorong validator untuk memasukkan transaksi di blockchain. Menetapkan biaya prioritas yang lebih tinggi saat mengirim transaksi meningkatkan kemungkinan transaksi dimasukkan dalam blok berikutnya. Ini mirip dengan "tip" yang dibayarkan oleh pengguna kepada validator.

1. Memahami Optimisasi Gas dalam EVM

Saat menyusun kontrak pintar dengan Solidity, kontrak diubah menjadi serangkaian "kode operasi," atau opcode.

Setiap opcode (seperti membuat kontrak, melakukan panggilan pesan, mengakses penyimpanan akun, dan menjalankan operasi pada mesin virtual) memiliki biaya konsumsi Gas yang terkait, yang didokumentasikan dalam Ethereum Yellow Paper[2].

Setelah beberapa modifikasi EIP, biaya Gas beberapa opcode telah disesuaikan, yang mungkin berbeda dari nilai dalam Kertas Kuning. Untuk informasi terperinci tentang biaya terbaru dari opcode, silakan lihat sumber ini [3].

2. Konsep Dasar Optimasi Gas

Konsep inti dari optimasi Gas adalah memprioritaskan operasi yang efisien biaya pada blockchain EVM dan menghindari operasi yang menimbulkan biaya Gas yang tinggi.

Di EVM, operasi berikut ini relatif murah biayanya:

  • [ ] Membaca dan menulis variabel memori
  • Membaca variabel konstan dan tidak dapat diubah
  • [ ] Membaca dan menulis variabel lokal
  • [ ] Membaca variabel calldata, seperti array calldata dan struktur
  • Panggilan fungsi internal

Operasi dengan biaya tinggi termasuk:

  • [ ] Membaca dan menulis variabel state yang disimpan dalam penyimpanan kontrak
  • [ ] Panggilan fungsi eksternal
  • [ ] Operasi Loop

Praktik Terbaik Optimisasi Biaya Gas EVM

Berdasarkan konsep dasar di atas, kami telah menyusun daftar praktik terbaik optimisasi biaya Gas untuk komunitas pengembang. Dengan mengikuti praktik ini, pengembang dapat mengurangi konsumsi Gas dari smart contract, menurunkan biaya transaksi, dan menciptakan aplikasi yang lebih efisien dan ramah pengguna.

1. Meminimalkan Penggunaan Penyimpanan

Dalam Solidity, Penyimpanan adalah sumber daya yang terbatas, dan konsumsi Gasnya jauh lebih tinggi daripada Memori. Setiap kali kontrak pintar membaca dari atau menulis ke penyimpanan, itu menimbulkan biaya Gas yang tinggi.

Menurut definisi dalam Ethereum Yellow Paper, biaya operasi penyimpanan lebih dari 100 kali lebih tinggi daripada operasi memori. Misalnya, opcode seperti sload dan sstore membutuhkan setidaknya 100 unit Gas dalam skenario terbaik, sedangkan operasi memori seperti mload dan mstore hanya mengonsumsi 3 unit Gas.

Metode untuk Membatasi Penggunaan Penyimpanan Termasuk:

  • [ ] Menyimpan data non-permanen di memori
  • [ ] Kurangi jumlah modifikasi penyimpanan: Dengan menyimpan hasil-hasil sementara dalam memori, dan hanya menugaskan hasil akhir ke variabel penyimpanan setelah semua perhitungan selesai dilakukan.

2. Penyusunan Variabel

Jumlah slot Penyimpanan yang digunakan dalam kontrak pintar dan bagaimana para pengembang menggambarkan data dapat berdampak signifikan pada konsumsi Gas.

Compiler Solidity mengemas variabel penyimpanan berturut-turut selama proses kompilasi, menggunakan slot penyimpanan 32 byte sebagai unit dasar untuk penyimpanan variabel. Pengemasan variabel mengacu pada praktik menyusun variabel dengan cara yang memungkinkan beberapa variabel masuk ke dalam satu slot penyimpanan tunggal.

Di sebelah kiri adalah implementasi yang kurang efisien yang mengonsumsi 3 slot penyimpanan; di sebelah kanan adalah implementasi yang lebih efisien.

Dengan melakukan penyesuaian ini, pengembang dapat menghemat 20.000 unit Gas (karena menyimpan slot penyimpanan yang tidak digunakan membutuhkan 20.000 Gas), tetapi sekarang hanya diperlukan dua slot penyimpanan.

Karena setiap slot penyimpanan mengonsumsi Gas, pengemasan variabel mengoptimalkan penggunaan Gas dengan mengurangi jumlah slot penyimpanan yang diperlukan.

3. Mengoptimalkan Tipe Data

Sebuah variabel dapat direpresentasikan menggunakan berbagai jenis data, tetapi biaya operasi bervariasi tergantung pada jenisnya. Memilih jenis data yang sesuai membantu mengoptimalkan penggunaan Gas.

Sebagai contoh, dalam Solidity, bilangan bulat dapat dibagi menjadi ukuran yang berbeda: uint8, uint16, uint32, dll. Karena EVM beroperasi dalam unit 256-bit, menggunakan uint8 berarti EVM harus mengonversinya terlebih dahulu ke uint256, dan konversi ini menimbulkan biaya Gas tambahan.

Kita dapat membandingkan biaya Gas uint8 dan uint256 menggunakan kode dalam diagram. Fungsi UseUint() menggunakan 120.382 unit Gas, sedangkan fungsi UseUInt8() menggunakan 166.111 unit Gas.

Secara mandiri, menggunakan uint256 lebih murah daripada uint8. Namun, jika kita menerapkan optimisasi pengemasan variabel yang disarankan sebelumnya, itu membuat perbedaan. Jika pengembang dapat mengemas empat variabel uint8 ke dalam satu slot penyimpanan, biaya total untuk mengulanginya akan lebih rendah daripada menggunakan empat variabel uint256. Dalam kasus ini, smart contract dapat membaca dan menulis slot penyimpanan sekali, dan memuat semua empat variabel uint8 ke dalam memori/penyimpanan dalam satu operasi.

4. Gunakan Variabel Berukuran Tetap Sebagai Pengganti Variabel Dinamis

Jika data dapat dibatasi hingga 32 byte, disarankan untuk menggunakan tipe data bytes32 daripada bytes atau strings. Secara umum, variabel dengan ukuran tetap mengkonsumsi Gas lebih sedikit daripada variabel dengan ukuran dinamis. Jika panjang byte dapat dibatasi, cobalah memilih panjang terkecil dari bytes1 hingga bytes32.

5. Pemetaan vs. Array

Dalam Solidity, daftar data dapat diwakili menggunakan dua jenis data: Array dan Mapping, masing-masing memiliki sintaks dan struktur yang berbeda.

Pemetaan umumnya lebih efisien dan hemat biaya dalam kebanyakan kasus, sementara array dapat diulang dan mendukung pengemasan jenis data. Oleh karena itu, disarankan untuk memprioritaskan menggunakan pemetaan saat mengelola daftar data, kecuali jika iterasi diperlukan atau konsumsi Gas dapat dioptimalkan melalui pengemasan jenis data.

6. Gunakan calldata daripada Memory

Variabel yang dideklarasikan dalam parameter fungsi dapat disimpan di calldata atau memori. Perbedaan utamanya adalah bahwa memori dapat dimodifikasi oleh fungsi, sedangkan calldata bersifat immutable.

Ingat prinsip ini: jika parameter fungsi hanya dibaca, lebih baik gunakan calldata daripada memory. Ini menghindari operasi salinan yang tidak perlu dari calldata fungsi ke memory.

Contoh 1: Menggunakan memori

Ketika menggunakan kata kunci memory, nilai-nilai array disalin dari calldata terenkripsi ke memori selama dekoding ABI. Biaya eksekusi dari blok kode ini adalah 3.694 unit Gas.

Contoh 2: Menggunakan calldata

Ketika membaca nilai langsung dari calldata, operasi memori perantara dilewati. Optimasi ini mengurangi biaya eksekusi menjadi hanya 2.413 unit Gas, menghasilkan peningkatan efisiensi Gas sebesar 35%.

7. Gunakan Kata Kunci Konstan/Imut jika Memungkinkan

Variabel Konstan/Imut tidak disimpan di penyimpanan kontrak. Variabel ini dihitung pada waktu kompilasi dan disimpan di bytecode kontrak. Oleh karena itu, biaya aksesnya jauh lebih rendah dibandingkan dengan variabel penyimpanan. Disarankan untuk menggunakan kata kunci Konstan atau Imut kapan pun memungkinkan.

8. Gunakan Unchecked Ketika Overflow/Underflow Tidak Menjadi Masalah

Ketika pengembang dapat yakin bahwa operasi aritmatika tidak akan menghasilkan overflow atau underflow, mereka dapat menggunakan kata kunci unchecked yang diperkenalkan dalam Solidity v0.8.0 untuk menghindari pemeriksaan overflow atau underflow yang tidak perlu, sehingga menghemat biaya Gas.

Dalam diagram di bawah ini, kondisi terbatas i

Selain itu, versi compiler 0.8.0 ke atas tidak lagi memerlukan penggunaan pustaka SafeMath, karena compiler itu sendiri sekarang sudah termasuk perlindungan overflow dan underflow bawaan.

9. Memperbaiki modifikator

Kode pengubah disematkan ke dalam fungsi yang mereka modifikasi. Setiap kali pengubah digunakan, kode nya diduplikasi, yang meningkatkan ukuran bytecode dan meningkatkan konsumsi Gas. Berikut adalah salah satu cara untuk mengoptimalkan biaya Gas dari pengubah:

Sebelum optimasi:

Setelah optimisasi:

Dalam contoh ini, dengan memperbaiki logika ke dalam fungsi internal _checkOwner(), yang dapat digunakan kembali dalam modifier, ukuran bytecode dikurangi dan biaya Gas lebih rendah.

10. Optimisasi Short-Circuit

Untuk operator || (OR) dan && (AND), operasi logika dievaluasi dengan short-circuiting, yang berarti jika kondisi pertama sudah cukup untuk menentukan hasil dari ekspresi logika, maka kondisi kedua tidak akan dievaluasi.

Untuk mengoptimalkan konsumsi Gas, kondisi dengan biaya komputasi yang lebih rendah harus ditempatkan terlebih dahulu, sehingga perhitungan yang mahal dapat dihindari.

Rekomendasi Umum

1. Hapus Kode yang Tidak Digunakan

Jika ada fungsi atau variabel yang tidak terpakai dalam kontrak, disarankan untuk menghapusnya. Ini adalah cara paling langsung untuk mengurangi biaya penyebaran kontrak dan menjaga ukuran kontrak tetap kecil.

Berikut adalah beberapa saran praktis:

Gunakan algoritma yang paling efisien untuk perhitungan. Jika kontrak secara langsung menggunakan hasil perhitungan tertentu, perhitungan yang berlebihan harus dihapus. Pada dasarnya, semua perhitungan yang tidak digunakan harus dihapus. Di Ethereum, pengembang dapat menerima imbalan Gas dengan melepaskan ruang penyimpanan. Jika sebuah variabel tidak lagi diperlukan, itu harus dihapus menggunakan kata kunci delete atau diatur ke nilai defaultnya.

Optimisasi Loop: Hindari operasi loop yang mahal, coba gabungkan loop, dan pindahkan perhitungan berulang keluar dari tubuh loop.

2. Gunakan Kontrak Terkompilasi

Kontrak yang telah diproses menyediakan fungsi perpustakaan kompleks seperti kriptografi dan operasi hash. Karena kode tidak dijalankan pada EVM tetapi berjalan secara lokal pada node klien, lebih sedikit Gas diperlukan. Menggunakan kontrak yang telah diproses dapat menghemat Gas dengan mengurangi beban komputasi yang diperlukan untuk mengeksekusi smart contract.

Contoh kontrak yang telah dikompilasi termasuk Algoritma Tanda Tangan Digital Kurva Eliptik (ECDSA) dan algoritma penghashingan SHA2-256. Dengan menggunakan kontrak yang telah dikompilasi ini dalam smart contract, pengembang dapat mengurangi biaya Gas dan meningkatkan efisiensi aplikasi.

Untuk daftar lengkap kontrak yang telah diprecompile dan didukung oleh jaringan Ethereum, silakan lihat tautan ini [4].

3. Gunakan Perakitan Inline

Inline assembly memungkinkan pengembang untuk menulis kode rendah-level namun efisien yang dapat dieksekusi langsung oleh EVM, tanpa menggunakan opcode Solidity yang mahal. Inline assembly juga memungkinkan kontrol yang lebih presisi terhadap penggunaan memori dan penyimpanan, yang lebih lanjut mengurangi biaya Gas. Selain itu, inline assembly dapat melakukan beberapa operasi kompleks yang sulit diimplementasikan dengan Solidity saja, menawarkan fleksibilitas lebih untuk mengoptimalkan konsumsi Gas.

Berikut ini adalah contoh penggunaan perakitan inline untuk menghemat Gas:

Seperti yang terlihat pada contoh di atas, kasus kedua, yang menggunakan perakitan inline, memiliki efisiensi Gas yang lebih tinggi dibandingkan dengan kasus standar.

Namun, menggunakan perakitan inline juga dapat menimbulkan risiko dan rentan terhadap kesalahan. Oleh karena itu, penggunaannya harus dengan hati-hati dan hanya direkomendasikan untuk pengembang berpengalaman.

4. Gunakan Solusi Layer 2

Solusi Lapisan 2 dapat mengurangi jumlah data yang perlu disimpan dan dihitung pada Ethereum mainnet.

Solusi Layer 2 seperti rollups, sidechains, dan saluran keadaan mengalihkan pemrosesan transaksi dari rantai Ethereum utama, memungkinkan transaksi yang lebih cepat dan lebih murah.

Dengan menggabungkan sejumlah besar transaksi bersama-sama, solusi-solusi ini mengurangi jumlah transaksi on-chain, yang pada gilirannya menurunkan biaya Gas. Menggunakan solusi Layer 2 juga meningkatkan skalabilitas Ethereum, memungkinkan lebih banyak pengguna dan aplikasi untuk berpartisipasi dalam jaringan tanpa menyebabkan kemacetan akibat kelebihan beban.

5. Gunakan Alat dan Perpustakaan Optimisasi

Terdapat beberapa alat optimisasi yang tersedia, seperti pengoptimasi solc, pengoptimasi build Truffle, dan compiler Solidity Remix.

Alat-alat ini dapat membantu mengurangi ukuran bytecode, menghapus kode yang tidak digunakan, dan mengurangi jumlah operasi yang diperlukan untuk mengeksekusi kontrak pintar. Digabungkan dengan perpustakaan optimisasi Gas lainnya seperti “solmate,” pengembang dapat secara efektif menurunkan biaya Gas dan meningkatkan efisiensi kontrak pintar.

Kesimpulan

Mengoptimalkan konsumsi gas adalah langkah penting bagi para pengembang, karena hal ini tidak hanya meminimalkan biaya transaksi tetapi juga meningkatkan efisiensi smart contract pada jaringan yang kompatibel dengan EVM. Dengan memprioritaskan operasi penghematan biaya, mengurangi penggunaan penyimpanan, memanfaatkan perakitan inline, dan mengikuti praktik terbaik lainnya yang dibahas dalam artikel ini, para pengembang dapat secara efektif menurunkan konsumsi Gas dari kontrak-kontrak.

Namun, penting untuk dicatat bahwa selama proses optimisasi, pengembang harus berhati-hati untuk menghindari memperkenalkan kerentanan keamanan. Dalam proses mengoptimalkan kode dan mengurangi konsumsi gas, keamanan bawaan dari smart contract tidak boleh dikompromikan.

[1] https://ethereum.org/id/developers/docs/gas/
[2]https://ethereum.github.io/yellowpaper/paper.pdf
[3]https://www.evm.codes/
[4]https://www.evm.codes/precompiled

Penyangkalan:

  1. Artikel ini direproduksi dari [.PANewslab]. Hak cipta dimiliki oleh penulis asli [ CertiK]. Jika Anda memiliki keberatan terhadap pencetakan ulang, harap hubungi Pintu Belajartim, tim akan menanganinya secepat mungkin sesuai dengan prosedur yang relevan.
  2. Penyangkalan: Pandangan dan pendapat yang tertera dalam artikel ini hanya mewakili pandangan pribadi penulis dan tidak menjadi saran investasi apa pun.
  3. Versi bahasa lain dari artikel diterjemahkan oleh tim Belajar gate. Kecuali dinyatakan lain, artikel yang diterjemahkan mungkin tidak boleh disalin, didistribusikan, atau diplagiatkan.

10 Praktik Terbaik untuk Optimasi Gas dalam Smart Contract Ethereum

Menengah1/3/2025, 11:25:57 AM
Artikel ini menjelajahi masalah biaya Gas di jaringan utama Ethereum dan metode untuk optimasi. Ini berfokus pada mekanisme Gas dari EVM, konsep inti untuk mengoptimalkan biaya Gas, dan praktik terbaik untuk mengembangkan smart contract. Ini termasuk mengurangi penggunaan penyimpanan, pengemasan variabel, mengoptimalkan tipe data, dan menggunakan variabel berukuran tetap.

Dengan mengikuti praktik ini, pengembang dapat mengurangi konsumsi Gas dalam smart contract, mengurangi biaya transaksi, dan menciptakan aplikasi yang lebih efisien dan ramah pengguna.

Biaya gas di jaringan utama Ethereum selalu menjadi masalah utama, terutama selama periode kemacetan jaringan. Pada saat-saat sibuk, pengguna sering perlu membayar biaya transaksi yang sangat tinggi. Oleh karena itu, mengoptimalkan biaya Gas selama fase pengembangan kontrak pintar sangat penting. Optimasi Gas tidak hanya dapat secara efektif mengurangi biaya transaksi tetapi juga meningkatkan efisiensi transaksi, memberikan pengalaman blockchain yang lebih ekonomis dan efisien bagi pengguna.

Artikel ini akan menjelaskan mekanisme biaya Gas dari Mesin Virtual Ethereum (EVM), konsep inti yang terkait dengan optimasi biaya Gas, dan praktik terbaik untuk mengoptimalkan biaya Gas saat mengembangkan smart contract. Diharapkan konten ini akan menginspirasi dan membantu para pengembang, sambil juga membantu pengguna biasa untuk lebih memahami bagaimana sistem biaya Gas EVM bekerja, bersama-sama menangani tantangan dalam ekosistem blockchain.

Gambaran Mekanisme Biaya Gas EVM

Pada jaringan yang kompatibel dengan EVM, 'Gas' mengacu pada unit yang digunakan untuk mengukur kekuatan komputasi yang diperlukan untuk menjalankan operasi tertentu.

Diagram di bawah ini menggambarkan struktur EVM. Dalam diagram tersebut, konsumsi Gas dibagi menjadi tiga bagian: eksekusi operasi, panggilan pesan eksternal, dan baca/tulis memori dan penyimpanan.

Sumber: Situs Web Resmi Ethereum[1]

Sejak aktivasi EIP-1559 (London Hard Fork), biaya gas dihitung menggunakan rumus berikut:

Biaya gas = unit gas yang digunakan * (biaya dasar + biaya prioritas)

Biaya dasar dibakar, sedangkan biaya prioritas berfungsi sebagai insentif untuk mendorong validator untuk memasukkan transaksi di blockchain. Menetapkan biaya prioritas yang lebih tinggi saat mengirim transaksi meningkatkan kemungkinan transaksi dimasukkan dalam blok berikutnya. Ini mirip dengan "tip" yang dibayarkan oleh pengguna kepada validator.

1. Memahami Optimisasi Gas dalam EVM

Saat menyusun kontrak pintar dengan Solidity, kontrak diubah menjadi serangkaian "kode operasi," atau opcode.

Setiap opcode (seperti membuat kontrak, melakukan panggilan pesan, mengakses penyimpanan akun, dan menjalankan operasi pada mesin virtual) memiliki biaya konsumsi Gas yang terkait, yang didokumentasikan dalam Ethereum Yellow Paper[2].

Setelah beberapa modifikasi EIP, biaya Gas beberapa opcode telah disesuaikan, yang mungkin berbeda dari nilai dalam Kertas Kuning. Untuk informasi terperinci tentang biaya terbaru dari opcode, silakan lihat sumber ini [3].

2. Konsep Dasar Optimasi Gas

Konsep inti dari optimasi Gas adalah memprioritaskan operasi yang efisien biaya pada blockchain EVM dan menghindari operasi yang menimbulkan biaya Gas yang tinggi.

Di EVM, operasi berikut ini relatif murah biayanya:

  • [ ] Membaca dan menulis variabel memori
  • Membaca variabel konstan dan tidak dapat diubah
  • [ ] Membaca dan menulis variabel lokal
  • [ ] Membaca variabel calldata, seperti array calldata dan struktur
  • Panggilan fungsi internal

Operasi dengan biaya tinggi termasuk:

  • [ ] Membaca dan menulis variabel state yang disimpan dalam penyimpanan kontrak
  • [ ] Panggilan fungsi eksternal
  • [ ] Operasi Loop

Praktik Terbaik Optimisasi Biaya Gas EVM

Berdasarkan konsep dasar di atas, kami telah menyusun daftar praktik terbaik optimisasi biaya Gas untuk komunitas pengembang. Dengan mengikuti praktik ini, pengembang dapat mengurangi konsumsi Gas dari smart contract, menurunkan biaya transaksi, dan menciptakan aplikasi yang lebih efisien dan ramah pengguna.

1. Meminimalkan Penggunaan Penyimpanan

Dalam Solidity, Penyimpanan adalah sumber daya yang terbatas, dan konsumsi Gasnya jauh lebih tinggi daripada Memori. Setiap kali kontrak pintar membaca dari atau menulis ke penyimpanan, itu menimbulkan biaya Gas yang tinggi.

Menurut definisi dalam Ethereum Yellow Paper, biaya operasi penyimpanan lebih dari 100 kali lebih tinggi daripada operasi memori. Misalnya, opcode seperti sload dan sstore membutuhkan setidaknya 100 unit Gas dalam skenario terbaik, sedangkan operasi memori seperti mload dan mstore hanya mengonsumsi 3 unit Gas.

Metode untuk Membatasi Penggunaan Penyimpanan Termasuk:

  • [ ] Menyimpan data non-permanen di memori
  • [ ] Kurangi jumlah modifikasi penyimpanan: Dengan menyimpan hasil-hasil sementara dalam memori, dan hanya menugaskan hasil akhir ke variabel penyimpanan setelah semua perhitungan selesai dilakukan.

2. Penyusunan Variabel

Jumlah slot Penyimpanan yang digunakan dalam kontrak pintar dan bagaimana para pengembang menggambarkan data dapat berdampak signifikan pada konsumsi Gas.

Compiler Solidity mengemas variabel penyimpanan berturut-turut selama proses kompilasi, menggunakan slot penyimpanan 32 byte sebagai unit dasar untuk penyimpanan variabel. Pengemasan variabel mengacu pada praktik menyusun variabel dengan cara yang memungkinkan beberapa variabel masuk ke dalam satu slot penyimpanan tunggal.

Di sebelah kiri adalah implementasi yang kurang efisien yang mengonsumsi 3 slot penyimpanan; di sebelah kanan adalah implementasi yang lebih efisien.

Dengan melakukan penyesuaian ini, pengembang dapat menghemat 20.000 unit Gas (karena menyimpan slot penyimpanan yang tidak digunakan membutuhkan 20.000 Gas), tetapi sekarang hanya diperlukan dua slot penyimpanan.

Karena setiap slot penyimpanan mengonsumsi Gas, pengemasan variabel mengoptimalkan penggunaan Gas dengan mengurangi jumlah slot penyimpanan yang diperlukan.

3. Mengoptimalkan Tipe Data

Sebuah variabel dapat direpresentasikan menggunakan berbagai jenis data, tetapi biaya operasi bervariasi tergantung pada jenisnya. Memilih jenis data yang sesuai membantu mengoptimalkan penggunaan Gas.

Sebagai contoh, dalam Solidity, bilangan bulat dapat dibagi menjadi ukuran yang berbeda: uint8, uint16, uint32, dll. Karena EVM beroperasi dalam unit 256-bit, menggunakan uint8 berarti EVM harus mengonversinya terlebih dahulu ke uint256, dan konversi ini menimbulkan biaya Gas tambahan.

Kita dapat membandingkan biaya Gas uint8 dan uint256 menggunakan kode dalam diagram. Fungsi UseUint() menggunakan 120.382 unit Gas, sedangkan fungsi UseUInt8() menggunakan 166.111 unit Gas.

Secara mandiri, menggunakan uint256 lebih murah daripada uint8. Namun, jika kita menerapkan optimisasi pengemasan variabel yang disarankan sebelumnya, itu membuat perbedaan. Jika pengembang dapat mengemas empat variabel uint8 ke dalam satu slot penyimpanan, biaya total untuk mengulanginya akan lebih rendah daripada menggunakan empat variabel uint256. Dalam kasus ini, smart contract dapat membaca dan menulis slot penyimpanan sekali, dan memuat semua empat variabel uint8 ke dalam memori/penyimpanan dalam satu operasi.

4. Gunakan Variabel Berukuran Tetap Sebagai Pengganti Variabel Dinamis

Jika data dapat dibatasi hingga 32 byte, disarankan untuk menggunakan tipe data bytes32 daripada bytes atau strings. Secara umum, variabel dengan ukuran tetap mengkonsumsi Gas lebih sedikit daripada variabel dengan ukuran dinamis. Jika panjang byte dapat dibatasi, cobalah memilih panjang terkecil dari bytes1 hingga bytes32.

5. Pemetaan vs. Array

Dalam Solidity, daftar data dapat diwakili menggunakan dua jenis data: Array dan Mapping, masing-masing memiliki sintaks dan struktur yang berbeda.

Pemetaan umumnya lebih efisien dan hemat biaya dalam kebanyakan kasus, sementara array dapat diulang dan mendukung pengemasan jenis data. Oleh karena itu, disarankan untuk memprioritaskan menggunakan pemetaan saat mengelola daftar data, kecuali jika iterasi diperlukan atau konsumsi Gas dapat dioptimalkan melalui pengemasan jenis data.

6. Gunakan calldata daripada Memory

Variabel yang dideklarasikan dalam parameter fungsi dapat disimpan di calldata atau memori. Perbedaan utamanya adalah bahwa memori dapat dimodifikasi oleh fungsi, sedangkan calldata bersifat immutable.

Ingat prinsip ini: jika parameter fungsi hanya dibaca, lebih baik gunakan calldata daripada memory. Ini menghindari operasi salinan yang tidak perlu dari calldata fungsi ke memory.

Contoh 1: Menggunakan memori

Ketika menggunakan kata kunci memory, nilai-nilai array disalin dari calldata terenkripsi ke memori selama dekoding ABI. Biaya eksekusi dari blok kode ini adalah 3.694 unit Gas.

Contoh 2: Menggunakan calldata

Ketika membaca nilai langsung dari calldata, operasi memori perantara dilewati. Optimasi ini mengurangi biaya eksekusi menjadi hanya 2.413 unit Gas, menghasilkan peningkatan efisiensi Gas sebesar 35%.

7. Gunakan Kata Kunci Konstan/Imut jika Memungkinkan

Variabel Konstan/Imut tidak disimpan di penyimpanan kontrak. Variabel ini dihitung pada waktu kompilasi dan disimpan di bytecode kontrak. Oleh karena itu, biaya aksesnya jauh lebih rendah dibandingkan dengan variabel penyimpanan. Disarankan untuk menggunakan kata kunci Konstan atau Imut kapan pun memungkinkan.

8. Gunakan Unchecked Ketika Overflow/Underflow Tidak Menjadi Masalah

Ketika pengembang dapat yakin bahwa operasi aritmatika tidak akan menghasilkan overflow atau underflow, mereka dapat menggunakan kata kunci unchecked yang diperkenalkan dalam Solidity v0.8.0 untuk menghindari pemeriksaan overflow atau underflow yang tidak perlu, sehingga menghemat biaya Gas.

Dalam diagram di bawah ini, kondisi terbatas i

Selain itu, versi compiler 0.8.0 ke atas tidak lagi memerlukan penggunaan pustaka SafeMath, karena compiler itu sendiri sekarang sudah termasuk perlindungan overflow dan underflow bawaan.

9. Memperbaiki modifikator

Kode pengubah disematkan ke dalam fungsi yang mereka modifikasi. Setiap kali pengubah digunakan, kode nya diduplikasi, yang meningkatkan ukuran bytecode dan meningkatkan konsumsi Gas. Berikut adalah salah satu cara untuk mengoptimalkan biaya Gas dari pengubah:

Sebelum optimasi:

Setelah optimisasi:

Dalam contoh ini, dengan memperbaiki logika ke dalam fungsi internal _checkOwner(), yang dapat digunakan kembali dalam modifier, ukuran bytecode dikurangi dan biaya Gas lebih rendah.

10. Optimisasi Short-Circuit

Untuk operator || (OR) dan && (AND), operasi logika dievaluasi dengan short-circuiting, yang berarti jika kondisi pertama sudah cukup untuk menentukan hasil dari ekspresi logika, maka kondisi kedua tidak akan dievaluasi.

Untuk mengoptimalkan konsumsi Gas, kondisi dengan biaya komputasi yang lebih rendah harus ditempatkan terlebih dahulu, sehingga perhitungan yang mahal dapat dihindari.

Rekomendasi Umum

1. Hapus Kode yang Tidak Digunakan

Jika ada fungsi atau variabel yang tidak terpakai dalam kontrak, disarankan untuk menghapusnya. Ini adalah cara paling langsung untuk mengurangi biaya penyebaran kontrak dan menjaga ukuran kontrak tetap kecil.

Berikut adalah beberapa saran praktis:

Gunakan algoritma yang paling efisien untuk perhitungan. Jika kontrak secara langsung menggunakan hasil perhitungan tertentu, perhitungan yang berlebihan harus dihapus. Pada dasarnya, semua perhitungan yang tidak digunakan harus dihapus. Di Ethereum, pengembang dapat menerima imbalan Gas dengan melepaskan ruang penyimpanan. Jika sebuah variabel tidak lagi diperlukan, itu harus dihapus menggunakan kata kunci delete atau diatur ke nilai defaultnya.

Optimisasi Loop: Hindari operasi loop yang mahal, coba gabungkan loop, dan pindahkan perhitungan berulang keluar dari tubuh loop.

2. Gunakan Kontrak Terkompilasi

Kontrak yang telah diproses menyediakan fungsi perpustakaan kompleks seperti kriptografi dan operasi hash. Karena kode tidak dijalankan pada EVM tetapi berjalan secara lokal pada node klien, lebih sedikit Gas diperlukan. Menggunakan kontrak yang telah diproses dapat menghemat Gas dengan mengurangi beban komputasi yang diperlukan untuk mengeksekusi smart contract.

Contoh kontrak yang telah dikompilasi termasuk Algoritma Tanda Tangan Digital Kurva Eliptik (ECDSA) dan algoritma penghashingan SHA2-256. Dengan menggunakan kontrak yang telah dikompilasi ini dalam smart contract, pengembang dapat mengurangi biaya Gas dan meningkatkan efisiensi aplikasi.

Untuk daftar lengkap kontrak yang telah diprecompile dan didukung oleh jaringan Ethereum, silakan lihat tautan ini [4].

3. Gunakan Perakitan Inline

Inline assembly memungkinkan pengembang untuk menulis kode rendah-level namun efisien yang dapat dieksekusi langsung oleh EVM, tanpa menggunakan opcode Solidity yang mahal. Inline assembly juga memungkinkan kontrol yang lebih presisi terhadap penggunaan memori dan penyimpanan, yang lebih lanjut mengurangi biaya Gas. Selain itu, inline assembly dapat melakukan beberapa operasi kompleks yang sulit diimplementasikan dengan Solidity saja, menawarkan fleksibilitas lebih untuk mengoptimalkan konsumsi Gas.

Berikut ini adalah contoh penggunaan perakitan inline untuk menghemat Gas:

Seperti yang terlihat pada contoh di atas, kasus kedua, yang menggunakan perakitan inline, memiliki efisiensi Gas yang lebih tinggi dibandingkan dengan kasus standar.

Namun, menggunakan perakitan inline juga dapat menimbulkan risiko dan rentan terhadap kesalahan. Oleh karena itu, penggunaannya harus dengan hati-hati dan hanya direkomendasikan untuk pengembang berpengalaman.

4. Gunakan Solusi Layer 2

Solusi Lapisan 2 dapat mengurangi jumlah data yang perlu disimpan dan dihitung pada Ethereum mainnet.

Solusi Layer 2 seperti rollups, sidechains, dan saluran keadaan mengalihkan pemrosesan transaksi dari rantai Ethereum utama, memungkinkan transaksi yang lebih cepat dan lebih murah.

Dengan menggabungkan sejumlah besar transaksi bersama-sama, solusi-solusi ini mengurangi jumlah transaksi on-chain, yang pada gilirannya menurunkan biaya Gas. Menggunakan solusi Layer 2 juga meningkatkan skalabilitas Ethereum, memungkinkan lebih banyak pengguna dan aplikasi untuk berpartisipasi dalam jaringan tanpa menyebabkan kemacetan akibat kelebihan beban.

5. Gunakan Alat dan Perpustakaan Optimisasi

Terdapat beberapa alat optimisasi yang tersedia, seperti pengoptimasi solc, pengoptimasi build Truffle, dan compiler Solidity Remix.

Alat-alat ini dapat membantu mengurangi ukuran bytecode, menghapus kode yang tidak digunakan, dan mengurangi jumlah operasi yang diperlukan untuk mengeksekusi kontrak pintar. Digabungkan dengan perpustakaan optimisasi Gas lainnya seperti “solmate,” pengembang dapat secara efektif menurunkan biaya Gas dan meningkatkan efisiensi kontrak pintar.

Kesimpulan

Mengoptimalkan konsumsi gas adalah langkah penting bagi para pengembang, karena hal ini tidak hanya meminimalkan biaya transaksi tetapi juga meningkatkan efisiensi smart contract pada jaringan yang kompatibel dengan EVM. Dengan memprioritaskan operasi penghematan biaya, mengurangi penggunaan penyimpanan, memanfaatkan perakitan inline, dan mengikuti praktik terbaik lainnya yang dibahas dalam artikel ini, para pengembang dapat secara efektif menurunkan konsumsi Gas dari kontrak-kontrak.

Namun, penting untuk dicatat bahwa selama proses optimisasi, pengembang harus berhati-hati untuk menghindari memperkenalkan kerentanan keamanan. Dalam proses mengoptimalkan kode dan mengurangi konsumsi gas, keamanan bawaan dari smart contract tidak boleh dikompromikan.

[1] https://ethereum.org/id/developers/docs/gas/
[2]https://ethereum.github.io/yellowpaper/paper.pdf
[3]https://www.evm.codes/
[4]https://www.evm.codes/precompiled

Penyangkalan:

  1. Artikel ini direproduksi dari [.PANewslab]. Hak cipta dimiliki oleh penulis asli [ CertiK]. Jika Anda memiliki keberatan terhadap pencetakan ulang, harap hubungi Pintu Belajartim, tim akan menanganinya secepat mungkin sesuai dengan prosedur yang relevan.
  2. Penyangkalan: Pandangan dan pendapat yang tertera dalam artikel ini hanya mewakili pandangan pribadi penulis dan tidak menjadi saran investasi apa pun.
  3. Versi bahasa lain dari artikel diterjemahkan oleh tim Belajar gate. Kecuali dinyatakan lain, artikel yang diterjemahkan mungkin tidak boleh disalin, didistribusikan, atau diplagiatkan.
Mulai Sekarang
Daftar dan dapatkan Voucher
$100
!