1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 019 : Error

🧵 #100GündeSolidity 019 : Error
Error, Hata Kavramı
0

Error, Hata Kavramı

“Error” (hata) kavramı, Solidity programlama dili için önemlidir. Bir hata, bir işlem sırasında yapılan tüm değişiklikleri geri alır. Hataları, require, revert veya assert fonksiyonlarını kullanarak oluşturabilirsiniz.

  • require, işlemlerin çalışması için gerekli olan girişleri ve koşulları doğrulamak için kullanılır.
  • revert, require ile benzerdir. Ayrıntılar için aşağıdaki kodu inceleyin.
  • assert, asla yanlış olamayacak olan kodları kontrol etmek için kullanılır. Başarısız bir assertion, yazılımda bir hata olduğuna işaret edebilir. Custom error (özel hata) kullanarak gaz tasarrufu yapabilirsiniz.

Hata yönetimi, işlemlerin gerçekleşirken oluşabilecek hataların tespit edilmesi, önlenmesi ve yönetilmesi için kullanılan bir yöntemdir. Solidity programlamada, hata yönetimi için require, revert ve assert fonksiyonları kullanılır. Bu fonksiyonlar, işlemlerin gerçekleşmesi sırasında oluşabilecek hataları tespit etmek ve işlemlerin geri alınmasını sağlamak için kullanılır. Özellikle, require fonksiyonu işlemlerin gerçekleşmesi için gerekli olan girdileri ve koşulları doğrulamak için kullanılır. Revert fonksiyonu ise, işlemlerin geri alınmasını sağlamak için kullanılır. assert fonksiyonu ise, asla yanlış olamayacak olan kodları kontrol etmek için kullanılır.

Hata yönetimi önemlidir çünkü işlemlerin gerçekleşmesi sırasında oluşabilecek hatalar, smart contractların çalışmasını etkileyebilir ve hatta smart contractların bozulmasına neden olabilir. Bu nedenle, Solidity programlamada hata yönetimi önemlidir ve smart contractların oluşturulması sırasında dikkatli bir şekilde ele alınmalıdır.

– require, revert ve assert fonksiyonlarının kullanımı

require, revert ve assert fonksiyonları, Solidity programlamada hata yönetimi için kullanılan önemli fonksiyonlardır. Bu fonksiyonlar işlemlerin gerçekleşmesi sırasında oluşabilecek hataları tespit etmek ve işlemlerin geri alınmasını sağlamak için kullanılır.

require fonksiyonu, işlemlerin gerçekleşmesi için gerekli olan girdileri ve koşulları doğrulamak için kullanılır. Örneğin, bir işlem gerçekleştirilirken gerekli olan bir girdiye erişim yoksa veya belirli bir koşul sağlanmıyorsa, bu durumda require fonksiyonu hata oluşturur ve işlem geri alınır. Örneğin, bir işlem gerçekleştirilirken gerekli olan bir girdinin boş olmaması gerektiğinde, girdi boşsa require fonksiyonu hata oluşturur.

revert fonksiyonu, işlemlerin geri alınmasını sağlamak için kullanılır. Örneğin, bir işlem gerçekleştirilirken belirli bir koşul sağlanmıyorsa, revert fonksiyonu hata oluşturur ve işlem geri alınır. Örneğin, bir işlem gerçekleştirilirken işlemi gerçekleştirecek kullanıcının yetkili olması gerektiğinde, kullanıcı yetkili değilse revert fonksiyonu hata oluşturur.

assert fonksiyonu, asla yanlış olamayacak olan kodları kontrol etmek için kullanılır. Örneğin, bir işlem gerçekleştirilirken belirli bir değerin belirli bir değer ile eşit olması gerektiğinde, değerler eşit değilse assert fonksiyonu hata oluşturur. Bu fonksiyon, yazılımcının kodunun hatasız olduğunu ve kodun doğru şekilde çalışacağını garanti etmek için kullanılır.

Özel hatalar oluşturma yolları

Özel hatalar, yazılımcılar tarafından tanımlanabilecek hatalardır. Bu hatalar, standart hata mesajları yerine, yazılımcı tarafından tanımlanmış mesajları içerebilir. Özel hatalar, işlemlerin geri alınmasını sağlamak için require, revert ve assert gibi fonksiyonlar kullanılarak oluşturulabilir.

