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.

ETH坊Akıllı Sözleşme的Gas优化十大最佳实践

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.

ETH坊Akıllı Sözleşme的Gas优化十大最佳实践

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.

ETH坊Akıllı Sözleşme的Gas优化十大最佳实践

Depolama kullanımını sınırlama yöntemleri şunları içerir:

  • Geçici verileri bellekte saklayın
  • 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.

ETH坊Akıllı Sözleşme的Gas优化十大最佳实践

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.

ETH坊Akıllı Sözleşme的Gas优化十大最佳实践

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.

ETH坊Akıllı Sözleşme的Gas优化十大最佳实践

ETH坊Akıllı Sözleşme的Gas优化十大最佳实践

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ı

ETH坊Akıllı Sözleşme'nin Gas optimizasyonu için en iyi 10 uygulaması

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

ETH坊Akıllı Sözleşme的Gas优化十大最佳实践

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:

Ethereum Akıllı Sözleşme'nin Gas Optimizasyonu On En İyi Uygulaması

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:

ETH坊Akıllı Sözleşme'nin Gas Optimizasyonu için On En İyi Uygulama

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.

ETH坊Akıllı Sözleşme的Gas优化十大最佳实践

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

ETH3.11%
GAS1.98%
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
  • 1
  • Repost
  • Share
Comment
0/400
IELTSvip
· 2024-12-31 01:14
2024 hızlı ve büyük bir pompaya sahip olması nedeniyle, BlackRock'un BTCETF'si "IBIT", "ETF tarihindeki en büyük lansman" olarak rapor ediliyor. #圣诞冒险岛:喜迎新年,$50,000福利派送中# #2024 Gate.io 年度账单# #荣誉积分新年抽奖,赢Macbook、周边好礼# BSV eth ethw etcDoge xrp adapepe
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)