Panduan Lengkap Optimasi Gas Smart Contract Ethereum untuk Menurunkan Biaya Transaksi dan Meningkatkan Efisiensi

Panduan Praktik Optimasi Gas untuk Smart Contract Ethereum

Biaya Gas di jaringan utama Ethereum selalu menjadi masalah yang sulit, terutama saat jaringan mengalami kemacetan. Pada saat puncak, pengguna sering kali harus membayar biaya transaksi yang tinggi. Oleh karena itu, mengoptimalkan biaya Gas selama tahap pengembangan smart contract sangat penting. Mengoptimalkan konsumsi Gas tidak hanya dapat secara efektif menurunkan biaya transaksi, tetapi juga dapat meningkatkan efisiensi transaksi, memberikan pengalaman penggunaan blockchain yang lebih ekonomis dan efisien bagi pengguna.

Artikel ini akan membahas mekanisme biaya Gas dari Ethereum Virtual Machine (EVM), konsep inti terkait optimasi biaya Gas, serta praktik terbaik untuk mengoptimalkan biaya Gas saat mengembangkan smart contract. Diharapkan konten ini dapat memberikan inspirasi dan bantuan praktis kepada para pengembang, sekaligus membantu pengguna biasa untuk lebih memahami cara kerja biaya Gas EVM, bersama-sama menghadapi tantangan dalam ekosistem blockchain.

Gas optimization terbaik untuk smart contract Ethereum

Pengantar Mekanisme Biaya Gas EVM

Di jaringan yang kompatibel dengan EVM, "Gas" adalah unit yang digunakan untuk mengukur daya komputasi yang diperlukan untuk mengeksekusi operasi tertentu.

Dalam struktur tata letak EVM, konsumsi Gas dibagi menjadi tiga bagian: eksekusi operasi, pemanggilan pesan eksternal, serta pembacaan dan penulisan memori dan penyimpanan.

Karena setiap eksekusi transaksi memerlukan sumber daya komputasi, maka akan dikenakan biaya tertentu untuk mencegah perulangan tak terbatas dan serangan penolakan layanan (DoS). Biaya yang diperlukan untuk menyelesaikan sebuah transaksi disebut sebagai "Gas fee".

Sejak penerapan hard fork London EIP-1559(), biaya Gas dihitung dengan rumus berikut:

Biaya Gas = Jumlah Gas yang Digunakan * ( Biaya Dasar + Biaya Prioritas )

Biaya dasar akan dihancurkan, sementara biaya prioritas akan digunakan sebagai insentif untuk mendorong validator menambahkan transaksi ke dalam blockchain. Mengatur biaya prioritas yang lebih tinggi saat mengirim transaksi dapat meningkatkan kemungkinan transaksi tersebut dimasukkan ke dalam blok berikutnya. Ini mirip dengan "tip" yang dibayarkan pengguna kepada validator.

memahami optimasi Gas dalam EVM

Ketika mengompilasi smart contract dengan Solidity, kontrak akan diubah menjadi serangkaian "opcode", yaitu opcodes.

Setiap segmen opcode ( seperti membuat kontrak, melakukan panggilan pesan, mengakses penyimpanan akun, dan mengeksekusi operasi di mesin virtual ) memiliki biaya konsumsi Gas yang diakui, biaya ini dicatat dalam buku kuning Ethereum.

Setelah beberapa kali modifikasi EIP, beberapa biaya Gas dari opcode telah disesuaikan, mungkin berbeda dari yang ada di buku kuning.

Konsep dasar optimasi Gas

Inti dari optimasi Gas adalah memilih operasi yang efisien dalam biaya di blockchain EVM, menghindari operasi yang mahal dalam biaya Gas.

Dalam EVM, operasi berikut memiliki biaya yang lebih rendah:

  • Membaca dan menulis variabel memori
  • Membaca konstanta dan variabel yang tidak dapat diubah
  • Membaca dan menulis variabel lokal
  • Membaca variabel calldata, seperti array dan struktur calldata
  • Panggilan fungsi internal

Operasi dengan biaya lebih tinggi termasuk:

  • Membaca dan menulis variabel status yang disimpan dalam penyimpanan kontrak
  • Panggilan fungsi eksternal
  • Operasi berulang

Gas optimization terbaik untuk smart contract Ethereum

Praktik Terbaik untuk Mengoptimalkan Biaya Gas EVM

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

1. Usahakan untuk mengurangi penggunaan penyimpanan

Dalam Solidity, Storage( adalah sumber daya yang terbatas, dengan konsumsi Gas yang jauh lebih tinggi dibandingkan Memory). Setiap kali smart contract membaca atau menulis data dari penyimpanan, akan ada biaya Gas yang tinggi.

Menurut definisi buku kuning Ethereum, biaya operasi penyimpanan lebih dari 100 kali biaya operasi memori. Misalnya, instruksi OPcodesmload dan mstore hanya menghabiskan 3 unit Gas, sedangkan operasi penyimpanan seperti sload dan sstore bahkan dalam situasi paling ideal, biayanya setidaknya memerlukan 100 unit.