Aşağıdaki örnekte, özel bir hata oluşturulmuş ve hata mesajı “Bu işlem için yetersiz bakiyeniz var” olarak tanımlanmıştır:

require(balance >= amount, "Bu işlem için yetersiz bakiyeniz var");

Ayrıca, yazılımcılar, özel hataları tanımlamak için “require()” içine bir hata kodu ve hata mesajını da ekleyebilirler. Örneğin:

require(balance >= amount, "ERROR_INSUFFICIENT_BALANCE", "Bu işlem için yetersiz bakiyeniz var");

Bu yolla, hata kodları ile hata mesajları arasında daha net bir ilişki oluşur ve hata yönetimini daha kolay hale getirir.

Sonuç olarak, özel hatalar oluşturmak, yazılımcıların smart contractlarının çalışması sırasında oluşabilecek hataları daha iyi anlamalarına ve hata yönetimini daha kolay hale getirmelerine olanak sağlar.

Hataların oluşması durumunda işlemlerin geri alınması ve gaz tasarrufu sağlanması

Hatalar, Solidity programlama dili için önemli bir konudur. Hata oluşması durumunda, işlemler geri alınır ve smart contractların durumu işlem öncesine döner. Bu, smart contractların beklenmedik şekilde çalışmasını veya yanlış sonuçların oluşmasını engellemek için önemlidir.

Ancak, hataların oluşması durumunda işlemlerin geri alınması, gaz tüketimini arttırır. Bu nedenle, yazılımcılar, gaz tasarrufu sağlamak için özel hatalar oluşturmayı tercih edebilirler. Özel hatalar, standart hata mesajları yerine, yazılımcı tarafından tanımlanmış mesajları içerebilir. Bu sayede, işlemlerin geri alınmasına rağmen gaz tüketimi azaltılabilir.

Ayrıca, yazılımcılar, smart contractların çalışması sırasında oluşabilecek hataların önüne geçmek için girdi ve koşulları daha önceden kontrol etmeyi tercih edebilirler. Bu sayede, hataların oluşması durumunda işlemlerin geri alınmasına gerek kalmaz ve gaz tasarrufu sağlanır.

Sonuç olarak, hataların oluşması durumunda işlemlerin geri alınması, smart contractların çalışmasının güvenliğini sağlamak için önemlidir. Ancak, yazılımcılar, gaz tasarrufu sağlamak için özel hatalar oluşturmayı ve girdi ve koşulları daha önceden kontrol etmeyi tercih edebilirler.

Akıllı Sözleşme İncelemesi

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

contract Error {
    function testRequire(uint _i) public pure {
        // Require should be used to validate conditions such as:
        // - inputs
        // - conditions before execution
        // - return values from calls to other functions
        require(_i > 10, "Input must be greater than 10");
    }

    function testRevert(uint _i) public pure {
        // Revert is useful when the condition to check is complex.
        // This code does the exact same thing as the example above
        if (_i <= 10) {
            revert("Input must be greater than 10");
        }
    }

    uint public num;

    function testAssert() public view {
        // Assert should only be used to test for internal errors,
        // and to check invariants.

        // Here we assert that num is always equal to 0
        // since it is impossible to update the value of num
        assert(num == 0);
    }

    // custom error
    error InsufficientBalance(uint balance, uint withdrawAmount);

    function testCustomError(uint _withdrawAmount) public view {
        uint bal = address(this).balance;
        if (bal < _withdrawAmount) {
            revert InsufficientBalance({balance: bal, withdrawAmount: _withdrawAmount});
        }
    }
}

Bu kod, “Error” adlı bir sözleşme oluşturur. Sözleşmede, 3 farklı hata yönetim fonksiyonlarının nasıl kullanılacağı gösterilir.

  • “testRequire” fonksiyonu, girdi olarak aldığı “_i” değişkeninin 10’dan büyük olmasını kontrol eder. Eğer değer 10’dan küçükse, “Input must be greater than 10” mesajı ile hata fırlatılır.
  • “testRevert” fonksiyonu ise, “_i” değişkeninin 10’dan küçük veya eşit olması durumunda “Input must be greater than 10” mesajı ile hata fırlatır.
  • “testAssert” fonksiyonu ise, sözleşmenin “num” değişkeninin her zaman 0 olduğunu kontrol eder. Eğer değer 0 değilse, hata fırlatılır. Bu fonksiyon sadece iç hataları ve kuralları kontrol etmek için kullanılır.
  • “testCustomError” fonksiyonu ise, sözleşmenin bakiyesinin girdi olarak verilen “withdrawAmount” değerinden daha az olması durumunda “InsufficientBalance” adlı özel bir hata oluşturur. Bu hata, mevcut bakiyenin miktarını ve çekilmek istenen miktarı içerir.

