Anda mungkin telah menemukan beberapa tips Soliditas untuk meningkatkan keterampilan kode Anda guna menghemat bahan bakar, namun, hari ini saya ingin lebih fokus pada bagaimana memahami Mesin Virtual Ethereum dapat secara efektif menghemat biaya bahan bakar pada kontrak pintar Anda.

Karena kita akan mendalami Ethereum, di sini saya akan meninggalkan cuplikan dari Kertas Kuningnya yang merinci biaya bahan bakar dari opcode, dan dalam artikel ini kami akan merujuknya.



Tip #1: Akses dingin VS akses hangat

Gcoldsload: 2100 gas

Akses Gwarm: 100 gas

Di sana kita memiliki OPCODE pertama, yang pertama menentukan berapa biaya untuk mengakses variabel untuk pertama kalinya (atau akses dingin) sedangkan yang kedua menentukan berapa biaya untuk mengakses variabel untuk kedua kalinya dan selanjutnya (akses hangat ). Seperti yang Anda lihat, perbedaan harga cukup besar, jadi memahami hal ini dapat membuat perbedaan besar dalam biaya transaksi kontrak pintar Anda. Mari kita lihat sebuah contoh.





Menyimpan data dalam cache di dalam suatu fungsi di Solidity dapat menghasilkan penggunaan bahan bakar yang lebih rendah, meskipun memerlukan lebih banyak baris kode. Dalam hal ini, hal ini dilakukan dengan mengalihkan lokasi array dan alih-alih menggunakannya dari penyimpanan dan karenanya mengaksesnya secara dingin setiap kali dalam loop, array disimpan dalam memori di tempat yang lebih murah untuk mengaksesnya.

Tip #2: Nilai nol vs bukan nol dan pengembalian bahan bakar

Gsset = 20.000 gas

Rsclear = {diskon harga eksekusi}

Mengubah nilai dari 0 menjadi bukan nol di blockchain Ethereum adalah hal yang mahal seperti yang kita lihat pada harga Gsset, namun mengubah nilai dari bukan nol menjadi 0, dapat memberi Anda pengembalian dana dalam bentuk nilai gas sesuai dengan opcode Rsclear. Agar tidak memanfaatkan refund, ditetapkan bahwa Anda hanya bisa mendapatkan refund maksimal 20% dari total biaya transaksi.

Anda dapat menemukan skenario seperti itu dalam skenario yang sangat umum di blockchain, yaitu memperbarui saldo alamat dalam kontrak pintar. Mari kita lihat contoh masing-masing:





  • Dalam contoh pertama kontrak ZeroToNonZero, bukan nol hingga bukan nol (5.000 gas*) + nol hingga bukan nol (20.000 gas) = ​​25.000 gas

  • Pada contoh kedua kontrak NonZeroToZero, Non-zero to zero (5.000 gas*) + zero to non-zero (20.000 gas) — Pengembalian dana (4.800 gas) = ​​21.200 gas

*2,100 (Gcolssload) + 2,900 (Gsreset) = 5,000 gas

Tip #3: Urutan variabel status penting

Penyimpanan itu seperti struktur data nilai kunci yang menyimpan nilai variabel status dari kontrak pintar Soliditas.

Anda dapat menganggap penyimpanan sebagai sebuah array yang akan membantu memvisualisasikannya. Setiap ruang dalam “array” penyimpanan ini disebut slot dan menampung 32 byte (256 bit) data dan setiap variabel status yang dideklarasikan dalam kontrak pintar akan menempati slot tergantung pada posisi deklarasi dan tipenya.

Tidak semua tipe data mengambil seluruh 32 byte dari setiap slot karena ada beberapa tipe data (bool, uint8, alamat…) yang membutuhkan kurang dari itu.

Triknya di sini adalah jika dua/tiga atau lebih variabel bersama-sama berukuran 32 byte atau kurang, kompiler soliditas akan mencoba mengemasnya bersama-sama dalam satu slot, namun variabel-variabel ini perlu didefinisikan bersebelahan.





Di sini kita menggunakan tipe data bool (1 byte), address (20 byte), dan uint256 (32 byte). Jadi, dengan mengetahui ukuran variabel-variabel ini, Anda dapat dengan mudah memahami bahwa dalam contoh pertama dalam kontrak TwoSlots karena kita memiliki bool dan alamat bersama-sama (1 + 20 = 21 byte, yaitu kurang dari 32 byte), variabel-variabel tersebut akan menempati satu slot. Pada kontrak ThreeSlots karena bool dan uint256 tidak bisa berada di slot yang sama (1 + 32 = 33 byte, yang lebih besar dari kapasitas slot) secara total kita akan menggunakan tiga slot.

Sekarang, mengapa hal ini begitu penting?

Opcode SLOAD berharga 2100 bahan bakar dan digunakan untuk membaca dari slot Penyimpanan, jadi jika Anda dapat menyimpan variabel dalam slot yang lebih sedikit, Anda akan menghemat sejumlah bahan bakar.

Tip #4: uint256 lebih murah daripada uint8

Kita telah mempelajari di tip #3, bahwa uint256 (256 bit = 32 byte) menempati slot tersendiri dan kami juga telah mempelajari bahwa uint8 kurang dari 32 byte. Jadi, meskipun sudah jelas bahwa 8 bit lebih kecil dari 256 bit, mengapa uint256 lebih murah?

Untuk memahami hal ini penting untuk diketahui bahwa jika suatu variabel tidak mengisi seluruh slotnya dan jika slot ini tidak diisi oleh variabel lain, EVM akan mengisi sisa bit yang tersisa dengan “0”. untuk dapat memanipulasinya.

Penambahan “0” yang dilakukan oleh EVM ini akan memakan biaya bahan bakar, artinya untuk menghemat bahan bakar transaksi, lebih baik menggunakan uint256 daripada uint8.

__________________

Mudah-mudahan, saat mempelajari tips untuk mengurangi biaya bahan bakar di kontrak pintar Anda, Anda juga telah mempelajari sedikit cara kerja EVM.

__________________

Twitter @TheBlockChainer untuk menemukan pembaruan harian lainnya tentang Kontrak Cerdas, Keamanan Web3, Soliditas, Audit kontrak pintar, dan banyak lagi.

__________________