1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 044 : Gas Tasarrufu

🧵 #100GündeSolidity 044 : Gas Tasarrufu
Gas Tasarrufu Teknikleri: Akıllı Sözleşmeleri Daha Verimli Hale Getirmenin Yolları
0

Gas Tasarrufu Teknikleri: Akıllı Sözleşmeleri Daha Verimli Hale Getirmenin Yolları

Gas tasarrufu teknikleri, Solidity diliyle akıllı sözleşmeler geliştirirken önemlidir.

  1. Gas hakkında genel bilgi: Solidity akıllı sözleşmelerinin çalışması için gaz maliyeti vardır. İşlemlerinizi yaparken ödemeniz gereken gaz miktarını hesaplamanız ve tasarruf etmenin yollarını bilmek önemlidir.
  2. Memory ve Calldata farkı: Bellek kullanımı ve veri türleri, gas tasarrufu açısından önemlidir. Calldata, bellekten daha az gaz kullanır, bu nedenle gereksiz bellek kullanımını önlemek ve calldata’yı tercih etmek, gas tasarrufu sağlar.
  3. State değişkenlerinin belleğe yüklenmesi: State değişkenlerinin bellek yerine storage’dan yüklenmesi, işlem yaparken gaz tasarrufu sağlar.
  4. ++i vs i++: Döngülerde kullanılan bu iki işlem, farklı miktarda gaz tüketir. ++i, daha az gaz tüketen bir işlem olduğundan, işlemlerde daha az gaz tüketimi sağlar.
  5. Dizilerin öğelerinin önbellekte saklanması: Tekrarlanan dizilerdeki öğelerin önbellekte saklanması, gas tasarrufu sağlar. Bu sayede, aynı öğeler tekrar tekrar yüklenmek yerine, önbellekte saklanarak gas tasarrufu yapılır.
  6. Kısa devre: İşlemlerin kısa devre edilmesi, gereksiz işlemlerin yapılmasını önler ve gas tasarrufu sağlar.

Solidity, Ethereum blockchaininde akıllı sözleşmeler oluşturmak için kullanılan bir programlama dilidir. Ancak, Solidity akıllı sözleşmeleri çalıştırmak için gaz maliyeti gerektirir. Bu nedenle, geliştiriciler, gas tasarrufu sağlamak için Solidity dilinde belirli teknikleri kullanmalıdır. Bu teknikler, Solidity kodunu daha etkili hale getirmenize ve gas tasarrufu sağlamanıza yardımcı olabilir. Bu yazıda, Solidity dilinde gas tasarrufu sağlamak için kullanılabilecek tekniklerden bazıları hakkında bilgi vereceğim.

Gas hakkında genel bilgi

Solidity akıllı sözleşmelerinin çalışması için gaz maliyeti vardır. Gas, Ethereum blockchainindeki işlemlerin çalıştırılması için kullanılan bir ölçü birimidir. Her işlem için belirli bir gaz ücreti ödenir. Gaz maliyeti, işlem hacmi, veri boyutu, işlem süresi ve blockchain’in mevcut durumu gibi faktörlere bağlıdır.

Solidity geliştiricileri, gas tasarrufu sağlamak için çeşitli teknikler kullanabilirler. Bu teknikler, işlemlerin daha az gaz kullanarak daha hızlı çalışmasını sağlar. Bu nedenle, geliştiriciler, gas tasarrufu sağlayan kodları yazarak, kullanıcıların daha az ücret ödemesini sağlayabilirler. Gas tasarrufu sağlamak, Ethereum blok zincirinde daha verimli ve ekonomik bir şekilde işlem yapmak için önemlidir.

Memory ve Calldata farkı

Solidity dilinde, bellek ve calldata olarak iki farklı veri depolama türü vardır. Bellek, bir fonksiyon çağrısı sırasında oluşturulan geçici bir veri deposudur. Calldata ise, dışarıdan bir fonksiyona gönderilen verilerin geçici olarak depolanması için kullanılan bir alandır.

Calldata, bellekten daha az gaz tüketir. Bu nedenle, gereksiz bellek kullanımını önlemek ve calldata’yı tercih etmek, gas tasarrufu sağlar. Özellikle, fonksiyonlara gönderilen büyük veri setleri varsa, bu teknik daha önemli hale gelir.

Bellek kullanımı ve veri türleri, gas tasarrufu açısından önemlidir. Bu nedenle, geliştiriciler, gereksiz bellek kullanımını önlemek için Solidity kodlarını optimize etmelidirler. Verileri calldata olarak göndermek, işlemlerin daha hızlı çalışmasına ve daha az gaz kullanmasına yardımcı olur.

State değişkenlerinin belleğe yüklenmesi

Solidity’de, state değişkenleri ve local değişkenler olarak iki tür değişken vardır. State değişkenleri, akıllı sözleşmenin durumunu tutarlar ve blockchain’de kalıcıdırlar. Local değişkenler ise, bir fonksiyon çağrısı sırasında oluşturulan geçici veri deposudur ve işlemin tamamlanmasından sonra bellekten silinirler.

