EVM akıllı sözleşmeler Gas ücreti optimizasyon kılavuzu: 10 en iyi uygulama ve anahtar kavramların analizi

Akıllı sözleşmeler Gas ücreti optimizasyon kılavuzu: 10 en iyi uygulama

Ethereum ana ağındaki Gas ücretleri her zaman sorunlu bir konu olmuştur, özellikle ağın yoğun olduğu zamanlarda daha belirgin hale gelir. Yoğun dönemlerde kullanıcılar genellikle yüksek işlem ücretleri ödemek zorunda kalırlar. Bu nedenle, akıllı sözleşmeler geliştirme aşamasında Gas ücreti optimizasyonu son derece önemlidir. Gas tüketimini optimize etmek, yalnızca işlem maliyetlerini etkili bir şekilde azaltmakla kalmaz, aynı zamanda işlem verimliliğini artırarak kullanıcılara daha ekonomik ve verimli bir blockchain deneyimi sunar.

Bu makalede Ethereum Sanal Makinesi (EVM)'in Gas ücret mekanizması, Gas ücreti optimizasyonunun temel kavramları ve akıllı sözleşmeler geliştirilirken Gas ücreti optimizasyonu için en iyi uygulamalar özetlenecektir. Umut ediyoruz ki bu içerikler geliştiricilere ilham ve pratik yardım sağlarken, aynı zamanda sıradan kullanıcıların EVM'in Gas ücretlerinin çalışma şekmini daha iyi anlamalarına yardımcı olacak ve blockchain ekosistemindeki zorluklarla birlikte başa çıkmalarına katkıda bulunacaktır.

Ethereum akıllı sözleşmelerin Gaz optimizasyonu için en iyi on uygulama

EVM'in Gas Ücret Mekanizması Hakkında Kısa Bilgi

EVM uyumlu ağlarda, "Gas" belirli işlemleri gerçekleştirmek için gereken hesaplama gücünün ölçüm birimidir.

EVM'nin yapı düzeninde, Gas tüketimi üç bölüme ayrılır: işlem yürütme, dış mesaj çağrıları ve bellek ile depolamanın okuma/yazma işlemleri.

Her işlemin gerçekleştirilmesi için hesaplama kaynağına ihtiyaç olduğundan, sonsuz döngü ve hizmet reddi (DoS) saldırılarını önlemek amacıyla belirli bir ücret alınır. Bir işlemi tamamlamak için gereken ücrete "Gas ücreti" denir.

