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.
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
12 Likes
Reward
12
6
Share
Comment
0/400
AlwaysAnon
· 07-09 16:21
Tüh, yine gas optimizasyonu tuzağı. Sıkıcı değil mi?
View OriginalReply0
ForkTongue
· 07-07 17:09
gas gerçekten harika L2'yi kim kullanırsa kullansın bilir
View OriginalReply0
NonFungibleDegen
· 07-07 01:27
gas ücreti gerçekten beni öldürüyor rn... ngmi ser
View OriginalReply0
AllTalkLongTrader
· 07-07 01:20
Yorgunum yorgunum, gas ücreti ne alaka, doğrudan L2'ye geçtim.
View OriginalReply0
0xInsomnia
· 07-07 01:16
gas bu kadar pahalıyken en iyi uygulamalardan bahsetmeye cesaret ediyorsun
View OriginalReply0
CryptoTherapist
· 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.
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.
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.
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:
Maliyetli işlemler şunlardır:
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:
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.
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.
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.
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.
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.
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.
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.
4. Layer 2 çözümleri kullanma
yapmak