State değişkenleri bellek tüketir ve gas maliyetini arttırır. Bu nedenle, Solidity kodu yazarken, state değişkenlerinin sıklıkla kullanılmaması veya gereksiz yere belleğe yüklenmemesi önemlidir. Özellikle, state değişkenlerinin büyük veri setleri içerdiği durumlarda, gas tasarrufu sağlamak için bu önemlidir.

State değişkenleri, bir fonksiyonun başlangıcında belleğe yüklenir ve işlem sonunda tekrar blockchain’e yazılır. Bu işlem, gereksiz state değişkenlerinin belleğe yüklenmesine neden olabilir. Bu nedenle, Solidity geliştiricileri, state değişkenlerinin sadece gerektiği durumlarda kullanılmasını sağlamak için kodlarını optimize etmelidirler.

++i vs i++

Solidity dilinde, for döngüsü içinde i++ ve ++i arasında bir fark vardır. i++, değişkenin önceki değerini döndürür ve ardından değişkeni bir artırır. ++i ise, değişkeni bir artırır ve ardından yeni değeri döndürür.

i++, Solidity’de bir önceki değeri döndürdüğü için, gereksiz bir kopyalama işlemine neden olabilir. Bu nedenle, i++ yerine ++i kullanmak, gas tasarrufu sağlar.

Özellikle, büyük veri setleri üzerinde işlem yapıldığı durumlarda, i++ yerine ++i kullanmak önemlidir. Bu, gereksiz kopyalama işlemlerini önleyerek işlemleri hızlandırabilir ve gas tasarrufu sağlayabilir.

Dizilerin öğelerinin önbellekte saklanması

Solidity dilinde, dizilerin öğeleri, bellekte depolanır. Dizilerin büyüklüğüne ve öğelerinin türüne bağlı olarak, dizinin kullanımı gas maliyetini arttırabilir. Bu nedenle, gereksiz dizilerin kullanımı ve öğelerinin sıklıkla okunması veya yazılması, gas tasarrufu açısından önemlidir.

Dizilerdeki öğelerin sıklıkla okunması veya yazılması, gereksiz bellek erişimleri yapar ve gas tüketimini artırır. Bu nedenle, özellikle büyük boyutlu dizilerde, öğelerin önbellekte saklanması, gas tasarrufu sağlayabilir. Bu, daha hızlı işlem yapılmasına ve daha az gaz kullanılmasına yardımcı olur.

Dizilerin öğelerinin önbellekte saklanması, Solidity’de “caching” olarak adlandırılır. Caching, dizinin her öğesi için bellek erişimlerini azaltır ve işlemlerin daha hızlı çalışmasına neden olur. Ancak, caching işlemi, dizinin büyüklüğüne ve öğelerinin türüne bağlı olarak, kodun daha karmaşık hale gelmesine ve daha fazla bellek tüketimine neden olabilir.

Kısa devre

Solidity’de, kısa devre veya “short circuit” olarak adlandırılan bir teknik, gas tasarrufu sağlar. Kısa devre, bir ifadenin geri kalanını değerlendirme ihtiyacı olmadığında, ifadeyi sonlandırarak gas tüketimini azaltır.

Örneğin, bir fonksiyonda, birden fazla koşul kullanarak bir kontrol yapılıyorsa, ilk koşulun doğru olması durumunda diğer koşulların kontrol edilmesine gerek yoktur. Bu durumda, koşulları sırayla kontrol etmek yerine, Solidity dilinde kısa devre operatörleri kullanarak gas tasarrufu sağlanabilir.

Solidity dilinde, kısa devre operatörleri, “&&” ve “||” operatörleridir. “&&” operatörü, iki koşulun her ikisinin de doğru olması durumunda “true” değerini döndürür. “||” operatörü ise, iki koşuldan en az birinin doğru olması durumunda “true” değerini döndürür.

Bu operatörler, bir koşul doğru olduğunda geri kalan koşulların kontrol edilmesini önler ve gas tasarrufu sağlar. Özellikle, birden fazla koşulun kullanıldığı durumlarda, kısa devre operatörlerinin kullanımı, gas tasarrufu açısından önemlidir.

Akıllı Sözleşme Örneği İNCELEME

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

// gas golf
contract GasGolf {
    // start - 50908 gas
    // use calldata - 49163 gas
    // load state variables to memory - 48952 gas
    // short circuit - 48634 gas
    // loop increments - 48244 gas
    // cache array length - 48209 gas
    // load array elements to memory - 48047 gas
    // uncheck i overflow/underflow - 47309 gas

    uint public total;

    // start - not gas optimized
    // function sumIfEvenAndLessThan99(uint[] memory nums) external {
    //     for (uint i = 0; i < nums.length; i += 1) {
    //         bool isEven = nums[i] % 2 == 0;
    //         bool isLessThan99 = nums[i] < 99;
    //         if (isEven && isLessThan99) {
    //             total += nums[i];
    //         }
    //     }
    // }

    // gas optimized
    // [1, 2, 3, 4, 5, 100]
    function sumIfEvenAndLessThan99(uint[] calldata nums) external {
        uint _total = total;
        uint len = nums.length;

        for (uint i = 0; i < len; ) {
            uint num = nums[i];
            if (num % 2 == 0 && num < 99) {
                _total += num;
            }
            unchecked {
                ++i;
            }
        }

        total = _total;
    }
}

