1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 020 : Function Modifiers

🧵 #100GündeSolidity 020 : Function Modifiers
Function Modifiers
0

Function Modifiers: Erişim Kısıtlamaları, Girdi Doğrulama ve Reentrancy Hack’lere Karşı Korunma

Solidity programlama dili için function modifiers, smart contract geliştiricilerine önemli bir araç sunmaktadır. Modifiers, bir function çağrısından önce ve/veya sonra çalıştırılan kod parçacıklarıdır. Bu kod parçacıkları sayesinde, erişimi kısıtlamak, girdileri doğrulamak ve reentrancy hack’lere karşı korunmak mümkündür. Bu bültende, function modifiers nedir ve nasıl kullanılır, erişim kısıtlamaları nasıl uygulanır, girdi doğrulama nasıl yapılır, reentrancy hack’lere karşı nasıl korunulur, örnek uygulamalar ve kullanım senaryoları, function modifiers ile ilgili potansiyel sorunlar ve çözümleri gibi konuları ele alacağız.

Function Modifiers nedir ve nasıl kullanılır?

Function modifiers, Solidity programlama dili için tasarlanmış bir araçtır. Modifiers, bir function çağrısından önce ve/veya sonra çalıştırılan kod parçacıklarıdır. Bu kod parçacıkları, function çağrısının gerçekleştirilmesi için gerekli olan koşulları kontrol etmek için kullanılabilir. Örneğin, bir function sadece belirli kullanıcılar tarafından çağrılabilirse, bu kullanıcıların kimliklerini doğrulayan bir modifier kullanılabilir.

Function modifiers, “modifier” anahtar kelimesi ile tanımlanır ve içlerinde kod parçacıklarını barındırır. Bir modifier, bir function çağrısından önce veya sonra çalıştırılmak üzere belirli bir function’da kullanılabilir. Örneğin, bir function çağrısından önce kullanılacak bir modifier için aşağıdaki gibi bir kod kullanılabilir:

modifier onlyAdmin {
    require(msg.sender == admin);
    _;
}

Bu modifier, function çağrısını yalnızca “admin” kullanıcısı tarafından gerçekleştirilirse gerçekleştirecektir. Eğer çağrı yapan kullanıcı “admin” değilse, a require statement’ı false döndürecek ve function çağrısı gerçekleşmeyecektir.

Function modifiers kullanmak için, bir function çağrısından önce veya sonra çalıştırılmak üzere tanımlanmış bir modifier’ı function tanımının üstüne eklemek gerekir. Örneğin, sadece “admin” kullanıcıları tarafından çağrılabilecek bir function için aşağıdaki gibi bir kod kullanılabilir:

function someFunction() public onlyAdmin {
    // function body
}

Bu şekilde function çağrısından önce “onlyAdmin” modifier çalıştırılmış olacaktır.

Access Restrictions (erişim kısıtlamaları) nasıl uygulanır

Access restrictions, bir smart contract içindeki function’ların belirli kullanıcılar tarafından çağrılmasını sınırlamak için kullanılan bir yöntemdir. Bu, özellikle smart contract içindeki değerli verilerin veya kaynakların güvenliğini sağlamak için önemlidir.

Access restrictions, function modifiers kullanarak uygulanabilir. Örneğin, sadece belirli bir kullanıcı grubu tarafından çağrılabilecek bir function için aşağıdaki gibi bir modifier kullanılabilir:

modifier onlyAdmins {
    require(msg.sender.address in admins);
    _;
}

Bu modifier, sadece “admins” dizisinde tanımlanmış kullanıcılar tarafından çağrılmasını sağlar. Bu dizi, smart contract içinde tanımlanmış bir dizidir ve içinde yönetici kullanıcıların adreslerini barındırır.

Access restrictions, aynı zamanda smart contract içinde tanımlanmış rol bazlı kontrol sistemleri kullanarak da uygulanabilir. Örneğin, smart contract içinde bir “admin” rolü tanımlanabilir ve bu rolün sahibi olan kullanıcıların belirli function’ları çağırmasına izin verilebilir.

Access restrictions, smart contract içindeki değerli verilerin veya kaynakların güvenliğini sağlamak için önemlidir. Ancak, aynı zamanda smart contract’ın kullanımını ve yönetimini de kolaylaştırır. Örneğin, yalnızca yönetici kullanıcıların belirli function’ları çağırmasına izin vermek, smart contract’ın yönetimini ve güncelleştirmesini kolaylaştırır.

Input validation (girdi doğrulama) nasıl yapılır

Input validation, bir smart contract içindeki function’ların çağrılması sırasında girdi değerlerinin doğruluğunu kontrol etmek için kullanılan bir yöntemdir. Bu, özellikle smart contract içindeki değerli verilerin veya kaynakların güvenliğini sağlamak için önemlidir.

Input validation, function modifiers kullanarak yapılabilir. Örneğin, bir function için aşağıdaki gibi bir modifier kullanılabilir:

modifier validInput {
    require(input > 0 && input < 100);
    _;
}

Bu modifier, function’un çağrılması sırasında “input” değişkeninin 0’dan büyük ve 100’den küçük olmasını kontrol eder. Eğer bu koşul sağlanmazsa, function çağrısı reddedilir ve hata mesajı gösterilir.

Input validation, aynı zamanda smart contract içinde tanımlanmış fonksiyonlar veya kütüphaneler kullanarak da yapılabilir. Örneğin, smart contract içinde bir “validateInput” fonksiyonu tanımlanabilir ve bu fonksiyon her function çağrısı sırasında çağrılır. Bu fonksiyon, girdi değerlerinin doğruluğunu kontrol eder ve eğer değerler doğru değilse, hata mesajı gösterir ve function çağrısı reddedilir.

Input validation, smart contract içindeki değerli verilerin veya kaynakların güvenliğini sağlamak için önemlidir. Ancak, aynı zamanda smart contract’ın kullanımını ve yönetimini de kolaylaştırır. Örneğin, girdi değerlerinin doğruluğunun kontrol edilmesi, smart contract’ın hatalı kullanımını veya kötü niyetli saldırıları önler.

Reentrancy hack’lere karşı nasıl korunulur

Reentrancy hack, smart contract’ların bir function çağrısı sırasında çağrıldığı diğer function’lar tarafından yeniden çağrılmasına yol açan bir saldırı türüdür. Bu saldırı, smart contract’ın içinde bulunan kaynakların veya değerli verilerin yanlış kullanımına veya kaybına neden olabilir.

Reentrancy hack’lere karşı korunmak için, smart contract içinde function modifiers kullanılabilir. Örneğin, aşağıdaki gibi bir modifier kullanılabilir:

modifier noReentrancy {
    require(!address(this).call.value(0)());
    _;
}

Bu modifier, function çağrısı sırasında “this” adresi tarafından yapılan bir çağrı olup olmadığını kontrol eder. Eğer çağrı yapılmışsa, function çağrısı reddedilir ve hata mesajı gösterilir.

Ayrıca, smart contract içinde tanımlanmış bir “mutex” (mutual exclusion) semaforu kullanılabilir. Bu semafor, function çağrısı sırasında kilitlenir ve diğer function’ların çağrılmasına izin vermez. Bu, reentrancy hack’lere karşı smart contract’ın korunmasını sağlar.

Reentrancy hack’leri önlemek için başka yollar da mevcut olabilir. Örneğin, function’ların yalnızca belirli kaynakları kullanmasını veya belirli değerleri değiştirmesini sınırlamak, reentrancy hack’lere karşı smart contract’ın daha güvenli hale getirmek için faydalı olabilir.

Reentrancy hack’lere karşı korunmak, smart contract içindeki değerli verilerin veya kaynakların güvenliğini sağlamak için önemlidir. Ancak, aynı zamanda smart contract’ın kullanımını ve yönetimini de kolaylaştırır. Örneğin, reentrancy hack’lere karşı korunmak, smart contract’ın hatalı kullanımını veya kötü niyetli saldırıları önler.

Örnek uygulamalar ve kullanım senaryoları

Function modifiers, smart contract’ların fonksiyonlarının çalışmasını kontrol etmek ve güvenli hale getirmek için kullanılabilir. Aşağıda bazı örnek uygulamalar ve kullanım senaryoları verilmiştir:

  • Access Restrictions (erişim kısıtlamaları): Function modifiers, smart contract’ların fonksiyonlarının çalışmasını sadece belirli kullanıcılar için sınırlandırmak için kullanılabilir. Örneğin, bir token contract’ının fonksiyonlarının sadece yöneticiler tarafından kullanılmasını sağlamak için bir modifier kullanılabilir.
modifier onlyOwner {
    require(msg.sender == owner);
    _;
}
  • Input validation (girdi doğrulama): Function modifiers, smart contract’ların fonksiyonlarının çalışması sırasında girdi değerlerinin doğruluğunu kontrol etmek için kullanılabilir. Örneğin, bir token contract’ının fonksiyonlarının sadece geçerli token miktarlarını almasını sağlamak için bir modifier kullanılabilir.
modifier validAmount {
    require(msg.value > 0);
    _;
}
  • Reentrancy hack’lere karşı korunma: Function modifiers, smart contract’ların fonksiyonlarının çalışması sırasında reentrancy hack’lere karşı korunmak için kullanılabilir. Örneğin, bir token contract’ının fonksiyonlarının sadece bir kez çağrılmasını sağlamak için bir modifier kullanılabilir.
modifier noReentrancy {
    require(!address(this).call.value(0)());
    _;
}
  • Smart contract’ların özel durumlarını yönetme: Function modifiers, smart contract’ların fonksiyonlarının çalışması sırasında özel durumları yönetmek için kullanılabilir. Örneğin, bir token contract’ının fonksiyonlarının sadece geçerli bir blok aralığı içinde çalışmasını sağlamak için bir modifier kullanılabilir.
modifier onlyValidPeriod {
    require(block.timestamp >= startTime && block.timestamp <= endTime);
    _;
}

Bu örnekte, onlyValidPeriod modifier’ı, sadece smart contract’ın belirlenen başlangıç ve bitiş zamanları arasında çalışmasını sağlar. Bu sayede, smart contract’ın sadece belirli bir zaman aralığı içinde çalışmasını veya belirli bir zaman aralığı içinde çalışmamasını sağlamak mümkündür.

Function Modifiers ile ilgili potansiyel sorunlar ve çözümleri

Function modifiers, smart contract yazarken kullanılan pratik bir yöntemdir. Ancak, bazı potansiyel sorunlar da mevcuttur:

  1. Aşırı kapsamlı kontrol: Function modifiers, smart contract’ın çalışmasını kontrol etmek için kullanılırken, aşırı kapsamlı kontroller yapmak mümkündür. Bu, smart contract’ın performansını olumsuz etkileyebilir ve bazı durumlarda işlemlerin tamamlanmasını engelleyebilir.
  2. Code Duplication: Function modifiers, aynı kontrolleri birden fazla fonksiyon için tekrar tekrar kullanmak zorunda kalabilir. Bu, kod çoğaltmasına ve bakım zorluklarına neden olabilir.
  3. Complexity: Function modifiers kullanmak, smart contract kodunun anlaşılmasını ve bakımını daha zor hale getirebilir.

Bu sorunların çözümü için:

  1. Kontrolleri kapsamlı olmayacak şekilde yazmak ve sadece gerekli olan kontrolleri yapmak
  2. Kontrolleri içeren fonksiyonları veya sınıfları oluşturmak ve bunları ihtiyacımız olduğunda kullanmak
  3. Smart contract kodunun okunaklılığını ve bakımını kolaylaştırmak için tasarım kalıplarını kullanmak
  4. Testleri yazmak ve smart contract’ın doğru şekilde çalıştığından emin olmak.

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

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

