Ethereum akıllı sözleşmeler Gas ücreti optimizasyon stratejileri ve uygulama kılavuzu

Ethereum akıllı sözleşmeler Gas ücreti optimizasyonu uygulama kılavuzu

Ethereum ana ağındaki Gas ücretleri, özellikle ağın yoğun olduğu zamanlarda, çözülmesi zor bir sorun olmaya devam ediyor. Yoğun saatlerde, kullanıcılar genellikle çok yüksek işlem ücretleri ödemek zorunda kalıyor. Bu nedenle, akıllı sözleşmeler geliştirme aşamasında Gas ücretlerinin optimize edilmesi kritik öneme sahiptir. Gas tüketimini optimize etmek, yalnızca işlem maliyetlerini etkili bir şekilde düşürmekle kalmaz, aynı zamanda işlem verimliliğini artırarak kullanıcılara daha ekonomik ve verimli bir blockchain kullanım deneyimi sunar.

Bu makale, Ethereum sanal makinesi ( EVM )'in Gas ücret mekanizmasını, Gas ücreti optimizasyonuna dair temel kavramları ve akıllı sözleşmeler geliştirilirken Gas ücreti optimizasyonu için en iyi uygulamaları özetleyecektir. Umarım bu içerikler geliştiricilere ilham ve pratik yardım sağlarken, aynı zamanda sıradan kullanıcıların EVM'in Gas ücretleri çalışma şekmini daha iyi anlamalarına yardımcı olur ve blockchain ekosistemindeki zorluklarla birlikte başa çıkmalarını sağlar.

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

EVM'nin Gas Ücreti Mekanizması Hakkında Kısa Bilgi

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

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

Her işlemin gerçekleştirilmesi için hesaplama kaynakları gerektiğinden, sonsuz döngüleri ve hizmet reddi ( DoS ) saldırılarını önlemek amacıyla belirli bir ücret alınacaktı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 ücreti aşağıdaki formülle hesaplanmaktadır:

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

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

1. EVM'deki Gas optimizasyonunu anlama

Solidity ile akıllı sözleşmeler derlendiğinde, sözleşme bir dizi "işlem koduna" yani opcodes'e 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 edilen bir Gas tüketim maliyeti vardır. Bu maliyetler Ethereum sarı kitabında kaydedilmiştir.

Birçok EIP değişikliğinden sonra, bazı işlem kodlarının Gas maliyetleri ayarlandı ve bu, sarı kitabın içeriğinden farklılık gösterebilir.

2.Gas optimizasyonunun temel kavramı

Gas optimizasyonunun temel ilkesi, EVM blok zincirinde 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 düşüktür:

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

Maliyetleri yüksek olan işlemler şunlardır:

  • Sözleşme depolamasında saklanan durum değişkenlerini okuma ve yazma
  • Harici fonksiyon çağrısı
  • Döngü işlemi

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

EVM Gaz Ü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 hazırladık. Bu uygulamalara uyarak, 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 Gaz tüketimi Memory( bellek)'den çok daha yüksektir. Her seferinde bir akıllı sözleşmenin depolamadan veri okuması veya yazması durumunda yüksek Gaz maliyetleri ortaya çıkar.

Ethereum sarı kitabının tanımına göre, depolama işlemlerinin maliyeti bellek işlemlerinin maliyetinden 100 kat daha fazladır. Örneğin, OPcodesmload ve mstore talimatları yalnızca 3 Gas ünitesi harcarken, depolama işlemleri olan sload ve sstore en ideal durumda bile en az 100 birim maliyet gerektirir.

Depolama kullanımını kısıtlama yöntemleri şunlardır:

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

Ethereum akıllı sözleşmelerinin Gas 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 gösterme biçimi, Gas ücretinin tüketimini büyük ölçüde etkileyecektir.

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

Bu ayrıntı ayarı ile geliştiriciler 20.000 Gas birimi tasarruf edebilir. Kullanılmamış bir depolama alanı depolamak 20.000 Gas( gerektiriyordu, ancak şimdi yalnızca iki depolama alanı gerekiyor.

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

![Ethereum akıllı sözleşmelerinin Gas optimizasyonu için en iyi on uygulama])https://img-cdn.gateio.im/webp-social/moments-30f0bc370a7b9ca65f3d623c31262b76.webp(

) 3. Veri türlerini optimize etme

Bir değişken birden fazla veri tipi ile temsil edilebilir, ancak farklı veri tiplerinin işlem maliyetleri de farklıdır. Uygun veri tipini seçmek, Gaz kullanımını optimize etmeye yardımcı olur.

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

Tek başına bakıldığında, burada uint256 kullanmak uint8'den daha ucuzdur. Ancak, daha önce önerdiğimiz değişken paketleme optimizasyonunu kullanırsak durum farklıdır. Geliştiriciler dört uint8 değişkenini bir depolama alanına paketleyebilirse, bunların toplam maliyeti dört uint256 değişkeninden daha düşük olacaktır. Bu şekilde, akıllı sözleşme bir depolama alanını bir kez okuyup yazabilir ve tek bir işlemde dört uint8 değişkenini belleğe/depolamaya yerleştirebilir.

![Ethereum akıllı sözleşmelerinin Gas optimizasyonu için en iyi 10 uygulama]###https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(

) 4. Sabit boyutlu değişkenler, dinamik değişkenler yerine kullanın

Eğer veriler 32 bayt içinde kontrol edilebiliyorsa, bytes veya strings yerine bytes32 veri tipinin kullanılmasını öneririz. Genel olarak, sabit boyutlu değişkenler, değişken boyutlu değişkenlere göre daha az Gas tüketir. Bayt uzunluğu sınırlanabiliyorsa, mümkünse bytes1'den bytes32'ye en küçük uzunluğu seçin.

