Praktik Terbaik Sepuluh Optimisasi Gas Kontrak Pintar Ethereum

Biaya gas di Mainnet Ethereum selalu menjadi masalah yang sulit diatasi, terutama saat jaringan padat. Pada jam sibuk, pengguna sering perlu membayar Pencucian Uang yang sangat tinggi. Oleh karena itu, mengoptimalkan biaya gas selama tahap pengembangan Smart Contract sangat penting. Mengoptimalkan konsumsi gas tidak hanya dapat mengurangi Biaya Transaksi, tetapi juga dapat meningkatkan efisiensi transaksi, memberikan pengalaman pengguna blockchain yang lebih ekonomis dan efisien.

Artikel ini akan menjelaskan mekanisme biaya Gas dari mesin virtual EVM (Ethereum) ETH, konsep inti optimisasi biaya Gas, serta praktik terbaik dalam mengoptimalkan biaya Gas saat mengembangkan Smart Contract. Harapannya melalui konten ini, dapat memberikan inspirasi dan bantuan praktis bagi para pengembang, sekaligus membantu pengguna biasa memahami dengan lebih baik cara kerja biaya Gas dari EVM, untuk bersama-sama menghadapi tantangan dalam ekosistem blockchain.

Pengenalan Mekanisme Biaya Gas EVM

Di jaringan yang kompatibel dengan EVM, 'gas' mengacu pada unit yang digunakan untuk mengukur kebutuhan daya komputasi dalam melakukan operasi tertentu.

Gambar di bawah ini menggambarkan tata letak struktur EVM. Dalam gambar tersebut, konsumsi gas terdiri dari tiga bagian: eksekusi operasi, panggilan pesan eksternal, dan pembacaan/tulisan memori dan penyimpanan.

ETH坊Smart Contract的Gas优化十大最佳实践

Sumber: Situs web resmi Ethereum[1]

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

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

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

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

1. Memahami Optimisasi Gas di EVM

Ketika Smart Contract dikompilasi dengan Solidity, kontrak akan diubah menjadi serangkaian "kode operasi", yaitu kode operasi.

Setiap operasi opcode (seperti membuat kontrak, melakukan panggilan pesan, mengakses penyimpanan akun, dan menjalankan operasi di mesin virtual) memiliki biaya Gas yang diakui, biaya-biaya ini dicatat dalam buku kuning Ethereum[2].

ETH坊Smart Contract的Gas优化十大最佳实践

Setelah beberapa kali diperbarui oleh EIP, biaya Gas dari beberapa opcode telah disesuaikan dan mungkin berbeda dengan yang tercantum dalam buku kuning. Untuk informasi terperinci mengenai biaya opcode terbaru, silakan lihat di sini [3].

2. Konsep Dasar Optimisasi Gas

Optimasi Gas bertujuan memilih operasi yang efisien biaya di blockchain EVM, menghindari operasi dengan biaya Gas yang tinggi.

Dalam EVM, biaya operasi berikut lebih rendah:

  • Membaca dan menulis variabel memori
  • Membaca konstanta dan variabel yang tidak dapat diubah
  • Membaca dan menulis variabel lokal
  • Membaca variabel calldata, misalnya array calldata dan struktur data
  • Panggilan Fungsi Internal

Operasi dengan biaya tinggi termasuk:

  • Membaca dan menulis variabel status yang disimpan di penyimpanan kontrak
  • Panggilan Fungsi Eksternal
  • Operasi sirkular

EVM Gas Pencucian Uang Optimasi Praktik Terbaik

Berdasarkan konsep dasar di atas, kami telah menyusun daftar praktik terbaik untuk mengoptimalkan Biaya Transaksi Gas bagi komunitas pengembang. Dengan mengikuti praktik-praktik ini, para pengembang dapat menurunkan konsumsi Biaya Transaksi Gas dari Smart Contract, dan menciptakan aplikasi yang lebih efisien dan ramah pengguna.

1. Usahakan untuk mengurangi penggunaan penyimpanan

Di Solidity, Storage (penyimpanan) adalah sumber daya terbatas, yang mengkonsumsi Gas jauh lebih tinggi daripada Memory (memori). Setiap kali Smart Contract membaca atau menulis data dari penyimpanan, biaya Gas yang tinggi akan terjadi.

Menurut definisi dalam buku putih Ethereum, biaya operasi penyimpanan jauh lebih tinggi daripada operasi memori, dengan perbandingan lebih dari 100 kali lipat. Misalnya, instruksi OPcodesmload dan mstore hanya menghabiskan 3 unit gas, sementara operasi penyimpanan seperti sload dan sstore bahkan dalam kondisi ideal, biayanya setidaknya membutuhkan 100 unit.