EIP-1559( Londra hard fork'u ) tarihinden itibaren geçerli olduğundan beri, Gas ücretleri aşağıdaki formülle hesaplanmaktadır:

Gaz ücreti = kullanılan gaz birimleri * ( temel ücreti + öncelik ücreti )

Temel ücret yok edilecektir, öncelik ücreti ise bir teşvik olarak kullanılacak ve doğrulayıcıları işlemleri blok zincirine eklemeye teşvik edecektir. İşlem gönderirken daha yüksek bir öncelik ücreti belirlemek, işlemin bir sonraki blokta yer alma olasılığını artırabilir. Bu, kullanıcıların doğrulayıcılara ödediği bir tür "bahşiş" gibidir.

Ethereum akıllı sözleşmelerin Gas optimizasyonu için en iyi 10 uygulama

1. EVM'deki Gas optimizasyonunu anlama

Solidity ile akıllı sözleşmeler derlendiğinde, sözleşme bir dizi "işlem koduna" yani opcodlara dönüştürülür.

Herhangi bir işlem kodu (, örneğin akıllı sözleşmeler oluşturma, mesaj çağrısı yapma, hesap depolamasına erişme ve sanal makinede işlem gerçekleştirme ) için kabul gören bir Gas tüketim maliyeti vardır; bu maliyetler Ethereum sarı kitabında kaydedilmiştir.

Birçok EIP değişikliğinden sonra, bazı opcode'ların Gas maliyetleri ayarlanmış olup, bu durum sarı kitapta belirtilenlerle farklılık gösterebilir.

2.Gas optimizasyonunun temel kavramı

Gas optimizasyonunun temel prensibi, EVM blockchain'inde maliyet verimliliği yüksek işlemleri öncelikli olarak seçmek ve Gas maliyeti yüksek işlemlerden kaçınmaktır.

EVM'de, aşağıdaki işlemlerin maliyeti daha düşüktür:

  • Bellek değişkenlerini okuma yazma
  • Sabitleri ve değişmez değişkenleri oku
  • Yerel değişkenleri okuma yazma
  • calldata değişkenini oku, örneğin calldata dizisi ve yapısı
  • İç fonksiyon çağrısı

Maliyetli işlemler şunlardır:

  • Sözleşme depolamasında saklanan durum değişkenlerini okumak ve yazmak
  • Harici fonksiyon çağrısı
  • Döngüsel işlem

Ethereum akıllı sözleşmelerin Gas optimizasyonu için en iyi 10 uygulama

EVM Gas Ücretleri Optimizasyonu En İyi Uygulamaları

Yukarıda belirtilen temel kavramlara dayanarak, geliştirici topluluğu için bir Gas ücreti optimizasyonu en iyi uygulamalar listesi derledik. Bu uygulamaları takip ederek, geliştiriciler akıllı sözleşmelerin Gas ücreti tüketimini azaltabilir, işlem maliyetlerini düşürebilir ve daha verimli ve kullanıcı dostu uygulamalar oluşturabilir.

1. Depolama kullanımını mümkün olduğunca azaltın.

Solidity'de, Storage( depolama) sınırlı bir kaynaktır ve Gas tüketimi, Memory( bellek)'den çok daha yüksektir. Her seferinde akıllı sözleşmeler depolamadan veri okuduğunda veya yazdığında, yüksek Gas maliyetleri ortaya çıkar.

Ethereum sarı kitabına göre, depolama işlemlerinin maliyeti bellek işlemlerinin maliyetinin 100 katından fazla. Örneğin, OPcodesmload ve mstore talimatları yalnızca 3 Gas birimi tüketirken, depolama işlemleri sload ve sstore en ideal koşullarda bile en az 100 birim maliyet gerektirir.

Saklama kullanımını sınırlama yöntemleri şunlardır:

  • Geçici verileri bellek içinde depolamak
  • Depolama değişiklik sayısını azaltma: Ara sonuçları bellekte saklayarak, tüm hesaplamalar tamamlandıktan sonra sonuçları depolama değişkenlerine atama.

Ethereum akıllı sözleşmelerin Gaz optimizasyonu için en iyi 10 uygulama

2. Değişken paketleme

akıllı sözleşmelerde kullanılan Storage slot( depolama slotu) sayısı ve geliştiricilerin verileri ifade etme şekli, Gas ücretinin tüketimini büyük ölçüde etkileyecektir.

Solidity derleyicisi, derleme sürecinde ardışık depolama değişkenlerini paketler ve değişkenlerin depolanması için temel birim olarak 32 baytlık depolama yuvası kullanır. Değişken paketleme, değişkenlerin mantıklı bir şekilde düzenlenmesi yoluyla birden fazla değişkenin tek bir depolama yuvasına sığmasını sağlamaktır.

Bu ayrıntı ayarıyla, geliştiriciler 20.000 Gas birimi tasarruf edebilir. ( kullanılmamış bir depolama alanı depolamak 20.000 Gas) gerektirirken, şimdi sadece iki depolama alanı gerektiriyor.

Her depolama slotu Gas tükettiği için, değişkenlerin paketlenmesi, gereken depolama slotu sayısını azaltarak Gas kullanımını optimize eder.

Ethereum akıllı sözleşmelerin Gas optimizasyonu için en iyi on uygulama

3. Veri türlerini optimize et

Bir değişken birden fazla veri türü ile temsil edilebilir, ancak farklı veri türlerinin karşılık geldiği işlem maliyetleri de farklıdır. Uygun veri türünü seçmek, Gas kullanımını optimize etmeye yardımcı olur.

Örneğin, Solidity'de, tam sayılar farklı boyutlara ayrılabilir: uint8, uint16, uint32 vb. EVM 256 bitlik birimlerle işlem yaptığı için, uint8 kullanmak EVM'nin önce bunu uint256'ya dönüştürmesi gerektiği anlamına gelir ve bu dönüşüm ek Gaz tüketimine neden olur.

Ayrı ayrı bakıldığında, uint256 kullanmak uint8'den daha ucuzdur. Ancak, değişken paketleme optimizasyonu kullanıldığında durum farklıdır. Geliştiriciler dört uint8 değişkenini bir depolama slotuna paketleyebilirse, bunların toplam maliyeti dört uint256 değişkenine göre daha düşük olacaktır. Bu şekilde, akıllı sözleşmeler bir depolama slotunu bir kez okuyup yazabilir ve tek bir işlemle dört uint8 değişkenini belleğe/depoya yerleştirebilir.

Ethereum akıllı sözleşmelerin Gas optimizasyonu için en iyi 10 uygulama

4. Sabit boyutlu değişkenler kullanarak dinamik değişkenlerin yerine geçin.

Eğer veriler 32 bayt içinde kontrol edilebiliyorsa, bytes veya strings yerine bytes32 veri türünü kullanmanız önerilir. Genel olarak, sabit boyutlu değişkenler, değişken boyutlu değişkenlerden daha az Gas tüketir. Bayt uzunluğu sınırlanabiliyorsa, mümkün olduğunca bytes1 ile bytes32 arasındaki en küçük uzunluğu seçin.

5. Haritalar ve diziler

Solidity verileri iki veri türü ile temsil edilebilir: diziler (Arrays) ve haritalar (Mappings), ancak sözdizimi ve yapısı tamamen farklıdır.

Haritalama çoğu durumda daha yüksek verimlilik ve daha düşük maliyet sunar, ancak diziler yine de yinelemeye olanak tanır ve veri türü paketlemeyi destekler. Bu nedenle, veri listelerini yönetirken haritalamanın öncelikli olarak kullanılması önerilir, yalnızca yineleme yapılması gerektiğinde veya veri türü paketlemesi ile Gas tüketimini optimize edilebiliyorsa.

Ethereum akıllı sözleşmelerin Gas optimizasyonu için en iyi on uygulama

6. calldata yerine memory kullanma

Fonksiyon parametrelerinde bildirilen değişkenler calldata veya bellek (memory) içinde saklanabilir. İkisi arasındaki temel fark, belleğin fonksiyon tarafından değiştirilebilmesi, oysa calldata'nın değiştirilemez olmasıdır.

Bu ilkeyi unutmayın: Eğer fonksiyon parametreleri yalnızca okunabilir ise, öncelikli olarak calldata kullanılmalı, memory yerine. Bu, fonksiyon calldata'sından memory'ye gereksiz kopyalama işlemlerini önleyebilir.

calldata'dan doğrudan değer okunduğunda, aradaki memory işlemlerini atlayın. Bu optimizasyon yöntemi, Gas verimliliğini önemli ölçüde artırabilir.

7. Mümkünse Constant/Immutable anahtar kelimelerini kullanın

Constant/Immutable değişkenler sözleşmenin depolama alanında saklanmaz. Bu değişkenler derleme zamanında hesaplanır ve sözleşmenin bayt kodunda saklanır. Bu nedenle, depolamaya kıyasla erişim maliyetleri çok daha düşüktür, bu yüzden mümkünse Constant veya Immutable anahtar kelimelerinin kullanılması önerilir.

Ethereum akıllı sözleşmelerin Gas optimizasyonu için en iyi on uygulama

8. Taşma/alt taşma olmayacağından emin olduğunuzda Unchecked kullanın

Geliştiriciler, aritmetik işlemlerin taşma veya altına inme ile sonuçlanmayacağını belirleyebildiklerinde, Solidity v0.8.0 ile tanıtılan unchecked anahtar kelimesini kullanarak gereksiz taşma veya altına inme kontrollerinden kaçınabilir ve böylece Gas maliyetlerinden tasarruf edebilirler.

Ayrıca, 0.8.0 ve üzeri sürümlerdeki derleyiciler, SafeMath kütüphanesini kullanmayı gerektirmemektedir çünkü derleyici, taşma ve alt taşma koruma işlevlerini yerleşik olarak içermektedir.

9. Optimize Edittor

Değiştirici kodu, değiştirilmiş fonksiyonun içine gömülmüştür; her değiştirici kullanıldığında, kod kopyalanır. Bu, bytecode boyutunu artırır ve Gas tüketimini yükseltir. İç fonksiyona yeniden yapılandırarak, bu iç fonksiyonun değiştiricide yeniden kullanılmasına izin vererek bytecode boyutunu azaltabilir ve Gas maliyetlerini düşürebilirsiniz.

10. Kısa Yol Optimizasyonu

|| ve && operatörleri için, mantıksal işlemlerde kısa devre değerlendirmesi gerçekleşir, yani eğer birinci koşul mantıksal ifadenin sonucunu belirlemek için yeterliyse, ikinci koşul değerlendirilmeyecektir.

Gas tüketimini optimize etmek için, hesaplama maliyeti düşük olan koşulları öncelikli hale getirmek gerekir, böylece maliyeti yüksek olan hesaplamaların atlanması mümkün olabilir.

Ethereum akıllı sözleşmelerin Gas optimizasyonundaki en iyi on uygulama

Ek Genel Tavsiyeler

1. Gereksiz kodları sil

Eğer sözleşmede kullanılmayan bir fonksiyon veya değişken varsa, bunların silinmesi önerilir. Bu, sözleşme dağıtım maliyetlerini azaltmanın ve sözleşme boyutunu küçük tutmanın en doğrudan yoludur.

Aşağıda bazı pratik öneriler bulunmaktadır:

  • En verimli algoritmaları kullanarak hesaplama yapın. Eğer sözleşmede bazı hesaplamaların sonuçları doğrudan kullanılıyorsa, bu gereksiz hesaplama süreçleri ortadan kaldırılmalıdır. Özünde, kullanılmayan herhangi bir hesaplama silinmelidir.

  • Ethereum'da, geliştiriciler depolama alanı serbest bırakarak Gas ödülü kazanabilirler. Artık ihtiyaç duyulmayan bir değişken varsa, onu silmek için delete anahtar kelimesini kullanmalı veya varsayılan değere ayarlamalıdır.

  • Döngü optimizasyonu: Yüksek maliyetli döngü işlemlerinden kaçınmak, döngüleri mümkün olduğunca birleştirmek ve tekrarlayan hesaplamaları döngü gövdesinin dışına taşımak.

Ethereum akıllı sözleşmelerin Gas optimizasyonu için en iyi 10 uygulama

2. Önceden derlenmiş akıllı sözleşmeler kullanma

Önceden derlenmiş sözleşmeler, şifreleme ve hashleme işlemleri gibi karmaşık kütüphane fonksiyonları sunar. Kod EVM üzerinde değil, istemci düğümünde yerel olarak çalıştığı için gereken Gaz miktarı daha azdır. Önceden derlenmiş sözleşmeler, akıllı sözleşmelerin yürütülmesi için gereken hesaplama yükünü azaltarak Gaz tasarrufu sağlar.

Önceden derlenmiş sözleşme örnekleri arasında eliptik eğri dijital imza algoritması (ECDSA) ve SHA2-256 hash algoritması bulunmaktadır. Geliştiriciler, bu önceden derlenmiş sözleşmeleri akıllı sözleşmelerde kullanarak Gas maliyetlerini düşürebilir ve uygulamanın çalışma verimliliğini artırabilir.

3. İç içe yerleştirilmiş montaj kodu kullanma

İç içe montaj ( in-line assembly ), geliştiricilerin EVM tarafından doğrudan yürütülebilen düşük seviyeli ama etkili kodlar yazmasına olanak tanır ve pahalı Solidity işlem kodları kullanmadan bunu sağlar. İç içe montaj ayrıca bellek ve depolama kullanımını daha hassas bir şekilde kontrol etmeye olanak tanır ve böylece Gas ücretlerini daha da azaltır. Ayrıca, iç içe montaj, yalnızca Solidity kullanarak gerçekleştirilmesi zor olan bazı karmaşık işlemleri gerçekleştirebilir ve Gas tüketimini optimize etmek için daha fazla esneklik sağlar.

Ancak, iç içe montaj kullanmak da riskler taşıyabilir ve hata yapmaya açıktır. Bu nedenle, dikkatli kullanılmalı ve yalnızca deneyimli geliştiricilerin müdahale etmesiyle sınırlı olmalıdır.

Ethereum akıllı sözleşmelerinin Gas optimizasyonu için en iyi on uygulama

4. Layer 2 çözümleri kullanma

yapmak

GAS-2.56%
View Original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Reward
  • 6
  • Share
Comment
0/400
AlwaysAnonvip
· 07-09 16:21
Tüh, yine gas optimizasyonu tuzağı. Sıkıcı değil mi?
View OriginalReply0
ForkTonguevip
· 07-07 17:09
gas gerçekten harika L2'yi kim kullanırsa kullansın bilir
View OriginalReply0
NonFungibleDegenvip
· 07-07 01:27
gas ücreti gerçekten beni öldürüyor rn... ngmi ser
View OriginalReply0
AllTalkLongTradervip
· 07-07 01:20
Yorgunum yorgunum, gas ücreti ne alaka, doğrudan L2'ye geçtim.
View OriginalReply0
0xInsomniavip
· 07-07 01:16
gas bu kadar pahalıyken en iyi uygulamalardan bahsetmeye cesaret ediyorsun
View OriginalReply0
CryptoTherapistvip
· 07-07 01:10
bu gas kaygısını birlikte işleyelim... yüksek ücretlerden derin bir travma hissediyorum. dikkatli sözleşme optimizasyonu, duygusal ticaret istikrarı için anahtardır.
View OriginalReply0
Trade Crypto Anywhere Anytime
qrCode
Scan to download Gate app
Community
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)