Bu akıllı sözleşme “gas golf” adı verilen bir etkinlikte kullanılmak üzere tasarlanmıştır. Amacı, gas tüketimini azaltmak için çeşitli teknikler kullanarak “sumIfEvenAndLessThan99” fonksiyonunu optimize etmektir.

Öncelikle, “use calldata” teknikleri kullanılarak, fonksiyona gönderilen “nums” dizisinin calldata’da saklanması sağlanır. Bu, fonksiyonun gas tüketimini 50908’den 49163’e düşürür.

Daha sonra, “load state variables to memory” tekniği kullanılarak, “total” değişkeni hafızaya yüklenir. Bu, gas tüketimini 48952’ye düşürür.

Ardından, “short circuit” tekniği kullanılarak, ifadenin geri kalanını değerlendirme ihtiyacı olmadığında, ifadeyi sonlandırarak gas tüketimini azaltır. Bu, gas tüketimini 48634’e düşürür.

Döngüdeki “i++” ifadesi, “loop increments” tekniği kullanılarak, “++i” ifadesine dönüştürülür. Bu, gas tüketimini 48244’e düşürür.

Ayrıca, “cache array length” tekniği kullanılarak, dizinin uzunluğu bir değişkende saklanır ve her turda hesaplanması önlenir. Bu, gas tüketimini 48209’a düşürür.

Daha sonra, “load array elements to memory” tekniği kullanılarak, dizinin elemanları hafızaya yüklenir. Bu, gas tüketimini 48047’ye düşürür.

Son olarak, “uncheck i overflow/underflow” tekniği kullanılarak, “i” değişkeninin taşması/altına inmesi engellenir. Bu, gas tüketimini 47309’a düşürür.

Sonuç olarak, optimize edilmiş fonksiyon, gas tüketimini önemli ölçüde azaltarak, akıllı sözleşme yazarlarına tasarruf sağlar.

SONUÇ BAĞLAMI

Bu makalede, Solidity dilinde gas tasarrufu tekniklerine değindik. Gas, Ethereum ağında işlem yapmak için kullanılan birimdir ve her işlem için ödenen bir ücrettir. Gas tasarrufu teknikleri, akıllı sözleşmelerin daha az gas kullanarak daha verimli hale getirilmesine yardımcı olabilir. Bu teknikler arasında calldata kullanımı, state değişkenlerinin belleğe yüklenmesi, ++i kullanımı, öğelerin önbellekte saklanması ve kısa devre işlemleri bulunur.

Ayrıca, bir örnek akıllı sözleşme üzerinden gas tasarrufu tekniklerinin nasıl uygulanabileceğine de değindik. Bu örnek, “Gas Golf” adlı bir sözleşmedir ve sumIfEvenAndLessThan99 fonksiyonunda gas tasarrufu teknikleri uygulanarak gas maliyeti düşürülmüştür.

Gas tasarrufu teknikleri, Ethereum ağındaki işlemler için önemlidir ve akıllı sözleşmelerin daha az gas kullanarak daha verimli hale getirilmesine yardımcı olabilir. Tasarruf tekniklerini kullanarak gas maliyetlerini azaltarak, akıllı sözleşmelerin daha geniş bir kitle tarafından kullanılması mümkün hale gelir.

Solidity Programlama Dili Öğrenme yolculuğunuz hakkında daha iyi rehberlik almak için Solidity nedir? Ethereum Akıllı Sözleşmelerinin Dili Rehberi içeriğimize göz atın. Dilerseniz Yeni Başlayanlar için Solidity – Akıllı Sözleşme Geliştirme Hızlandırılmış Kursuna katılın.

Çalışmaya nereden başlayacağım diyenler için Blockchain ​​Developer Olmak İçin Yol Haritası içeriğine de muhakkak bakın.

Gelin aklınızdaki soruları SUPERPEER sohbetinde cevaplayalım.

Bu makaleyi okuduğunuz için teşekkürler! Bana destek olmak isterseniz;

Beni TwitterLinkedin ve YouTube‘da takip edin.

Kısa bir yorum bırakmayı UNUTMAYIN!

solidity101 - Solidity, 2015 yılında Christian Reitwiessner liderliğinde piyasaya sürülen, büyük harf kullanımına göre ikinci en büyük kripto para piyasası olan Ethereum tarafından oluşturulan yepyeni bir programlama dilidir.

Yazarın Profili
İlginizi Çekebilir

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir