1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 046 : Unchecked Math

🧵 #100GündeSolidity 046 : Unchecked Math
Unchecked Math
0

Unchecked Math

Sayı Taşması ve Alt Taşması: Unchecked Math Kullanımı

Solidity, Ethereum blok zinciri üzerinde çalışan akıllı sözleşme dili olarak kullanılmaktadır. Solidity, değişkenler, koşullu ifadeler, döngüler ve matematiksel işlemler gibi geleneksel programlama konseptlerini desteklemektedir. Ancak, Solidity’deki matematiksel işlemler bazen sayı taşması veya alt taşması nedeniyle hatalara neden olabilir. Bu hatalar, Solidity 0.8’de standart olarak hata fırlatırken, “unchecked” kullanarak devre dışı bırakılabilir. Bu e-bülten, Solidity’de sayı taşması ve alt taşması hakkında genel bir bakış sağlar ve “unchecked” kullanarak bu hataların nasıl ele alınabileceğini açıklar.

Sayı taşması ve alt taşması nedir?

Sayı taşması ve alt taşması, bir sayının belirli bir veri türünden kaynaklanan sınırlarını aşması veya altında kalması durumudur. Örneğin, bir 8-bit işaretli tam sayı, -128 ile 127 arasında bir değer alabilir. Eğer bu aralığın dışına çıkılırsa, sayı taşması veya alt taşması meydana gelir.

Örneğin, bir 8-bit işaretli tam sayı 127 değerine sahip olsun. Eğer bu sayıya 1 eklenirse, sonuç 128 olur. Ancak 8-bit işaretli tam sayıların maksimum değeri 127 olduğu için, bu işlem sonucunda sayı taşması meydana gelir ve sonuç -128 olarak belirlenir.

Benzer şekilde, bir 8-bit işaretli tam sayı -128 değerine sahip olsun. Eğer bu sayıdan 1 çıkarılırsa, sonuç 127 olur. Ancak 8-bit işaretli tam sayıların minimum değeri -128 olduğu için, bu işlem sonucunda alt taşma meydana gelir ve sonuç 128 olarak belirlenir.

Solidity 0.8’de sayı taşması ve alt taşması neden hata fırlatır?

Solidity 0.8 sürümü, sayı taşması ve alt taşması durumlarını algılayarak hata fırlatır. Bunun nedeni, bu hataların potansiyel olarak beklenmeyen sonuçlara yol açabilmesidir. Örneğin, bir sayı taşması veya alt taşması durumunda, programın beklenmedik bir şekilde çökmesi veya başka hataların meydana gelmesi mümkündür.

Bu nedenle, Solidity 0.8’de sayı taşması ve alt taşması durumları standart olarak hata fırlatır. Bu hatalar, geliştiricilerin hataları tespit edebilmesine ve düzeltmesine olanak tanır.

“Unchecked” kullanarak sayı taşması ve alt taşmasının hatayı fırlatmadan devre dışı bırakılması nasıl yapılır?

“Unchecked” kullanarak sayı taşması ve alt taşması hatasının fırlatılmasını devre dışı bırakmak için, Solidity 0.8’de yerleşik olarak gelen “unchecked” anahtar kelimesi kullanılır. Bu anahtar kelimesi, sayı taşması ve alt taşması durumlarından kaynaklanan hataların fırlatılmasını devre dışı bırakır.

Örneğin, aşağıdaki Solidity kod parçasında, “unchecked” anahtar kelimesi kullanarak sayı taşması ve alt taşması durumlarını devre dışı bırakabilirsiniz:

// Solidity 0.8 kullanarak unchecked örneği
// uint8 türündeki iki sayının toplamı

function uncheckedExample(uint8 a, uint8 b) public pure returns (uint8) {
    unchecked {
        return a + b;
    }
}

Yukarıdaki örnekte, “unchecked” anahtar kelimesi sayesinde, a ve b değişkenlerinin toplamı, sayı taşması durumunda hata fırlatmayacak ve sonucu doğrudan hesaplayacaktır. Ancak bu yaklaşım, sayı taşması veya alt taşması durumlarının neden olduğu potansiyel riskleri ortadan kaldırdığı için, dikkatli bir şekilde kullanılmalıdır.

“Unchecked” kullanmanın avantajları nelerdir?

“Unchecked” anahtar kelimesi kullanmanın avantajları şunlardır:

  1. Daha az gaz tüketimi: “Unchecked” kullanarak sayı taşması ve alt taşması durumlarını devre dışı bırakmak, hesaplamanın daha az gaz tüketmesini sağlar. Bu nedenle, işlem maliyetleri düşürülür.
  2. Daha esnek hesaplama: Bazı durumlarda, sayı taşması ve alt taşması hatalarının fırlatılması istenmeyebilir ve hesaplama sürecinin devam etmesi gerekebilir. Bu durumlarda, “unchecked” kullanarak hesaplamanın devam etmesi mümkün olur.
  3. Daha az kod karmaşıklığı: Sayı taşması ve alt taşması durumlarını kontrol etmek için ek kodlama gerektiği durumlarda, “unchecked” kullanmak kod karmaşıklığını azaltabilir ve kodun daha okunaklı hale gelmesini sağlar.

Ancak, “unchecked” kullanmanın dezavantajları da vardır. Sayı taşması ve alt taşması hatalarının potansiyel risklerini ortadan kaldırdığı için, “unchecked” kullanmak güvenlik açısından riskli olabilir. Bu nedenle, “unchecked” anahtar kelimesi dikkatli bir şekilde kullanılmalıdır ve güvenlik açısından riskleri göz önünde bulundurarak kullanılmalıdır.

“Unchecked” kullanmanın dezavantajları nelerdir?

“Unchecked” anahtar kelimesi kullanmanın dezavantajları şunlar olabilir:

  1. Güvenlik riski: Sayı taşması ve alt taşması hatalarının potansiyel risklerini ortadan kaldırdığı için, “unchecked” kullanmak güvenlik açısından riskli olabilir. Bu nedenle, “unchecked” anahtar kelimesi dikkatli bir şekilde kullanılmalı ve güvenlik açısından riskleri göz önünde bulundurularak kullanılmalıdır.
  2. Beklenmeyen sonuçlar: Sayı taşması veya alt taşması durumunda, hesaplamaların beklenmeyen sonuçlara yol açması mümkündür. Bu durum, programların doğru çalışmamasına neden olabilir ve kullanıcıların hesaplamalara güvenmemesine sebep olabilir.
  3. Bakım zorlukları: “Unchecked” kullanımı, kodun bakımını zorlaştırabilir. Kodda sayı taşması veya alt taşması durumları için ek kontroller yapmak, kodun daha okunaklı hale gelmesini sağlayabilir ve daha az bakım gerektirir.
  4. Uyum sorunları: Solidity 0.8’de sayı taşması ve alt taşması durumları standarda uygun olarak hata fırlatır. Bu nedenle, “unchecked” kullanımı, standarda uygun olmayan bir kod oluşturabilir ve diğer geliştiriciler tarafından anlaşılmayabilir.

Özetle, “unchecked” anahtar kelimesi dikkatli bir şekilde kullanılmalı ve potansiyel riskler dikkate alınarak kullanılmalıdır. Güvenliğin önemli olduğu durumlarda, “unchecked” kullanmaktan kaçınılmalıdır.

“Unchecked” kullanmadan önce dikkat edilmesi gerekenler

“Unchecked” anahtar kelimesi kullanmadan önce dikkat edilmesi gerekenler şunlardır:

  1. Güvenlik riskleri: “Unchecked” anahtar kelimesi, sayı taşması ve alt taşması hatalarının potansiyel risklerini ortadan kaldırdığı için güvenlik açısından risklidir. Bu nedenle, “unchecked” kullanmadan önce kodun güvenliği ve riskleri değerlendirilmeli, uygun güvenlik kontrolleri yapılmalı ve doğru bir şekilde test edilmelidir.
  2. İşlevselliğin korunması: “Unchecked” kullanımı, sayı taşması ve alt taşması hatalarının potansiyel risklerini ortadan kaldırsa da, hesaplamaların beklenmeyen sonuçlara yol açması mümkündür. Bu nedenle, “unchecked” kullanmadan önce kodun işlevselliği iyi anlaşılmalı ve sayı taşması veya alt taşması durumunda hesaplamaların nasıl davranacağına dair bir plan oluşturulmalıdır.
  3. Performans: “Unchecked” kullanımı, sayı taşması ve alt taşması hatalarının kontrol edilmesi yerine doğrudan hesaplamaların yapılmasını sağladığı için, performans artışı sağlar. Ancak, performans artışı, güvenlik ve işlevsellik risklerinden ödün verilmeden sağlanmalıdır.
  4. Bakım kolaylığı: “Unchecked” kullanımı, kodun bakımını zorlaştırabilir. Bu nedenle, “unchecked” kullanmadan önce kodun bakımı düşünülmeli ve kodun diğer geliştiriciler tarafından anlaşılabilir olmasını sağlamak için kod okunaklı hale getirilmelidir.
  5. Uyum sorunları: Solidity 0.8’de sayı taşması ve alt taşması durumları standarda uygun olarak hata fırlatır. Bu nedenle, “unchecked” kullanımı, standarda uygun olmayan bir kod oluşturabilir ve diğer geliştiriciler tarafından anlaşılmayabilir. Bu nedenle, “unchecked” kullanmadan önce standarda uygun bir şekilde kod yazmak ve doğru bir şekilde belgelendirmek önemlidir.

Özetle, “unchecked” anahtar kelimesi kullanmadan önce kodun güvenliği, işlevselliği, performansı ve bakımı düşünülmeli ve potansiyel uyumluluk sorunları da göz önünde bulundurulmalıdır.

Solidity’deki diğer matematiksel fonksiyonlar hakkında bilgi verme (örneğin, SafeMath).

Solidity’de “SafeMath” gibi diğer matematiksel fonksiyonlar da mevcuttur. Bu fonksiyonlar, sayı taşması ve alt taşması hatalarını önlemek için tasarlanmıştır.

SafeMath kütüphanesi, uint256 veri türü için toplama, çıkarma, çarpma, bölme ve mod işlemleri için güvenli matematiksel fonksiyonlar sağlar. Bu fonksiyonlar, hesaplamalar sırasında oluşabilecek taşmaları kontrol eder ve hata fırlatır. Böylece, sayı taşması veya alt taşması hatalarından kaynaklanan güvenlik sorunları önlenmiş olur.

Örnek olarak, SafeMath kütüphanesi içinde yer alan toplama fonksiyonu aşağıdaki gibi kullanılabilir:

import "./SafeMath.sol";

contract MyContract {
  using SafeMath for uint256;

  uint256 public myNumber;

  function addNumber(uint256 numToAdd) public {
    myNumber = myNumber.add(numToAdd);
  }
}

Yukarıdaki örnekte, “using” anahtar kelimesi kullanılarak SafeMath kütüphanesi “MyContract” kontratına dahil edilir. Daha sonra, “addNumber” fonksiyonu içinde “myNumber” değişkenine “numToAdd” parametresi eklenirken “add” fonksiyonu kullanılır. Bu fonksiyon, sayı taşması veya alt taşması hatalarını önler.

Benzer şekilde, SafeMath kütüphanesi içinde yer alan diğer matematiksel fonksiyonlar da güvenli bir şekilde kullanılabilir. Bu fonksiyonlar, Solidity’nin daha önceki sürümlerinde yer alan “unchecked” anahtar kelimesi yerine tercih edilir, çünkü daha güvenli bir matematiksel işlem sağlarlar.

Solidity’deki sayısal veri türleri ve boyutları hakkında genel bir bakış

Solidity’de, sayısal veri türleri 8-bit ile 256-bit arasında değişen boyutlarda bulunur. Bu veri türleri, unsigned ve signed olarak ikiye ayrılır.

Unsigned veri türleri, sadece pozitif değerleri temsil edebilir. Signed veri türleri ise pozitif ve negatif değerleri temsil edebilir.

Solidity’deki sayısal veri türleri şunlardır:

  • uint: unsigned integer türüdür ve varsayılan olarak 256-bit boyutundadır. uint8, uint16, uint32, uint64, uint128 ve uint256 alt türleri de bulunur.
  • int: signed integer türüdür ve varsayılan olarak 256-bit boyutundadır. int8, int16, int32, int64, int128 ve int256 alt türleri de bulunur.
  • fixed: fixed-point türüdür ve virgülden önce ve sonra belirli sayıda bit içerebilir. fixed, fixed8x1, fixed16x8, fixed128x18 alt türleri de bulunur.
  • ufixed: unsigned fixed-point türüdür ve virgülden önce ve sonra belirli sayıda bit içerebilir. ufixed, ufixed8x1, ufixed16x8, ufixed128x18 alt türleri de bulunur.

Bu veri türleri, smart contract’lar içinde matematiksel işlemler yapmak için kullanılır. Ancak, taşma veya alt taşma hataları gibi sorunlara karşı dikkatli olunması gerekir. Bu nedenle, SafeMath veya unchecked gibi fonksiyonlar kullanılarak güvenli bir şekilde matematiksel işlemler gerçekleştirilmelidir.

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

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

contract UncheckedMath {
    function add(uint x, uint y) external pure returns (uint) {
        // 22291 gas
        // return x + y;

        // 22103 gas
        unchecked {
            return x + y;
        }
    }

    function sub(uint x, uint y) external pure returns (uint) {
        // 22329 gas
        // return x - y;

        // 22147 gas
        unchecked {
            return x - y;
        }
    }

    function sumOfCubes(uint x, uint y) external pure returns (uint) {
        // Wrap complex math logic inside unchecked
        unchecked {
            uint x3 = x * x * x;
            uint y3 = y * y * y;

            return x3 + y3;
        }
    }
}

Bu akıllı sözleşme, “Unchecked” kullanımının Solidity 0.8’deki etkisini göstermek için bir örnek sunar. Sözleşme, 3 fonksiyon içerir:

  • add: İki unsigned integer değerini toplar ve sonucu döndürür. Fonksiyon iki yöntemle uygulanmıştır. İlk olarak, x + y işlemi normal yoldan gerçekleştirilir ve sonuç, hata fırlatma özelliği açık olduğundan dolayı taşma hatası fırlatılır. İkincisi, “unchecked” bloğu içinde x + y işlemi gerçekleştirilir, bu nedenle hata fırlatma özelliği kapatılır ve sonuç doğrudan döndürülür. Bu sayede, gas maliyeti azaltılmıştır.
  • sub: İki unsigned integer değerini çıkarır ve sonucu döndürür. Bu fonksiyon, add fonksiyonuna benzer bir şekilde çalışır ve normal yoldan gerçekleştirilen işlem taşma hatası fırlatırken, “unchecked” kullanımı taşma hatası fırlatmadan sonucu doğrudan döndürür.
  • sumOfCubes: Bu fonksiyon, iki unsigned integer değerinin küplerinin toplamını hesaplar ve sonucu döndürür. Fonksiyon, kompleks matematiksel işlemleri “unchecked” bloğunun içine yerleştirir. Bu sayede, gas maliyeti azaltılır.

Bu örnek, “Unchecked” kullanımının gas maliyetindeki azalmayı sağlamakla birlikte, taşma hatası veya alt taşma hatası gibi sorunlara karşı dikkatli olunması gerektiğini de hatırlatır.

SONUÇ BAĞLAMI

Solidity programlama dilinde, sayı taşması ve alt taşması çok önemli konular arasındadır. Bu hatalar, programın doğruluğunu ve güvenliğini etkileyebilir. Solidity 0.8 sürümünden itibaren, sayı taşması ve alt taşması hata fırlatır. Ancak, bu özellik “unchecked” kullanarak devre dışı bırakılabilir. Bu, gas maliyetini azaltabilir, ancak aynı zamanda dikkatli bir şekilde kullanılması gerektiğini de hatırlatır.

Ayrıca, Solidity’deki diğer matematiksel fonksiyonlar da mevcuttur, örneğin SafeMath gibi. Bu fonksiyonlar, sayısal verilerin işlenmesinde güvenli bir yol sağlar.

Son olarak, Solidity’deki sayısal veri türleri ve boyutları hakkında bilgi sahibi olmak önemlidir. Doğru boyutlu bir veri türünün kullanımı, programın doğruluğunu ve performansını artırabilir.

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