10 Best Practices for Gas Optimization of ETH Smart Contract

Metode pembatasan penggunaan penyimpanan termasuk:

  • Menyimpan data non-permanen di dalam memori
  • Mengurangi jumlah perubahan penyimpanan: dengan menyimpan hasil tengah dalam memori, setelah semua perhitungan selesai, hasilnya kemudian diberikan ke variabel penyimpanan.

2. Pengemasan Variabel

Jumlah slot penyimpanan yang digunakan dalam Smart Contract dan cara pengembang menyatakan data akan sangat memengaruhi konsumsi biaya gas.

Compiler Solidity akan mengemas variabel penyimpanan yang berurutan selama proses kompilasi, dan menggunakan slot penyimpanan 32 byte sebagai unit dasar penyimpanan variabel. Pengemasan variabel mengacu pada pengaturan variabel yang memungkinkan beberapa variabel untuk cocok dalam satu slot penyimpanan.

Di sebelah kiri adalah cara implementasi yang kurang efisien, akan menggunakan 3 slot penyimpanan; di sebelah kanan adalah cara implementasi yang lebih efisien.

10 Praktik Terbaik Optimasi Gas Kontrak Pintar ETH坊

Melalui penyesuaian detail ini, pengembang dapat menghemat 20,000 unit gas (menyimpan slot penyimpanan yang tidak digunakan membutuhkan 20,000 gas), tetapi sekarang hanya memerlukan dua slot penyimpanan.

Karena setiap slot penyimpanan menghabiskan gas, packing variabel mengoptimalkan penggunaan gas dengan mengurangi jumlah slot penyimpanan yang diperlukan.

3. Optimisasi jenis data

Sebuah variabel dapat diwakili oleh berbagai jenis data, tetapi biaya operasi yang berbeda akan tergantung pada jenis data yang dipilih. Memilih jenis data yang sesuai akan membantu mengoptimalkan penggunaan gas.

Misalnya, di Solidity, integer dapat dibagi menjadi berbagai ukuran: uint8, uint16, uint32, dll. Karena EVM melakukan operasi dalam unit 256 bit, menggunakan uint8 berarti EVM harus mengonversinya ke uint256 terlebih dahulu, dan konversi ini akan menghabiskan Gas tambahan.

10 Praktik Terbaik Optimalisasi Gas Kontrak Pintar ETH

Kita dapat membandingkan biaya Gas uint8 dan uint256 melalui kode di atas. Fungsi UseUint() mengonsumsi 120,382 unit Gas, sementara fungsi UseUInt8() mengonsumsi 166,111 unit Gas.

Secara individual, menggunakan uint256 lebih murah daripada uint8 di sini. Namun, jika menggunakan optimisasi paket variabel yang kami sarankan sebelumnya, akan berbeda. Jika pengembang dapat menggabungkan empat variabel uint8 ke dalam satu slot penyimpanan, maka biaya total iterasi mereka akan lebih rendah daripada empat variabel uint256. Dengan demikian, Smart Contract dapat membaca/menulis ke satu slot penyimpanan dan memasukkan empat variabel uint8 ke dalam memori/penyimpanan dalam satu operasi.

4. Menggunakan variabel berukuran tetap sebagai pengganti variabel dinamis

Jika data dapat dikendalikan dalam 32 byte, disarankan menggunakan tipe data bytes32 sebagai pengganti bytes atau strings. Secara umum, variabel berukuran tetap mengkonsumsi Gas yang lebih sedikit daripada variabel berukuran variabel. Jika panjang byte dapat dibatasi, pilih panjang terkecil mulai dari bytes1 hingga bytes32.

10 Praktik Terbaik Optimasi Gas untuk Smart Contract Ethereum

10 Praktik Terbaik Optimasi Gas Kontrak Pintar ETH

5. Pemetaan dan Array

Daftar data Solidity dapat direpresentasikan dengan dua jenis tipe data: array dan pemetaan, tetapi sintaksis dan strukturnya sangat berbeda.

Pemetaan pada umumnya lebih efisien dan lebih murah, tetapi array memiliki kemampuan dapat diulang dan mendukung pengemasan tipe data. Oleh karena itu, disarankan untuk menggunakan pemetaan sebagai prioritas dalam mengelola daftar data, kecuali jika perlu berulang atau dapat dioptimalkan dengan pengemasan tipe data untuk mengurangi biaya Gas.

