ETH ağı Ana Ağ'da gas ücreti her zaman büyük bir sorun olmuştur, özellikle ağ yoğunluğunda daha belirgin hale gelir. Zirve döneminde, kullanıcılar genellikle çok yüksek işlem ücretleri ödemek zorunda kalırlar. Bu nedenle, Akıllı Sözleşme geliştirme aşamasında gas ücreti optimizasyonu özellikle önemlidir. Gas tüketiminin optimize edilmesi, işlem maliyetini düşürmekle kalmaz, aynı zamanda işlem verimliliğini artırarak kullanıcılara daha ekonomik ve verimli bir blockchain deneyimi sunar.
Bu makalede, ETH ağı sanal makinesi (EVM) gas ücret mekanizması, gas ücret optimizasyonu ile ilgili temel kavramlar ve Akıllı Sözleşme geliştirirken gas ücretinin en iyi uygulamaları özetlenecektir. Bu içeriklerin geliştiricilere ilham vermesi ve pratik yardım sağlaması, aynı zamanda EVM'in gas ücreti operasyonlarının nasıl çalıştığını daha iyi anlamalarına yardımcı olması ve blok zincir ekosisteminin zorluklarına karşı birlikte mücadele etmeleri umulmaktadır.
[1]
EVM'nin Gas ücret mekanizması hakkında bir tanıtım
[2]
EVM uyumlu ağlarda, 'Gas', belirli bir işlemi gerçekleştirmek için gereken hesaplama gücünü ölçmek için kullanılan birimdir.
[3]
Aşağıdaki şekil, EVM'nin yapısal düzenini açıklar. Şekilde, gas tüketimi üç bölüme ayrılmıştır: işlem yürütme, dış mesaj çağrısı ve bellek ve depolama okuma ve yazma işlemleri.
Kaynak: Ethereum Ana Ağı###
Her işlemin yürütülmesi hesaplama kaynakları gerektirdiğinden, sonsuz döngüleri ve hizmet reddi (DoS) saldırılarını önlemek için bir ücret alınır. Bir işlemi tamamlamak için gereken ücret "gaz ücreti" olarak bilinir.
EIP-1559 (Londra Hard Fork) yürürlüğe girdikten sonra, Gas ücreti aşağıdaki formülle hesaplanır:
Gas ücreti = kullanılan gaz birimleri * (taban ücret + öncelikli ücret)
Temel ücret yok edilirken, öncelikli ücret teşvik olarak kullanılır ve doğrulayıcıları blok zincirine işlem eklemeye teşvik eder. Daha yüksek bir öncelikli ücret ayarlayarak işlem göndermek, işlemin bir sonraki bloğa dahil edilme olasılığını artırabilir. Bu, kullanıcıların doğrulayıcılara ödediği bir tür "bahşiş" gibi.
1. EVM'de Gas Optimizasyonunu Anlama
Solidity ile Akıllı Sözleşme derlendiğinde, sözleşme bir dizi 'işlem kodu' yani opcode olarak dönüştürülür.
Herhangi bir işlem kodu (örneğin akıllı sözleşme oluşturma, mesaj çağrısı yapma, hesap depolama erişimi ve sanal makinede işlem yürütme) belirli bir Gas tüketim maliyetine sahiptir, bu maliyetler ETH Sarı Kitabı###'de kayıtlıdır.
EIP'nin birkaç kez düzenlenmesinden sonra, bazı işlem kodlarının gas maliyeti ayarlandı ve sarı kitapla farklılık gösterebilir. İşlem kodlarının en son maliyetiyle ilgili ayrıntılı bilgiler için buraya bakabilirsiniz: ###.
[4]
2. Gas Optimizasyonu Temel Kavramı
Gas optimizasyonunun temel fikri, EVM blok zincirinde maliyet etkinliği yüksek işlemleri öncelikli olarak seçmek ve maliyetli Gas işlemlerinden kaçınmaktır.
EVM'de, aşağıdaki işlem maliyeti düşüktür:
Bellek değişkenlerini oku/yaz
Sabit ve değişmez değişkenleri okuyun
Yerel değişkenleri oku/yaz
calldata değişkenlerini okuyun, örneğin calldata dizisi ve yapı
İç işlev çağrısı
[1]
Yüksek maliyetli işlemler şunları içerir:
[2]
Akıllı sözleşmelerde saklanan durum değişkenlerinin sözleşme depolamasında okunup yazılması
Dış fonksiyon çağrısı
Döngü işlemi
[3]
[4] EVM Gas ücreti en iyi uygulama
Yukarıdaki temel kavramlara dayanarak, geliştirici topluluğu için bir gaz ücreti optimizasyonu en iyi uygulama listesi derledik. Bu uygulamaları takip ederek, geliştiriciler akıllı sözleşmelerin gaz tüketimini düşürebilir, işlem maliyetini düşürebilir ve daha verimli ve kullanıcı dostu uygulamalar oluşturabilirler.
1. Olabildiğince az depolama kullanın
Solidity'de, Storage (depolama) sınırlı bir kaynaktır ve Gas tüketimi Memory'den (bellek) çok daha yüksektir. Her Akıllı Sözleşme depolamadan veri okuyup yazdığında, yüksek miktarda Gas maliyeti ortaya çıkar.
ETH ağı sarı kitabına göre, depolama işlemlerinin maliyeti bellek işlemlerinden 100 kat daha yüksektir. Örneğin, OPcodesmload ve mstore komutları yalnızca 3 gas birimi tüketirken, sload ve sstore gibi depolama işlemleri, en ideal durumda bile en az 100 birim maliyet gerektirir.
Depolama değişiklik sayısını azaltın: Ara sonuçları bellekte tutarak, tüm hesaplamalar tamamlandıktan sonra sonuçları depolama değişkenlerine atayın.
2. Değişken Paketleme
Akıllı Sözleşme中使用的 Storage slot(存储槽)的数量以及开发者表示数据的方式会极大影响 Gas 费的消耗。
Solidity derleyici, derleme sürecinde ardışık depolama değişkenlerini paketler ve değişken depolamasının temel birimi olarak 32 bayt depolama yuvasını kullanır. Değişken paketleme, değişkenleri uygun şekilde düzenleyerek birden fazla değişkenin tek bir depolama yuvasına sığmasını sağlar.
Sol tarafta verimliliği düşük bir uygulama şekli, 3 depolama yuvasını tüketir; sağ tarafta daha verimli bir uygulama şekli bulunmaktadır.
Bu ayrıntının ayarlanmasıyla, geliştiriciler 20.000 Gaz ünitesi (kullanılmayan bir depolama yuvasının depolanması 20.000 Gaz tüketir) tasarruf edebilirler, ancak şimdi sadece iki depolama yuvasına ihtiyaç duyulmaktadır.
Her bir depolama yuvasının Gas tükettiği için, değişken paketlemesi, gerekli olan depolama yuvası sayısını azaltarak Gas kullanımını optimize etmek için yapılır.
3. Veri türlerini optimize etme
Bir değişken birden fazla veri türü ile ifade edilebilir, ancak farklı veri türleri için operasyon 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, tamsayılar farklı boyutlara ayrılabilir: uint8, uint16, uint32 vb. EVM, işlemleri 256 bitlik bir birim olarak yürüttüğü için, uint8 kullanmak, EVM'in önce bunu uint256'ya dönüştürmesi gerektiği anlamına gelir ve bu dönüşüm ekstra gas tüketir.
Kod içinde uint8 ve uint256'nın Gas maliyetini karşılaştırarak UseUint() fonksiyonu 120,382 Gas birimi tüketirken, UseUInt8() fonksiyonu 166,111 Gas birimi tüketir.
Tek başına bakıldığında, burada uint256'nın uint8'den daha ucuz olduğunu görebiliriz. Ancak, daha önce önerdiğimiz değişken paketleme optimizasyonunu kullanırsak durum değişir. Geliştiriciler dört uint8 değişkenini bir depolama yuvasına paketleyebilirse, onları toplamak için maliyetleri dört uint256 değişkeninden daha düşük olacaktır. Bu şekilde, Akıllı Sözleşme bir depolama yuvasını bir kez okuyup yazabilir ve bir işlemde dört uint8 değişkenini belleğe / depolamaya yerleştirebilir.
4. Sabit boyutlu değişkenlerin dinamik değişkenlerle değiştirilmesi
Eğer veri 32 bayt içinde kontrol edilebilirse, bytes veya strings yerine bytes32 veri türünü kullanmanız önerilir. Genellikle, değişken boyutlu değişkenlere göre sabit boyutlu değişkenlerin daha az gas tüketmesi beklenir. Bayt uzunluğu sınırlanabiliyorsa, en az bayt1'den bayt32'ye kadar olan minimum uzunluğu seçmeye çalışın.
5. Eşlemeler ve Diziler
Solidity'nin veri listeleri, iki farklı veri türüyle temsil edilebilir: Diziler (Arrays) ve Eşlemeler (Mappings), ancak onların sözdizimi ve yapısı tamamen farklıdır.
Çoğu durumda daha yüksek verimlilik ve daha düşük maliyeti olan bir eşleme kullanmayı öneririz, ancak diziler yine de yineleyici özelliklere sahiptir ve veri tipi paketlemeyi destekler. Bu nedenle, veri listelerini yönetirken, yineleme gerektiği veya Gas tüketimini veri tipi paketlemesiyle optimize etmek mümkün olduğu sürece, öncelikle bir eşleme kullanmanız önerilir.
6. memory yerine calldata kullanın
Fonksiyon parametrelerinde tanımlanan değişkenler calldata veya bellekte saklanabilir. İkilinin ana farkı, belleğin fonksiyon tarafından değiştirilebilmesi, ancak calldata'ın değiştirilemez olmasıdır.
Bu prensibi unutmayın: Eğer fonksiyon parametreleri sadece okunabilirse, memory yerine calldata'ı tercih etmelisiniz. Bu şekilde, fonksiyon calldata'dan memory'e gereksiz kopyalama işlemlerinden kaçınabilirsiniz.
Örnek 1: Bellek kullanarak
memory anahtar kelimesi kullanıldığında, dizinin değerleri ABI çözme sürecinde kodlanmış calldata'dan belleğe kopyalanır. Bu kod bloğunun işlem maliyeti 3,694 Gas birimindedir.
Örnek 2: calldata kullanımı
calldata değerlerini doğrudan okurken, ara bellek işlemlerini atlayın. Bu optimizasyon yöntemi, maliyeti sadece 2.413 Gas birimine düşürerek Gas verimliliğini %35 artırır.
7. Constant/Immutable anahtar kelimesini mümkün olduğunca kullanın
Constant/Immutable değişkenler sözleşmenin depolama alanında saklanmaz. Bu değişkenler derleme sırasında hesaplanır ve sözleşmenin bayt kodunda saklanır. Bu nedenle erişim maliyetleri depolamaya göre çok daha düşüktür, bu yüzden mümkünse Constant veya Immutable anahtar kelimelerini kullanmanız önerilir.
8. Taşmalar ve aşmalar olmayacağından emin olduğunuzda Unchecked kullanın
Geliştiriciler, aritmetik işlemlerin taşma veya alt taşmaya yol açmayacağını belirlediğinde, Solidity v0.8.0'de tanıtılan unchecked anahtar kelimesini kullanarak gereksiz taşma veya alt taşma kontrollerinden kaçınabilir ve böylece Gas maliyetlerini azaltabilir.
Resimde, koşullara bağlı olarak i
Ayrıca, 0.8.0 ve üstü derleyiciler, taşma ve alt taşma koruma özelliklerini derleyici içinde dahili olarak içerdiği için artık SafeMath kütüphanesini kullanmaya gerek duymaz.
9. Optimizasyon Düzenleyicisi
Değiştiricinin kodu değiştirilmiş işlevlere gömülür, her kullanıldığında kodu kopyalanır. Bu, bytecode boyutunu artırır ve Gas tüketimini artırır. Aşağıdaki, bir değiştirici Gas maliyetini optimize etme yöntemidir:
Optimizasyon öncesi:
Optimize edildikten sonra:
! [Akıllı Sözleşme'den Gaz Optimizasyonu için En İyi 10 Uygulama] (https://cdn-img.panewslab.com/yijian/2024/12/30/images/df60343780f702692bf7f465b390fa4f.jpg)
Bu örnekte, mantığı iç işlev _checkOwner() olarak yeniden yapılandırarak, bu iç işlevi değiştiricide tekrar kullanmanıza izin vererek, bytecode boyutunu azaltabilir ve işlem maliyetini düşürebilirsiniz.
10. Kısa Devre Optimizasyonu
|| ve && operatörleri için, mantıksal operasyon 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, düşük maliyetli hesaplama koşullarını önce yerleştirmek, yüksek maliyetli hesaplamaları atlama olasılığı sağlayabilir.
Genel tavsiye eklendi
1. Silinmeyen kodları kaldırın
Eğer kontratta kullanılmayan bir fonksiyon veya değişken varsa, onları silmenizi öneririz. Bu, kontratın dağıtım maliyetini azaltmanın ve kontrat boyutunu küçük tutmanın en doğrudan yoludur.
Aşağıda bazı pratik öneriler bulunmaktadır:
Hesaplamalar için en verimli algoritmayı kullanın. Sözleşme içinde doğrudan kullanılan bazı hesaplamaların sonuçları varsa, bu gereksiz hesaplama süreçleri kaldırılmalıdır. Esas olarak, kullanılmayan herhangi bir hesaplama silinmelidir.
ETH blok zincirinde, geliştiriciler depolama alanı serbest bırakarak Gas ödülleri kazanabilirler. Bir değişken artık gerekli değilse, silmek için delete anahtar kelimesini kullanın veya varsayılan değere ayarlayın.
Döngü optimizasyonu: Yüksek maliyetli döngü işlemlerinden kaçının, mümkün olduğunca döngüleri birleştirin ve tekrar hesaplamaları döngü dışına çıkarın.
2. Ön derlemeli sözleşme kullanma
Ön derleme sözleşmeleri karmaşık kütüphane işlevleri sunar, örneğin şifreleme ve karma işlemleri. Kodun EVM üzerinde değil, istemci düğümünde yerel olarak çalıştırıldığından daha az gas gerekir. Ön derleme sözleşmeleri kullanarak Akıllı Sözleşme yürütme için gereken hesaplama iş yükünü azaltarak gas tasarrufu sağlanabilir.
Ön derleme sözleşmelerinin örnekleri, Akıllı Sözleşmeler içinde bu ön derleme sözleşmelerini kullanarak geliştiriciler işlem ücretlerini düşürüp uygulamanın çalışma verimliliğini artırabilirler.
ETH ağı tarafından desteklenen önceden derlenmiş sözleşmelerin tam listesi için buraya bakın。
3. Kullanımı İç İşlem Kodu
İç içe montaj (in-line assembly), geliştiricilere EVM tarafından doğrudan yürütülebilen düşük seviyeli ancak verimli kodlar yazmalarına olanak tanır, bu da pahalı Solidity işlem kodlarına gerek kalmadan. İç içe montaj ayrıca bellek ve depolama kullanımını daha hassas bir şekilde kontrol etmeyi ve böylece Gas ücretini daha da azaltmayı sağlar. Ayrıca, iç içe montaj, Solidity ile zor olan bazı karmaşık işlemleri gerçekleştirebilir ve gaz tüketimini optimize etmek için daha fazla esneklik sağlar.
Aşağıda Gas tasarrufu için iç içe geçmiş derleme kodunu kullanmanın bir örneği verilmiştir:
Yukarıdaki grafikten, ikinci senaryonun, standart senaryoya kıyasla daha yüksek bir Gas verimliliğine sahip olduğu görülebilir.
Ancak, iç içe montaj kullanmak da riskleri beraberinde getirebilir ve hatalara yol açabilir. Bu nedenle dikkatli kullanılmalı, sadece deneyimli geliştiriciler tarafından işletilmelidir.
4. Layer 2 çözümünü kullanma
Layer 2 çözümü kullanarak, ETH Ana Ağ'da depolanan ve hesaplanan veri miktarı azaltılabilir.
Rollup'lar, yan zincirler ve durum kanalları gibi 2. Katman çözümleri, işlemleri ana ETH zincirinden boşaltarak daha hızlı ve daha ucuz işlemler sağlayabilir.
Birçok işlemi bir arada bağlayarak, bu çözümler zincirdeki işlem sayısını azaltarak gas ücretlerini düşürür. Layer 2 çözümleri kullanarak, Ethereum'un ölçeklenebilirliği artırılabilir, böylece daha fazla kullanıcı ve uygulama ağa katılabilir ve ağın tıkanmasına neden olmadan işlem yapabilir.
5. Optimizasyon araçlarını ve kütüphaneleri kullanma
solc optimize edici, Truffle'ın yapı optimize edicisi ve Remix'in Solidity derleyicisi gibi çeşitli optimizasyon araçları mevcuttur.
Bu araçlar, bayt kodunun boyutunu en aza indirmeye, gereksiz kodu kaldırmaya ve Akıllı Sözleşme'yi gerçekleştirmek için gereken işlem sayısını azaltmaya yardımcı olabilir. Geliştiriciler, "solmate" gibi diğer gaz optimizasyon kütüphaneleriyle birleştiğinde, gaz maliyetlerini etkili bir şekilde düşürebilir ve Akıllı Sözleşme'nin verimliliğini artırabilir.
Sonuç
Gas tüketimini optimize etmek, geliştiriciler için önemli bir adımdır, hem İşlem Maliyetini en aza indirmek hem de Akıllı Sözleşmelerin EVM uyumlu ağında verimliliği artırmak için. Maliyet tasarrufu sağlayan işlemleri öncelikli olarak yürüterek, depolama kullanımını azaltarak, iç içe montajı kullanarak ve bu makalede tartışılan diğer en iyi uygulamalara uyarak, geliştiriciler sözleşme Gas tüketimini etkin bir şekilde düşürebilirler.
Ancak, optimize sürecinde geliştiricilerin güvenlik açıklarına neden olmamak için dikkatli olmaları gerektiği unutulmamalıdır. Kod optimizasyonu ve gas tüketimini azaltma sürecinde, asla akıllı sözleşmenin doğal güvenliğini tehlikeye atmamalısınız.
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.
ETH坊akıllı sözleşme的gas优化十大最佳实践
ETH ağı Ana Ağ'da gas ücreti her zaman büyük bir sorun olmuştur, özellikle ağ yoğunluğunda daha belirgin hale gelir. Zirve döneminde, kullanıcılar genellikle çok yüksek işlem ücretleri ödemek zorunda kalırlar. Bu nedenle, Akıllı Sözleşme geliştirme aşamasında gas ücreti optimizasyonu özellikle önemlidir. Gas tüketiminin optimize edilmesi, işlem maliyetini düşürmekle kalmaz, aynı zamanda işlem verimliliğini artırarak kullanıcılara daha ekonomik ve verimli bir blockchain deneyimi sunar.
Bu makalede, ETH ağı sanal makinesi (EVM) gas ücret mekanizması, gas ücret optimizasyonu ile ilgili temel kavramlar ve Akıllı Sözleşme geliştirirken gas ücretinin en iyi uygulamaları özetlenecektir. Bu içeriklerin geliştiricilere ilham vermesi ve pratik yardım sağlaması, aynı zamanda EVM'in gas ücreti operasyonlarının nasıl çalıştığını daha iyi anlamalarına yardımcı olması ve blok zincir ekosisteminin zorluklarına karşı birlikte mücadele etmeleri umulmaktadır. [1]
EVM'nin Gas ücret mekanizması hakkında bir tanıtım
[2] EVM uyumlu ağlarda, 'Gas', belirli bir işlemi gerçekleştirmek için gereken hesaplama gücünü ölçmek için kullanılan birimdir. [3] Aşağıdaki şekil, EVM'nin yapısal düzenini açıklar. Şekilde, gas tüketimi üç bölüme ayrılmıştır: işlem yürütme, dış mesaj çağrısı ve bellek ve depolama okuma ve yazma işlemleri.
Her işlemin yürütülmesi hesaplama kaynakları gerektirdiğinden, sonsuz döngüleri ve hizmet reddi (DoS) saldırılarını önlemek için bir ücret alınır. Bir işlemi tamamlamak için gereken ücret "gaz ücreti" olarak bilinir.
EIP-1559 (Londra Hard Fork) yürürlüğe girdikten sonra, Gas ücreti aşağıdaki formülle hesaplanır:
Gas ücreti = kullanılan gaz birimleri * (taban ücret + öncelikli ücret)
Temel ücret yok edilirken, öncelikli ücret teşvik olarak kullanılır ve doğrulayıcıları blok zincirine işlem eklemeye teşvik eder. Daha yüksek bir öncelikli ücret ayarlayarak işlem göndermek, işlemin bir sonraki bloğa dahil edilme olasılığını artırabilir. Bu, kullanıcıların doğrulayıcılara ödediği bir tür "bahşiş" gibi.
1. EVM'de Gas Optimizasyonunu Anlama
Solidity ile Akıllı Sözleşme derlendiğinde, sözleşme bir dizi 'işlem kodu' yani opcode olarak dönüştürülür.
Herhangi bir işlem kodu (örneğin akıllı sözleşme oluşturma, mesaj çağrısı yapma, hesap depolama erişimi ve sanal makinede işlem yürütme) belirli bir Gas tüketim maliyetine sahiptir, bu maliyetler ETH Sarı Kitabı###'de kayıtlıdır.
EIP'nin birkaç kez düzenlenmesinden sonra, bazı işlem kodlarının gas maliyeti ayarlandı ve sarı kitapla farklılık gösterebilir. İşlem kodlarının en son maliyetiyle ilgili ayrıntılı bilgiler için buraya bakabilirsiniz: ###. [4]
2. Gas Optimizasyonu Temel Kavramı
Gas optimizasyonunun temel fikri, EVM blok zincirinde maliyet etkinliği yüksek işlemleri öncelikli olarak seçmek ve maliyetli Gas işlemlerinden kaçınmaktır.
EVM'de, aşağıdaki işlem maliyeti düşüktür:
Yukarıdaki temel kavramlara dayanarak, geliştirici topluluğu için bir gaz ücreti optimizasyonu en iyi uygulama listesi derledik. Bu uygulamaları takip ederek, geliştiriciler akıllı sözleşmelerin gaz tüketimini düşürebilir, işlem maliyetini düşürebilir ve daha verimli ve kullanıcı dostu uygulamalar oluşturabilirler.
1. Olabildiğince az depolama kullanın
Solidity'de, Storage (depolama) sınırlı bir kaynaktır ve Gas tüketimi Memory'den (bellek) çok daha yüksektir. Her Akıllı Sözleşme depolamadan veri okuyup yazdığında, yüksek miktarda Gas maliyeti ortaya çıkar.
ETH ağı sarı kitabına göre, depolama işlemlerinin maliyeti bellek işlemlerinden 100 kat daha yüksektir. Örneğin, OPcodesmload ve mstore komutları yalnızca 3 gas birimi tüketirken, sload ve sstore gibi depolama işlemleri, en ideal durumda bile en az 100 birim maliyet gerektirir.
Depolama kullanımını sınırlama yöntemleri şunları içerir:
2. Değişken Paketleme
Akıllı Sözleşme中使用的 Storage slot(存储槽)的数量以及开发者表示数据的方式会极大影响 Gas 费的消耗。
Solidity derleyici, derleme sürecinde ardışık depolama değişkenlerini paketler ve değişken depolamasının temel birimi olarak 32 bayt depolama yuvasını kullanır. Değişken paketleme, değişkenleri uygun şekilde düzenleyerek birden fazla değişkenin tek bir depolama yuvasına sığmasını sağlar.
Sol tarafta verimliliği düşük bir uygulama şekli, 3 depolama yuvasını tüketir; sağ tarafta daha verimli bir uygulama şekli bulunmaktadır.
Bu ayrıntının ayarlanmasıyla, geliştiriciler 20.000 Gaz ünitesi (kullanılmayan bir depolama yuvasının depolanması 20.000 Gaz tüketir) tasarruf edebilirler, ancak şimdi sadece iki depolama yuvasına ihtiyaç duyulmaktadır.
Her bir depolama yuvasının Gas tükettiği için, değişken paketlemesi, gerekli olan depolama yuvası sayısını azaltarak Gas kullanımını optimize etmek için yapılır.
3. Veri türlerini optimize etme
Bir değişken birden fazla veri türü ile ifade edilebilir, ancak farklı veri türleri için operasyon 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, tamsayılar farklı boyutlara ayrılabilir: uint8, uint16, uint32 vb. EVM, işlemleri 256 bitlik bir birim olarak yürüttüğü için, uint8 kullanmak, EVM'in önce bunu uint256'ya dönüştürmesi gerektiği anlamına gelir ve bu dönüşüm ekstra gas tüketir.
Kod içinde uint8 ve uint256'nın Gas maliyetini karşılaştırarak UseUint() fonksiyonu 120,382 Gas birimi tüketirken, UseUInt8() fonksiyonu 166,111 Gas birimi tüketir.
Tek başına bakıldığında, burada uint256'nın uint8'den daha ucuz olduğunu görebiliriz. Ancak, daha önce önerdiğimiz değişken paketleme optimizasyonunu kullanırsak durum değişir. Geliştiriciler dört uint8 değişkenini bir depolama yuvasına paketleyebilirse, onları toplamak için maliyetleri dört uint256 değişkeninden daha düşük olacaktır. Bu şekilde, Akıllı Sözleşme bir depolama yuvasını bir kez okuyup yazabilir ve bir işlemde dört uint8 değişkenini belleğe / depolamaya yerleştirebilir.
4. Sabit boyutlu değişkenlerin dinamik değişkenlerle değiştirilmesi
Eğer veri 32 bayt içinde kontrol edilebilirse, bytes veya strings yerine bytes32 veri türünü kullanmanız önerilir. Genellikle, değişken boyutlu değişkenlere göre sabit boyutlu değişkenlerin daha az gas tüketmesi beklenir. Bayt uzunluğu sınırlanabiliyorsa, en az bayt1'den bayt32'ye kadar olan minimum uzunluğu seçmeye çalışın.
5. Eşlemeler ve Diziler
Solidity'nin veri listeleri, iki farklı veri türüyle temsil edilebilir: Diziler (Arrays) ve Eşlemeler (Mappings), ancak onların sözdizimi ve yapısı tamamen farklıdır.
Çoğu durumda daha yüksek verimlilik ve daha düşük maliyeti olan bir eşleme kullanmayı öneririz, ancak diziler yine de yineleyici özelliklere sahiptir ve veri tipi paketlemeyi destekler. Bu nedenle, veri listelerini yönetirken, yineleme gerektiği veya Gas tüketimini veri tipi paketlemesiyle optimize etmek mümkün olduğu sürece, öncelikle bir eşleme kullanmanız önerilir.
6. memory yerine calldata kullanın
Fonksiyon parametrelerinde tanımlanan değişkenler calldata veya bellekte saklanabilir. İkilinin ana farkı, belleğin fonksiyon tarafından değiştirilebilmesi, ancak calldata'ın değiştirilemez olmasıdır.
Bu prensibi unutmayın: Eğer fonksiyon parametreleri sadece okunabilirse, memory yerine calldata'ı tercih etmelisiniz. Bu şekilde, fonksiyon calldata'dan memory'e gereksiz kopyalama işlemlerinden kaçınabilirsiniz.
Örnek 1: Bellek kullanarak
![Ethereum akıllı sözleşmelerinin Gas optimizasyonu için en iyi 10 uygulama uygulaması]()
memory anahtar kelimesi kullanıldığında, dizinin değerleri ABI çözme sürecinde kodlanmış calldata'dan belleğe kopyalanır. Bu kod bloğunun işlem maliyeti 3,694 Gas birimindedir.
Örnek 2: calldata kullanımı
calldata değerlerini doğrudan okurken, ara bellek işlemlerini atlayın. Bu optimizasyon yöntemi, maliyeti sadece 2.413 Gas birimine düşürerek Gas verimliliğini %35 artırır.
7. Constant/Immutable anahtar kelimesini mümkün olduğunca kullanın
Constant/Immutable değişkenler sözleşmenin depolama alanında saklanmaz. Bu değişkenler derleme sırasında hesaplanır ve sözleşmenin bayt kodunda saklanır. Bu nedenle erişim maliyetleri depolamaya göre çok daha düşüktür, bu yüzden mümkünse Constant veya Immutable anahtar kelimelerini kullanmanız önerilir.
8. Taşmalar ve aşmalar olmayacağından emin olduğunuzda Unchecked kullanın
Geliştiriciler, aritmetik işlemlerin taşma veya alt taşmaya yol açmayacağını belirlediğinde, Solidity v0.8.0'de tanıtılan unchecked anahtar kelimesini kullanarak gereksiz taşma veya alt taşma kontrollerinden kaçınabilir ve böylece Gas maliyetlerini azaltabilir.
Resimde, koşullara bağlı olarak i
Ayrıca, 0.8.0 ve üstü derleyiciler, taşma ve alt taşma koruma özelliklerini derleyici içinde dahili olarak içerdiği için artık SafeMath kütüphanesini kullanmaya gerek duymaz.
9. Optimizasyon Düzenleyicisi
Değiştiricinin kodu değiştirilmiş işlevlere gömülür, her kullanıldığında kodu kopyalanır. Bu, bytecode boyutunu artırır ve Gas tüketimini artırır. Aşağıdaki, bir değiştirici Gas maliyetini optimize etme yöntemidir:
Optimizasyon öncesi:
Optimize edildikten sonra:
! [Akıllı Sözleşme'den Gaz Optimizasyonu için En İyi 10 Uygulama] (https://cdn-img.panewslab.com/yijian/2024/12/30/images/df60343780f702692bf7f465b390fa4f.jpg)
Bu örnekte, mantığı iç işlev _checkOwner() olarak yeniden yapılandırarak, bu iç işlevi değiştiricide tekrar kullanmanıza izin vererek, bytecode boyutunu azaltabilir ve işlem maliyetini düşürebilirsiniz.
10. Kısa Devre Optimizasyonu
|| ve && operatörleri için, mantıksal operasyon 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, düşük maliyetli hesaplama koşullarını önce yerleştirmek, yüksek maliyetli hesaplamaları atlama olasılığı sağlayabilir.
Genel tavsiye eklendi
1. Silinmeyen kodları kaldırın
Eğer kontratta kullanılmayan bir fonksiyon veya değişken varsa, onları silmenizi öneririz. Bu, kontratın dağıtım maliyetini azaltmanın ve kontrat boyutunu küçük tutmanın en doğrudan yoludur.
Aşağıda bazı pratik öneriler bulunmaktadır:
Hesaplamalar için en verimli algoritmayı kullanın. Sözleşme içinde doğrudan kullanılan bazı hesaplamaların sonuçları varsa, bu gereksiz hesaplama süreçleri kaldırılmalıdır. Esas olarak, kullanılmayan herhangi bir hesaplama silinmelidir.
ETH blok zincirinde, geliştiriciler depolama alanı serbest bırakarak Gas ödülleri kazanabilirler. Bir değişken artık gerekli değilse, silmek için delete anahtar kelimesini kullanın veya varsayılan değere ayarlayın.
Döngü optimizasyonu: Yüksek maliyetli döngü işlemlerinden kaçının, mümkün olduğunca döngüleri birleştirin ve tekrar hesaplamaları döngü dışına çıkarın.
2. Ön derlemeli sözleşme kullanma
Ön derleme sözleşmeleri karmaşık kütüphane işlevleri sunar, örneğin şifreleme ve karma işlemleri. Kodun EVM üzerinde değil, istemci düğümünde yerel olarak çalıştırıldığından daha az gas gerekir. Ön derleme sözleşmeleri kullanarak Akıllı Sözleşme yürütme için gereken hesaplama iş yükünü azaltarak gas tasarrufu sağlanabilir.
Ön derleme sözleşmelerinin örnekleri, Akıllı Sözleşmeler içinde bu ön derleme sözleşmelerini kullanarak geliştiriciler işlem ücretlerini düşürüp uygulamanın çalışma verimliliğini artırabilirler.
ETH ağı tarafından desteklenen önceden derlenmiş sözleşmelerin tam listesi için buraya bakın。
3. Kullanımı İç İşlem Kodu
İç içe montaj (in-line assembly), geliştiricilere EVM tarafından doğrudan yürütülebilen düşük seviyeli ancak verimli kodlar yazmalarına olanak tanır, bu da pahalı Solidity işlem kodlarına gerek kalmadan. İç içe montaj ayrıca bellek ve depolama kullanımını daha hassas bir şekilde kontrol etmeyi ve böylece Gas ücretini daha da azaltmayı sağlar. Ayrıca, iç içe montaj, Solidity ile zor olan bazı karmaşık işlemleri gerçekleştirebilir ve gaz tüketimini optimize etmek için daha fazla esneklik sağlar.
Aşağıda Gas tasarrufu için iç içe geçmiş derleme kodunu kullanmanın bir örneği verilmiştir:
Yukarıdaki grafikten, ikinci senaryonun, standart senaryoya kıyasla daha yüksek bir Gas verimliliğine sahip olduğu görülebilir.
Ancak, iç içe montaj kullanmak da riskleri beraberinde getirebilir ve hatalara yol açabilir. Bu nedenle dikkatli kullanılmalı, sadece deneyimli geliştiriciler tarafından işletilmelidir.
4. Layer 2 çözümünü kullanma
Layer 2 çözümü kullanarak, ETH Ana Ağ'da depolanan ve hesaplanan veri miktarı azaltılabilir.
Rollup'lar, yan zincirler ve durum kanalları gibi 2. Katman çözümleri, işlemleri ana ETH zincirinden boşaltarak daha hızlı ve daha ucuz işlemler sağlayabilir.
Birçok işlemi bir arada bağlayarak, bu çözümler zincirdeki işlem sayısını azaltarak gas ücretlerini düşürür. Layer 2 çözümleri kullanarak, Ethereum'un ölçeklenebilirliği artırılabilir, böylece daha fazla kullanıcı ve uygulama ağa katılabilir ve ağın tıkanmasına neden olmadan işlem yapabilir.
5. Optimizasyon araçlarını ve kütüphaneleri kullanma
solc optimize edici, Truffle'ın yapı optimize edicisi ve Remix'in Solidity derleyicisi gibi çeşitli optimizasyon araçları mevcuttur.
Bu araçlar, bayt kodunun boyutunu en aza indirmeye, gereksiz kodu kaldırmaya ve Akıllı Sözleşme'yi gerçekleştirmek için gereken işlem sayısını azaltmaya yardımcı olabilir. Geliştiriciler, "solmate" gibi diğer gaz optimizasyon kütüphaneleriyle birleştiğinde, gaz maliyetlerini etkili bir şekilde düşürebilir ve Akıllı Sözleşme'nin verimliliğini artırabilir.
Sonuç
Gas tüketimini optimize etmek, geliştiriciler için önemli bir adımdır, hem İşlem Maliyetini en aza indirmek hem de Akıllı Sözleşmelerin EVM uyumlu ağında verimliliği artırmak için. Maliyet tasarrufu sağlayan işlemleri öncelikli olarak yürüterek, depolama kullanımını azaltarak, iç içe montajı kullanarak ve bu makalede tartışılan diğer en iyi uygulamalara uyarak, geliştiriciler sözleşme Gas tüketimini etkin bir şekilde düşürebilirler.
Ancak, optimize sürecinde geliştiricilerin güvenlik açıklarına neden olmamak için dikkatli olmaları gerektiği unutulmamalıdır. Kod optimizasyonu ve gas tüketimini azaltma sürecinde, asla akıllı sözleşmenin doğal güvenliğini tehlikeye atmamalısınız.
:
:
:
:precompiled