Solidity Akıllı Sözleşmelerinin Yapısı

Solidity Akıllı Sözleşmelerinin Yapısı

Akıllı sözleşmeler durum değişkenleri, fonksiyonlar, fonksiyon düzenleyiciler, hatalar, liste ve yapı türleri, olaylar gibi tanımlamalar içermektedir. Ayrıca akıllı sözleşmeler farklı akıllı kontratlardan miras alabilmekte ve kullanılabilmektedir.

Merhabalar. Solidity'de programlamaya giriş bölümünden sonra bu yazımızda Solidity akıllı sözleşmelerinin yapısını inceleyeceğiz. Solidity eğitim serisinde orjinal dökümandaki akışı takip ettiğimi ve kodlama ile ilgili bölümlerde Türkçe tanımlamalar yaptığımı belirtmek isterim. Kodlarda açıklayıcı olması açısından Türkçe tanımlamalar yapsam da yazmış olduğunuz kodlarda İngilizce tanımlamalar ve yorumlar kullanmanız ortak bir yapı izleme adına daha iyi olacaktır.

Akıllı sözleşmeler durum değişkenleri, fonksiyonlar, fonksiyon düzenleyiciler, hatalar, liste ve yapı türleri, olaylar gibi tanımlamalar içermektedir. Ayrıca akıllı sözleşmeler farklı akıllı sözleşmelerden miras alabilmekte ve kullanılabilmektedir.

Durum Değişkenleri(State Variables)

Durum değişkenleri(state variables), akıllı sözleşme deposunda(storage) kalıcı olarak tutulan ve farklı türlerde değerlere sahip olabilen değişkenlerdir.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;


//Örnek bir sozlesme
contract BasitSozlesme {
    uint depolananVeri; // Durum değişkeni
    bool depolananVeri2; //Doğru-yanlış(bool) türünde durum değişkeni
    address adresim; //
    // ...
}

Fonksiyonlar(Functions)

Akıllı sözleşme kodlarının hem içerisinde hem dışarısında tanımlanabilen fonksiyonlar(functions), tekrar tekrar çağrılabilen kod birimleridir. Fonksiyonlar,

  • çeşitli türlerde parametreler alabilmektedir,
  • işlem sonrası geriye bir değer döndürebilmektedir,
  • gizli(private) veya açık(public) görünürlükte olabilmektedir.
// SPDX-License-Identifier: GPL-3.0


pragma solidity >=0.7.0 <0.9.0;


/**
 * @title Depo
 */
contract BasitDepoSozlesmesi {


    uint256 sayi;


    /**
     * @dev kişi sayı belirtir
     * @param sayiniz değeri yazmak için bulunur
     */
    function sayiBelirt(uint256 sayiniz) public {
        sayi = sayiniz;
    }
    
    
    function sayimiIkiyeKatla(uint256 sayiniz) public {
        sayi = sayimiIkiyleCarp(sayiniz);
    }
    /**
     * @dev daha önceden belirtilen sayi geri çağrılır
     * @return value of 'sayiniz'
     */
    function belirtilenSayiyiCagir() public view returns (uint256){
        return sayi;
    }
}