6. Menggunakan calldata sebagai pengganti memory

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

Ingat prinsip ini: jika parameter fungsi hanya untuk dibaca, sebaiknya gunakan calldata daripada memory. Ini akan menghindari operasi penyalinan yang tidak perlu dari calldata ke memory fungsi.

Contoh 1: Menggunakan memory

ETH坊Smart Contract的Gas优化十大最佳实践

Ketika menggunakan kata kunci memory, nilai-nilai array akan disalin dari calldata yang dikodekan ke memory selama proses dekode ABI. Biaya eksekusi blok kode ini adalah 3.694 unit Gas.

Contoh 2: Menggunakan calldata

ETH坊Smart Contract的Gas优化十大最佳实践

Ketika nilai dibaca langsung dari calldata, lewati operasi memory di tengah. Cara optimalisasi ini mengurangi biaya eksekusi menjadi hanya 2.413 unit Gas, meningkatkan efisiensi Gas sebesar 35%.

7. Gunakanlah kata kunci Constant/Immutable sebanyak mungkin

Variabel Constant/Immutable tidak disimpan dalam penyimpanan kontrak. Variabel ini dihitung 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 sebanyak mungkin.

8. Gunakan Unchecked saat memastikan tidak terjadi overflow / underflow

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

Dalam gambar di bawah ini, terkendali oleh batasan kondisi i

ETH坊Smart Contract的Gas优化十大最佳实践

Selain itu, compiler versi 0.8.0 dan di atasnya tidak lagi memerlukan penggunaan pustaka SafeMath, karena compiler itu sendiri sudah menyertakan fitur perlindungan overflow dan underflow secara internal.

9. Optimizer

Kode modifier tertanam di dalam fungsi yang telah diubah, setiap kali menggunakan modifier, kode tersebut akan disalin. Ini akan meningkatkan ukuran bytecode dan meningkatkan konsumsi Gas. Berikut adalah metode untuk mengoptimalkan biaya Gas modifier:

Sebelum dioptimalkan:

10 Praktik Terbaik Optimasi Gas untuk Kontrak Pintar ETH

Setelah dioptimalkan:

Praktik Terbaik Sepuluh Optimalisasi Gas Smart Contract Ethereum

Dalam contoh ini, dengan membangun ulang logika ke dalam fungsi internal _checkOwner(), memungkinkan penggunaan ulang fungsi internal tersebut dalam modifier, dapat mengurangi ukuran bytecode dan menurunkan Biaya Gas.

10. Optimalisasi Short Circuit

Untuk operator || dan &&, evaluasi logika mengalami evaluasi shortcut, artinya jika kondisi pertama sudah dapat menentukan hasil ekspresi logika, maka kondisi kedua tidak akan dievaluasi.

Untuk mengoptimalkan penggunaan gas, sebaiknya menempatkan kondisi dengan biaya perhitungan rendah di depan, sehingga dapat memungkinkan untuk melewati perhitungan yang mahal.

Rekomendasi umum tambahan

1. Menghapus kode yang tidak berguna

Jika terdapat fungsi atau variabel yang tidak digunakan dalam kontrak, disarankan untuk menghapusnya. Ini adalah cara langsung untuk mengurangi biaya deploy kontrak dan menjaga ukuran kontrak tetap kecil.

Berikut adalah beberapa saran praktis:

Menghitung menggunakan algoritma yang paling efisien. Jika kontrak menggunakan langsung hasil dari beberapa perhitungan, maka proses perhitungan yang redundan harus dihapus. Pada dasarnya, setiap perhitungan yang tidak digunakan harus dihapus.

Di dalam Ethereum, pengembang dapat memperoleh hadiah gas dengan melepaskan ruang penyimpanan. Jika suatu variabel tidak lagi diperlukan, gunakan kata kunci delete untuk menghapusnya atau atur nilainya ke default.

Pengoptimalan loop: Hindari operasi loop yang mahal, gabungkan loop sebanyak mungkin, dan pindahkan perhitungan duplikat keluar dari badan loop.

2. Menggunakan kontrak pra-kompilasi

Kontrak Pra-Kompilasi menyediakan fungsi pustaka yang kompleks seperti enkripsi dan operasi hash. Karena kode ini tidak dijalankan di EVM tetapi dijalankan secara lokal di node klien, ini membutuhkan kurang Gas. Menggunakan kontrak pra-kompilasi dapat menghemat Gas dengan mengurangi beban komputasi yang diperlukan untuk menjalankan Kontrak Pintar.