Not: Tüm fonksiyonlar “pure” veya “view” anahtar kelimeleri ile işaretlenmiştir. Bu anahtar kelimeler, fonksiyonların sadece bilgi okumak amacıyla çalıştığını ve sözleşmenin durumunu değiştirmediğini gösterir.

Alternatif Akıllı Sözleşme İncelemesi

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

contract Account {
    uint public balance;
    uint public constant MAX_UINT = 2 ** 256 - 1;

    function deposit(uint _amount) public {
        uint oldBalance = balance;
        uint newBalance = balance + _amount;

        // balance + _amount does not overflow if balance + _amount >= balance
        require(newBalance >= oldBalance, "Overflow");

        balance = newBalance;

        assert(balance >= oldBalance);
    }

    function withdraw(uint _amount) public {
        uint oldBalance = balance;

        // balance - _amount does not underflow if balance >= _amount
        require(balance >= _amount, "Underflow");

        if (balance < _amount) {
            revert("Underflow");
        }

        balance -= _amount;

        assert(balance <= oldBalance);
    }
}

Bu kod, bir hesap sözleşmesi oluşturmak için kullanılıyor. Sözleşmenin içinde bir “balance” değişkeni var ve bu değişkenin maksimum değerini temsil eden “MAX_UINT” sabit bir değişken de bulunuyor.

İlk olarak, “deposit()” fonksiyonu çağrıldığında, mevcut bakiyenin değeri kaydediliyor ve yatırılacak miktar ekleniyor. Bu işlem sırasında, eğer bakiye + yatırılacak miktar bakiyeyi aşarsa, “require” fonksiyonu kullanarak bir hata oluşturuluyor ve “Overflow” mesajı gösteriliyor. Ayrıca, bu işlem sonrasında bakiyenin eski değerinden daha fazla olmasının sağlandığını kontrol etmek için “assert” fonksiyonu kullanılıyor.

Sonra, “withdraw()” fonksiyonu çağrıldığında, mevcut bakiyenin değeri kaydediliyor. Bu işlem sırasında, eğer bakiyenin miktarı çekilecek miktardan azsa, “require” fonksiyonu kullanarak bir hata oluşturuluyor ve “Underflow” mesajı gösteriliyor. Ayrıca, bu işlem sonrasında bakiyenin eski değerinden az olmasının sağlandığını kontrol etmek için “assert” fonksiyonu kullanılıyor.

Sonuç Bağlamı

Solidity programlama dili, blockchain teknolojisi için yazılmış bir programlama dildir. Bu dil kullanılarak blockchain üzerinde smart contractler oluşturulabilir. Ancak herhangi bir programlama dili gibi Solidity de hatalar oluşabilir. Bu hataların önlenmesi ve yönetilmesi için require, revert ve assert fonksiyonları kullanılabilir. Require kullanılarak inputlar ve işlem öncesi koşullar kontrol edilir. Revert ise daha karmaşık koşullar için kullanılır. Assert ise iç hataları kontrol etmek için ve invariantları kontrol etmek için kullanılır. Özel hatalar oluşturmak da mümkündür ve bu sayede gaz tasarrufu sağlanabilir. Bu yazıda anlatılanlar arasında, contract içerisinde yer alan “testRequire”, “testRevert”, “testAssert” ve “testCustomError” fonksiyonlarının kullanımı örnek olarak verilmiştir. Bu fonksiyonlar sayesinde oluşabilecek hataların önlenmesi ve yönetilmesi mümkündür. Ayrıca “deposit” ve “withdraw” fonksiyonlarının kullanımı da örnek olarak verilmiştir. Bu fonksiyonlar aracılığıyla, balance değişkeninin dengede kalması sağlanır ve underflow ve overflow gibi hatalar önlenebilir. Bu yazıda anlatılanlar arasında, Solidity programlama dili ve hata yönetimi hakkında bilgi sahibi olunmuştur.

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