Metode untuk membatasi penggunaan penyimpanan meliputi:

  • Menyimpan data non-permanen di memori
  • Mengurangi jumlah modifikasi penyimpanan: dengan menyimpan hasil sementara di memori, setelah semua perhitungan selesai, baru hasil tersebut dialokasikan ke variabel penyimpanan.

Gas optimization sepuluh praktik terbaik untuk kontrak pintar Ethereum

( 2. Pengemasan Variabel

Jumlah storage slot ) yang digunakan dalam smart contract dan cara pengembang menyatakan data akan sangat mempengaruhi konsumsi Gas.

Kompilator Solidity akan mengemas variabel penyimpanan yang berurutan selama proses kompilasi, dan menggunakan slot penyimpanan 32 byte sebagai unit dasar penyimpanan variabel. Pengemasan variabel berarti mengatur variabel dengan cara yang rasional, sehingga beberapa variabel dapat cocok dalam satu slot penyimpanan.

Dengan penyesuaian detail ini, pengembang dapat menghemat 20.000 unit Gas ### untuk menyimpan slot penyimpanan yang tidak terpakai yang memerlukan biaya 20.000 Gas (, tetapi sekarang hanya memerlukan dua slot penyimpanan.

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

![Gas optimalisasi untuk kontrak pintar Ethereum: Sepuluh Praktik Terbaik])https://img-cdn.gateio.im/webp-social/moments-30f0bc370a7b9ca65f3d623c31262b76.webp(

) 3. Optimalkan tipe data

Sebuah variabel dapat diwakili oleh berbagai tipe data, tetapi biaya operasi untuk tipe data yang berbeda juga berbeda. Memilih tipe data yang tepat membantu mengoptimalkan penggunaan Gas.

Misalnya, dalam Solidity, bilangan bulat dapat dibagi menjadi berbagai ukuran: uint8, uint16, uint32, dll. Karena EVM melakukan operasi dalam satuan 256-bit, menggunakan uint8 berarti EVM harus terlebih dahulu mengubahnya menjadi uint256, dan konversi ini akan mengkonsumsi Gas tambahan.

Secara terpisah, di sini menggunakan uint256 lebih murah dibandingkan uint8. Namun, jika menggunakan optimasi pengemasan variabel yang telah kami sarankan sebelumnya, itu akan berbeda. Jika pengembang dapat mengemas empat variabel uint8 ke dalam satu slot penyimpanan, maka total biaya untuk mengiterasi mereka akan lebih rendah dibandingkan dengan empat variabel uint256. Dengan cara ini, smart contract dapat membaca dan menulis satu slot penyimpanan, dan dalam satu operasi, memasukkan empat variabel uint8 ke dalam memori/penyimpanan.

Gas optimization sepuluh praktik terbaik untuk smart contract Ethereum

4. Gunakan variabel ukuran tetap sebagai pengganti variabel dinamis

Jika data dapat dikendalikan dalam 32 byte, disarankan untuk menggunakan tipe data bytes32 sebagai pengganti bytes atau strings. Secara umum, variabel dengan ukuran tetap mengkonsumsi Gas lebih sedikit dibandingkan dengan variabel dengan ukuran variabel. Jika panjang byte dapat dibatasi, usahakan untuk memilih panjang terkecil dari bytes1 hingga bytes32.

Ethereum smart contract Gas optimalisasi sepuluh praktik terbaik

5. Pemetaan dan Array

Daftar data Solidity dapat direpresentasikan dengan dua jenis tipe data: Arrays( dan Mappings), tetapi sintaksis dan strukturnya sangat berbeda.

Pemetaan umumnya lebih efisien dan lebih murah, tetapi array memiliki kemampuan untuk diiterasi dan mendukung pengemasan tipe data. Oleh karena itu, disarankan untuk lebih memilih pemetaan saat mengelola daftar data, kecuali jika dibutuhkan iterasi atau dapat mengoptimalkan konsumsi Gas melalui pengemasan tipe data.

![Gas optimasi terbaik untuk smart contract Ethereum]###https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(

) 6. Menggunakan calldata sebagai pengganti memory

Variabel yang dideklarasikan dalam parameter fungsi dapat disimpan di calldata atau memory. Perbedaan utama antara keduanya adalah, memory dapat dimodifikasi oleh fungsi, sedangkan calldata bersifat tidak dapat diubah.

Ingat prinsip ini: jika parameter fungsi bersifat read-only, lebih baik menggunakan calldata daripada memory. Ini dapat menghindari operasi penyalinan yang tidak perlu dari calldata fungsi ke memory.

Gas optimasi kontrak pintar Ethereum sepuluh praktik terbaik

( 7. Usahakan untuk menggunakan kata kunci Constant/Immutable

Variabel Constant/Immutable tidak akan disimpan dalam penyimpanan kontrak. Variabel ini akan dihitung pada saat kompilasi dan disimpan dalam bytecode kontrak. Oleh karena itu, biaya aksesnya jauh lebih rendah dibandingkan dengan penyimpanan, disarankan untuk menggunakan kata kunci Constant atau Immutable sebisa mungkin.

![Gas optimization terbaik untuk smart contract Ethereum])https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp###