contract FunctionModifier {
    // We will use these variables to demonstrate how to use
    // modifiers.
    address public owner;
    uint public x = 10;
    bool public locked;

    constructor() {
        // Set the transaction sender as the owner of the contract.
        owner = msg.sender;
    }

    // Modifier to check that the caller is the owner of
    // the contract.
    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        // Underscore is a special character only used inside
        // a function modifier and it tells Solidity to
        // execute the rest of the code.
        _;
    }

    // Modifiers can take inputs. This modifier checks that the
    // address passed in is not the zero address.
    modifier validAddress(address _addr) {
        require(_addr != address(0), "Not valid address");
        _;
    }

    function changeOwner(address _newOwner) public onlyOwner validAddress(_newOwner) {
        owner = _newOwner;
    }

    // Modifiers can be called before and / or after a function.
    // This modifier prevents a function from being called while
    // it is still executing.
    modifier noReentrancy() {
        require(!locked, "No reentrancy");

        locked = true;
        _;
        locked = false;
    }

    function decrement(uint i) public noReentrancy {
        x -= i;

        if (i > 1) {
            decrement(i - 1);
        }
    }
}

Bu örnekte, “FunctionModifier” adlı bir sözleşme oluşturulmuş. Sözleşme içinde “owner” adresi, “x” değişkeni ve “locked” değişkeni tanımlanmış. “constructor” fonksiyonu, sözleşmeye sahip olan adresi sözleşmenin sahibi olarak ayarlar.

Sözleşmenin içinde “onlyOwner” ve “validAddress” adlı iki fonksiyon modifiye edici tanımlanmış. “onlyOwner” modifiye edici, çağrı yapan kişinin sözleşmenin sahibi olduğunu kontrol eder ve “require” kullanarak sözleşmenin sahibi değilse hata oluşur. “validAddress” modifiye edici, verilen adresin geçerli bir adres olup olmadığını kontrol eder ve “require” kullanarak adres geçerli değilse hata oluşur.

“changeOwner” fonksiyonu, “onlyOwner” ve “validAddress” modifiye edicileri kullanılarak tanımlanmış. Bu fonksiyon, sözleşmenin sahibini değiştirmek için kullanılır ve sadece sözleşmenin sahibi tarafından çağrılabilir ve geçerli bir adres verilirse çalışır.

“decrement” fonksiyonu, “noReentrancy” modifiye edicisini kullanarak tanımlanmış. Bu modifiye edici, fonksiyonun yeniden çağrılmasını önler ve “locked” değişkenini kullanarak bu durumu kontrol eder. Eğer fonksiyon yeniden çağrılıyorsa, “require” kullanarak hata oluşur.

  • İşlev açısından, bu akıllı sözleşme özel yetkili erişimi, geçerli adres doğrulaması ve reentrancy hack’lere karşı koruma için function modifiers kullanmaktadır.
  • Verimlilik açısından, function modifiers kullanılarak yazılan kod daha okunaklı ve anlaşılır hale gelir, ancak aynı işlemi yapmak için ayrı ayrı kod yazmak daha verimli olabilir.
  • Güvenlik açısından, function modifiers kullanılarak yazılan kod daha güvenli hale gelir çünkü özel yetkili erişim, geçerli adres doğrulama ve reentrancy hack’lere karşı koruma önlemleri alınmıştır.

Sonuç Bağlamı

Function Modifiers, Solidity dilinde yazılan akıllı sözleşmelerde önemli bir rol oynar. Bu özellik sayesinde erişim kısıtlamaları, girdi doğrulaması ve reentrancy hack’lere karşı koruma işlemleri daha kolay ve okunaklı bir şekilde yapılabilir. Bu özellik sayesinde kodun anlaşılırlığı artar ve güvenlik önlemleri alınabilir. Ayrıca bu özellik sayesinde kod verimliliği de arttırılabilir. Özellikle erişim kısıtlamaları, girdi doğrulama ve reentrancy hack’lere karşı koruma işlemleri güvenlik açısından önemlidir. Bu nedenle function modifiers, akıllı sözleşmelerin yazımı sırasında kullanılması tavsiye edilen bir özelliktir.

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