Contoh kontrak pra-kompilasi termasuk algoritma tanda tangan digital kurva eliptik (ECDSA) dan algoritma hash SHA2-256. Dengan menggunakan kontrak pra-kompilasi ini dalam Smart Contract, pengembang dapat menurunkan biaya Pencucian Uang dan meningkatkan efisiensi aplikasi.

Untuk daftar lengkap kontrak pra-kompilasi yang didukung oleh jaringan Mainnet ETH, silakan lihat di sini [4].

3. Menggunakan Kode Assembler Inline

Inline assembly memungkinkan pengembang menulis kode rendah tetapi efisien yang dapat dieksekusi langsung oleh EVM tanpa perlu menggunakan opcode Solidity yang mahal. Inline assembly juga memungkinkan pengendalian yang lebih tepat terhadap penggunaan memori dan penyimpanan, sehingga lebih mengurangi biaya Gas. Selain itu, inline assembly dapat melakukan beberapa operasi kompleks yang sulit diimplementasikan hanya menggunakan Solidity, memberikan fleksibilitas yang lebih besar dalam mengoptimalkan konsumsi Gas.

Berikut adalah contoh kode untuk menghemat Gas menggunakan inline assembly:

10 Praktik Terbaik Optimasi Gas Kontrak Pintar ETH

Dari gambar di atas, dapat dilihat bahwa, dibandingkan dengan kasus penggunaan standar, kasus penggunaan kedua yang menggunakan teknologi inline assembly memiliki efisiensi Gas yang lebih tinggi.

Namun, penggunaan inline assembly juga dapat menimbulkan risiko dan rentan terhadap kesalahan. Oleh karena itu, penggunaannya perlu dilakukan dengan hati-hati dan hanya oleh pengembang berpengalaman.

4. Menggunakan Solusi Layer 2

Menggunakan solusi Layer 2 dapat mengurangi jumlah data yang perlu disimpan dan dihitung di Mainnet Ethereum.

Solusi Layer 2 seperti rollups, sidechain, dan saluran status dapat membongkar pemrosesan transaksi dari rantai utama ETH, sehingga mencapai transaksi yang lebih cepat dan lebih murah.

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

5. Menggunakan Alat dan Pustaka Optimasi

Ada beberapa alat optimasi yang tersedia, seperti pengoptimal solc, pengoptimal pembangunan Truffle, dan kompiler Solidity dari Remix.

ETH坊Smart Contract的Gas优化十大最佳实践

Alat-alat ini dapat membantu meminimalkan ukuran bytecode, menghapus kode yang tidak berguna, dan mengurangi jumlah operasi yang diperlukan untuk menjalankan Smart Contract. Dikombinasikan dengan perpustakaan pengoptimalan gas lainnya, seperti "solmate", pengembang dapat secara efektif menurunkan biaya gas dan meningkatkan efisiensi kontrak pintar.

Kesimpulan

Optimisasi penggunaan gas adalah langkah penting bagi pengembang untuk meminimalkan biaya transaksi dan meningkatkan efisiensi Smart Contract di jaringan kompatibel EVM. Dengan melakukan operasi yang menghemat biaya terlebih dahulu, mengurangi penggunaan penyimpanan, menggunakan instruksi inline, dan mengikuti praktik terbaik lainnya yang dibahas dalam artikel ini, pengembang dapat secara efektif menurunkan penggunaan gas kontrak.

Namun, perlu diingat bahwa dalam proses optimalisasi, pengembang harus berhati-hati agar tidak memperkenalkan kerentanan keamanan. Selama proses mengoptimalkan kode dan mengurangi konsumsi gas, keamanan inheren dari Smart Contract tidak boleh dikorbankan.

[1] :

[2] :

[3] :

[4] :precompiled

ETH-3.7%
GAS10.09%
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
  • 1
  • Bagikan
Komentar
0/400
IELTSvip
· 2024-12-31 01:14
Dikabarkan bahwa BTCETF "IBIT" dari BlackRock adalah "peluncuran terbesar dalam sejarah ETF" karena lonjakan cepat dan besar yang diharapkan terjadi pada tahun 2024. #圣诞冒险岛:喜迎新年,$50,000福利派送中# #2024 Gate.io 年度账单# #荣誉积分新年抽奖,赢Macbook、周边好礼# BSV eth ethw etcDoge xrp adapepe
Lihat AsliBalas0
  • Sematkan
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)