![Ethereum akıllı sözleşmelerinin Gaz optimizasyonu için en iyi 10 uygulama]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(

) 5. Haritalar ve Diziler

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

Çoğu durumda, haritalama daha yüksek verimlilik ve daha düşük maliyet sağlar, ancak diziler yine de yinelemeli olup veri türü paketlemeyi destekler. Bu nedenle, veri listelerini yönetirken haritalamayı öncelikli olarak kullanmanız önerilir, yalnızca yineleme gerekiyorsa veya veri türü paketlemesi ile Gas tüketimini optimize edebiliyorsanız.

![Ethereum akıllı sözleşmelerinin Gas optimizasyonu için en iyi on uygulama])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(

) 6. calldata kullanarak memory yerine geçin

Fonksiyon parametrelerinde tanımlanan değişkenler calldata veya memory'de saklanabilir. İkisi arasındaki temel fark, memory'nin fonksiyon tarafından değiştirilebilmesi, calldata'nın ise değiştirilemez olmasıdır.

Bu prensibi unutmayın: Eğer fonksiyon parametreleri salt okunur ise, öncelikle calldata kullanmalısınız, memory yerine. Bu, fonksiyonun calldata'sından memory'ye gereksiz kopyalama işlemlerini önleyebilir.

![Ethereum akıllı sözleşmelerin Gas optimizasyonu için en iyi on uygulama]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(

) 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şmelerinin Gas optimizasyonu için en iyi 10 uygulama]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(

) 8. Taşma/alt taşma meydana gelmeyeceğinden emin olunarak Unchecked kullanın

Geliştiriciler aritmetik işlemlerin taşma veya alt sınır aşımına neden olmayacağını belirlediklerinde, gereksiz taşma veya alt sınır aşım kontrollerinden kaçınmak ve gaz maliyetlerini azaltmak için Solidity v0.8.0 ile tanıtılan unchecked anahtar kelimesini kullanabilirler.

Ayrıca, 0.8.0 ve üzeri sürümlerde derleyicinin artık SafeMath kütüphanesini kullanmasına gerek yoktur, çünkü derleyici kendisi taşma ve alt taşma koruma işlevselliğini içermektedir.

![Ethereum akıllı sözleşmelerin Gas optimizasyonu için en iyi 10 uygulama]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(

) 9. Optimizasyon Modülü

Değiştirici kodu, değiştirilmiş işlevin içine gömülmüştür, her değiştirici kullanıldığında, kod kopyalanır. Bu, bayt kodunun boyutunu artırır ve Gas tüketimini yükseltir.

İç fonksiyonu _checkOwner###( olarak yeniden yapılandırarak, bu iç fonksiyonun modülatör içinde tekrar kullanılmasına izin vermek, bytecode boyutunu azaltabilir ve Gas maliyetlerini düşürebilir.

![Ethereum akıllı sözleşmelerinin Gas optimizasyonu için en iyi on uygulama])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(

) 10. Kısa yol optimizasyonu

|| ve && operatörleri için, mantıksal işlemler kısa devre değerlendirmesi yapar; yani eğer ilk koşul mantıksal ifadenin sonucunu belirleyebiliyorsa, ikinci koşul değerlendirilmez.

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

![Ethereum akıllı sözleşmelerin Gas optimizasyonu için en iyi on uygulama]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(

Ek Genel Tavsiyeler

) 1. Gereksiz kodları sil

Eğer sözleşmede kullanılmayan fonksiyonlar veya değişkenler 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 direkt 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. Temelde, kullanılmayan herhangi bir hesaplama silinmelidir.

  • Ethereum'da geliştiriciler, depolama alanını serbest bırakarak Gas ödülleri kazanabilirler. Bir değişkene artık ihtiyaç duyulmuyorsa, 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çının, döngüleri mümkün olduğunca birleştirin ve tekrar eden hesaplamaları döngü gövdesinin dışına çıkarın.

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

Önceden derlenmiş sözleşmeler, şifreleme ve hash 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 Gas daha azdır. Önceden derlenmiş sözleşmelerin kullanımı, akıllı sözleşmelerin yürütülmesi için gereken hesaplama iş yükünü azaltarak Gas 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. Bu önceden derlenmiş sözleşmeleri akıllı sözleşmelerde kullanarak, geliştiriciler Gas maliyetlerini düşürebilir ve uygulamaların çalışma verimliliğini artırabilir.

) 3. Satır içi montaj kodu kullanımı

İç içe derleme ###in-line assembly (, geliştiricilerin EVM tarafından doğrudan yürütülebilen düşük seviyeli ama etkili kod yazmalarını sağlar, pahalı Solidity opcode'ları kullanmadan. İç içe derleme ayrıca bellek ve depolamanın 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 derleme, yalnızca Solidity kullanarak gerçekleştirilmesi zor olan bazı karmaşık işlemleri gerçekleştirebilir, bu da Gas tüketimini optimize etmek için daha fazla esneklik sunar.

Ancak, satır içi montaj kullanmak da riskler taşıyabilir.

ETH-2.88%
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
  • 3
  • Share
Comment
0/400
StrawberryIcevip
· 07-31 07:32
Gaz ücreti gerçekten acı verici.
View OriginalReply0
OnChainDetectivevip
· 07-31 07:22
Gazdan biraz tasarruf etmek, her şeydir.
View OriginalReply0
JustHodlItvip
· 07-31 07:06
değerli öngörüler dolu, harika!
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)