// Sözleşme dışında tanımlanan yardımcı fonksiyondur.
function sayimiIkiyleCarp(uint x) pure returns (uint) {
    return x * 

Fonksiyon Değiştiriciler(Function Modifiers)

Fonksiyon değiştiriciler(function modifiers), birden fazla fonksiyona etki ederek fonksiyon davranışlarını değiştirebilen fonksiyon benzeri yapılardır. Fonksiyon değiştiriciler, fonksiyonların sağlaması gereken çeşitli şartları kontrol etmek amacıyla kullanılır.

Her fonksiyon değiştirici(function modifier) en son satırına _; işaretini almak zorundadır. Kullanılmadığı taktirde program tarafından SyntaxError: Modifier body does not contain '_' şeklinde bir hata fırlatılacaktır.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.1 <0.9.0;


contract yoneticiKontrolSozlesmesi {
    constructor() { yonetici = payable(msg.sender); }
    address payable yonetici;


    //Bu sözleşme diğer sözleşmelerin miras alması için oluşturulmuştur.
    //_; işareti ile modifier'ı sonlandırdığımızı söylüyoruz. Yoksa program
    //bize hata fırlatacaktır.
    modifier sadeceYoneticiler {
        require(
            msg.sender == yonetici,
            "Yalnizca yoneticiler bu islemi gerceklestirebilir."
        );
        _;
    }
}


//"yoneticiKontrolSozlesmesi" sözleşmesinden türetilmiş bir sözleşmedir.
contract sozlesmeyiYokEt is yoneticiKontrolSozlesmesi {
    /*
        Sözleşme kendi kendini yok edebilir. Bu 
        noktada aşağıda eklediğimiz kod bu işlemi
        yalnızca yöneticinin yapabilmesine imkan verir.
    */
    function yokEt() public sadeceYoneticiler {
        selfdestruct(yonetici);
    }

Olaylar(Events)

Olaylar(events), akıllı sözleşmede gerçekleştirilen işlemlerin Ethereum Sanal Makinesi'ndeki günlüğünü(logs) tutmaya yarar.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.21 <0.9.0;


contract BasitAcikArttirmaSozlesmesi {
    event EnYuksekTeklifVerildi(address teklifVeren, uint neKadar); // Olay


    function teklifVer() public payable {
        // ...
        emit EnYuksekTeklifVerildi(msg.sender, msg.value); //Olayı çağırıyoruz.
    }

Hatalar(Errors)

Hatalar(errors), akıllı sözleşmelerde meydana gelebilecek problemlerde, geçersiz veya yanlış işlemlerde kullanıcıya anlamlı hata durumu mesajı döndürülmesini sağlar. Hatalar revertkodu(revert statements) ile kullanılır ve string ifadelerin yanı sıra farklı verilerde içerebilir.

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;


//Yeterli miktar bulunmadığında bir hata dönülür.
error YeterliMiktarYok(uint requested, uint available);


contract TransferSozlesmesi {
    mapping(address => uint) kullanicilar;
    function transferYap(address kime, uint miktar) public {
        uint kullanici = kullanicilar[msg.sender];
        if (kullanici < miktar)
            revert YeterliMiktarYok(miktar, kullanici);
        kullanicilar[msg.sender] -= miktar;
        kullanicilar[kime] += miktar;
        // ...
    }

Yapılandırıcı Türleri(Struct Types)

Yapılandırıcılar(structs), bir veya birden fazla yapılandırıcı türünü barındırabilen sınıf(class) benzeri yapılardır. Yapılandırıcı türleri(struct types) ise bu yapılarda depolanan değişken türleridir.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;


//Oy pusulası sözleşmesi olsun
contract OyKagidi {
    struct OyVeren { // Class benzeri "Struct" Yapısı
        uint kilo;
        bool evetHayir;
        address kime;
        uint oy;
    }
}

Listeleme Türleri(Enum Types)

Sıralı listeler(Enums), varsayılan ve değiştirilemez sonlu dizi setleri oluşturmak için kullanılır.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;


contract Blog {
    //Blog yayın durumunun hangi değerler alabileceğini liste içinde belirtebiliriz. 
    //Böylelikle uygun şartlar sağlandığında bu liste dışında bir durum belirtilemeyecektir.


    enum YayinDurumu { Yayinda, Taslak, Pasif, Silindi } // Enum

Her bir kavram kendi içerisinde dallara ayrıldığından ötürü sizleri sıkmamak adına bu yazımızda akıllı sözleşme yapısını yüzeysel olarak incelemiş olduk. Durum değişkenlerinin, fonksiyonların, fonksiyon değiştiricilerinin, olayların, hataların, struct yapılarının ve sıralı listelerin nasıl kullanıldığını ufak örneklerle tanımladık. Serinin ilerleyen yazılarında bu kavramları daha kapsamlı inceleyeceğiz. Kendinize iyi bakın!

Yorumunu Bırak

Çok hızlısın. Biraz dinlendikten sonra tekrar devam edebilirsin.
Bugünlük gönderebileceğin kadar yorum gönderdin. Lütfen yarın tekrar dene.
Mesajınız bize başarılı bir şekilde ulaştırıldı. Teşekkürler.

Yorumlar

0 Yorum yok

Henüz yorum yapılmamış. İlk yorum yapan sen ol.

Blog Yazarı

Ömer Faruk Coşkun
Yazar
@ofcskn

İstanbul Üniversitesi Bilgisayar Mühendisliği Öğrencisi