( 8. Gunakan Unchecked saat memastikan tidak akan terjadi overflow/underflow

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

Selain itu, compiler versi 0.8.0 dan yang lebih tinggi tidak lagi memerlukan penggunaan pustaka SafeMath, karena compiler itu sendiri telah menyertakan fitur perlindungan terhadap overflow dan underflow.

![Gas optimization sepuluh praktik terbaik untuk smart contract Ethereum])https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp###

( 9. Optimasi Modifikasi

Kode modifier disematkan ke dalam fungsi yang telah dimodifikasi, dan setiap kali modifier digunakan, kodenya akan disalin. Ini akan meningkatkan ukuran bytecode dan meningkatkan konsumsi Gas. Ukuran bytecode dapat dikurangi dan biaya Gas dapat diturunkan dengan merestrukturisasi logika menjadi fungsi internal, yang memungkinkan penggunaan kembali fungsi internal dalam modifier.

![Gas optimization sepuluh praktik terbaik untuk smart contract Ethereum])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp###

( 10. Optimalisasi jalur pendek

Untuk || dan && operator, evaluasi logika akan terjadi evaluasi jangka pendek, yaitu jika kondisi pertama sudah dapat menentukan hasil dari ekspresi logika, maka kondisi kedua tidak akan dievaluasi.

Untuk mengoptimalkan konsumsi Gas, sebaiknya meletakkan kondisi dengan biaya perhitungan yang rendah di depan, sehingga mungkin dapat melewati perhitungan yang mahal.

![Gas optimization 10 best practices untuk smart contract Ethereum])https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp###

Saran Umum Tambahan

( 1. Hapus kode yang tidak berguna

Jika ada fungsi atau variabel yang tidak digunakan 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 melakukan perhitungan. Jika hasil dari beberapa perhitungan digunakan secara langsung dalam kontrak, maka proses perhitungan yang redundan ini harus dihapus. Pada dasarnya, semua perhitungan yang tidak digunakan harus dihapus.

  • Di Ethereum, pengembang dapat memperoleh hadiah Gas dengan melepaskan ruang penyimpanan. Jika suatu variabel tidak lagi diperlukan, harus menggunakan kata kunci delete untuk menghapusnya, atau mengatur nilainya ke nilai default.

  • Optimasi loop: hindari operasi loop yang mahal, gabungkan loop jika memungkinkan, dan pindahkan perhitungan yang berulang keluar dari tubuh loop.

) 2. Menggunakan kontrak pra-kompilasi

Kontrak pra-kompilasi menyediakan fungsi perpustakaan yang kompleks, seperti operasi enkripsi dan hashing. Karena kode tidak dijalankan di EVM, tetapi dijalankan secara lokal di node klien, maka Gas yang dibutuhkan lebih sedikit. Menggunakan kontrak pra-kompilasi dapat menghemat Gas dengan mengurangi beban kerja komputasi yang diperlukan untuk menjalankan smart contract.

Contoh kontrak pra-kompilasi termasuk algoritma tanda tangan digital kurva elips ###ECDSA( dan algoritma hash SHA2-256. Dengan menggunakan kontrak pra-kompilasi ini dalam smart contract, pengembang dapat mengurangi biaya Gas dan meningkatkan efisiensi pengoperasian aplikasi.

) 3. Menggunakan kode assembly inline

Assembly dalam baris ### in-line assembly ### memungkinkan pengembang untuk menulis kode tingkat rendah yang efisien yang dapat dieksekusi langsung oleh EVM, tanpa perlu menggunakan opcode Solidity yang mahal. Assembly dalam baris juga memungkinkan kontrol yang lebih tepat atas penggunaan memori dan penyimpanan, sehingga lebih lanjut mengurangi biaya Gas. Selain itu, assembly dalam baris dapat melakukan beberapa operasi kompleks yang sulit dicapai hanya dengan menggunakan Solidity, memberikan lebih banyak fleksibilitas untuk mengoptimalkan konsumsi Gas.

Namun, menggunakan assembly inline juga dapat membawa risiko dan toleransi.

ETH2.98%
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.
  • Hadiah
  • 4
  • Bagikan
Komentar
0/400
DaoGovernanceOfficervip
· 19jam yang lalu
*sigh* lagi satu pos gas yang mengabaikan penelitian skala l2...
Lihat AsliBalas0
ApeShotFirstvip
· 19jam yang lalu
Biaya gasnya tinggi banget sampai saya bangkrut.
Lihat AsliBalas0
BottomMisservip
· 19jam yang lalu
Optimasi Gas? Lebih baik tunggu Bear Market datang
Lihat AsliBalas0
Rekt_Recoveryvip
· 19jam yang lalu
rip Gas Fee... masih pulih dari PTSD 2021 ngl
Lihat AsliBalas0
Perdagangkan Kripto Di Mana Saja Kapan Saja
qrCode
Pindai untuk mengunduh aplikasi Gate
Komunitas
Bahasa Indonesia
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)