Solidity Kaynak Dosyasının Yapısı - Solidity Programlamaya Giriş

Solidity Kaynak Dosyasının Yapısı

Önceki yazılarımızda Solidity dilinin ne olduğunu, temel blokzinciri yapılarını, örnek bazı kodları ve kavramları ayrıntılı olarak inceledik. Şimdi daha teknik olan kısmına başlayacağız. Bu serideki bundan sonraki yazılarımızda Solidity akıllı kontratlarının yapısı, tasarımı, değişkenleri, fonksiyonları gibi programlama konularını inceleyeceğiz. Başlayalım!

Solidity Kaynak Dosyasının Yapısı

Kaynak dosyaları sınırsız sayıda importyönlendirmeleri, sözleşme tanımları (fonksiyonlar, durum değişkenleri) ve pragma yönlendirmeleri(pragma directives) içerebilir. Ek olarak her kaynak dosyası SPDX-License-Identifier yorum satırı içerir. Aşağıda Solidity diliyle yazılmış örnek bir Storage.sol kaynak dosyasını görmektesiniz.

// SPDX-License-Identifier: GPL-3.0


pragma solidity >=0.7.0 <0.9.0;


/**
 * @title Storage
 * @dev Store & retrieve value in a variable
 */
contract Storage {


    uint256 number;


    /**
     * @dev Store value in variable
     * @param num value to store
     */
    function store(uint256 num) public {
        number = num;
    }


    /**
     * @dev Return value 
     * @return value of 'number'
     */
    function retrieve() public view returns (uint256){
        return number;
   

SPDX Lisans Tanımlayıcıları

Solidity akıllı sözleşme dosyalarının başına koyulan // SPDX-License-Identifier: MIT yorum satırı kodu akıllı sözleşmelere olan güveni pekiştirir ve yasal sorunlara karşı çözüm olur. Her kaynak kodu Solidity derleyicisinin okuyabileceğini SPDX lisans tanımlayıcıları içermek zorundadır.

  • // SPDX-License-Identifier: MIT➝ doğru kullanım
  • // SPDX-License-Identifier:➝ yanlış kullanım (lisans kısaltması gerekir)

Lisans tanımlamaları yaparken SPDX-License-Identifier:kodunun dosyada herhangi bir satırda bulunması ve bir değerinin olması gerekmektedir. Bu lisans değerlerine ve ne işe yaradıklarına SPDX orjinal sitesinden ulaşabilirsiniz. Ayrıca, SPDX satırının yerinin farklı olması bir hataya neden olmasa da çoğunlukla ilk satırda kullanılır.

Pragma Kodları

Pragma kodları derleyici(compiler) özellikleri ve bazı kontroller için kullanılır. Her pragma kodu kaynak dosyalara ayrı ayrı eklenmelidir. import kodu kullanılarak dahil edilen başka kaynak dosyalar, ana kaynak dosyasındaki pragma kodundan etkilenmezler.

Versiyon Pragma Kodları

Pragma versiyon kodları, derleyicilerin kritik versiyon güncellemelerinden etkilenmesini önler. Özetle, kullanılan bu kodlar derleyici ile akıllı sözleşmelerin uyum içinde, sorunsuz çalışmasını sağlar.

Ek olarak, sürümler arasındaki kritik güncellemelerde nelerin değiştiğini ve çözüldüğünü görmek adına orjinal dökümana göz atmak iyi fikir olabilir. Peki pragma versiyon kodları nasıl kullanılır?

pragma solidity ^0.8.12;

Yukarıdaki örnek koda baktığımızda kaynak kodun yalnızca 0.8.12 sürümünden sonraki 0.8.x sürümlerinde çalışacağını, daha önceki sürümlerden etkilenmeyeceğini anlayabiliriz.

^işareti yukarıdaki şekilde kullanıldığında ise kaynak kodun kritik güncellemelerden etkilenmemesi gerektiğini belirtmiş oluruz.

//Bu bir yorum satırıdır. Kodu anlamlı kılmak adına yerleştiriyorum.


pragma solidity ^0.5.2 //Kaynak kodu 0.5.2 versyionundan önceki versiyonlardan etkilenmez. 0.5.2 'den sonraki 0.5.x versiyonlarında geçerli olur.


pragma solidity 0.5.2 // Bu kod kaynak dosyanın yalnızca 0.5.2 versiyonunda çalışacağını belirtir. Bu tarz bir kullanım doğru değildir. Bunun yerine belirli versiyon aralıkları belirtmek hata çözümleri gibi iyileştirmelerden faydalanmak için önemlidir. 


pragma solidity >=0.7.0 <0.9.0; //Kaynak kodun 0.7.0 sürümünden sonraki ve 0.9.0 sürümünden önceki versiyonlardan herhangi biri için geçerli olacağını belirtir

"pragma" kodu, yalnızca derleyicinin kodu hangi versiyona göre okuması gerektiğini belirtmek için gereklidir. Derleyicinin versiyonunun değiştirilmesine, özelliklerinin aktifleştirilmesine ya da pasifleştirilmesine hiçbir etkisi yoktur. Bir başka deyişle, Solidity derleyicileri yer yer güncellenir ancak akıllı sözleşme dosyalarının bu değişikliklerden kötü etkilenmemesi için pragma kodlarının kullanılması gerekir.

ABI Coder Pragma

ABI kodlayıcı (v2), keyfi olarak iç içe geçmiş dizileri ve yapıları kodlayabilir ve kodunu çözebilir. -solidity

pragma abicoder v1 veya pragma abicoder v2 kodları ABI kodlayıcısı(encoder) ve kod çözümleyicisi(decoder) olarak kullanılır.

ABI coder(v2) yeni bir kodlayıcı olduğu için eski kodlayıcı ABI Coder(v1) kadar test almamış olsa da Solidity 0.8.x versiyonlarındaki ABI coder (v1) gibi deneysel kabul edilmez.

Son olarak, Solidity 0.8.x versiyonlarıda varsayılan olarak pragma abicoder v2; kullanılır ancak pragma abicoder v1; kodu kullanılarak ABI Coder V1 de kullanılabilir.

Experimental Pragma

Derleyicilerin bazı özelliklerinin henüz aktif olarak kullanılmadığı zamanlarda deneysel pragma kodları kullanılarak bu özellikler test edilebilir.

ABIEncoderV2

ABI Encode Solidity 0.7.4'den sonraki sürümlerde artık deneysel olarak kullanılmamaktadır. Yani bu kodu test ortamı dışında (live) pragma abicoder v2;şeklinde kullanmanız gerekir.

SMTChecker

Aşırı basitleştirilmiş terimlerle, Solidity derleyicisi için yerleşik bir resmi doğrulama modülüdür. [ayr. bkz]

SMTChecker, genel olarak Solidity kodlarındaki hataları bulmak, açık olup olmadığını kontrol etmek ve programın doğruluğunu kanıtlamak için kullanılır. [ayr. bkz] Ayrıca, SMT Checker gibi modüller genellikle derleyici optimizasyon özellikleri olarak bulunur.

pragma experimental SMTChecker;kullanarak bir SMTChecker'i sorgularsınız ve elde edilen ek güvenlik uyarıları alırsınız. Bu özellik Solidity dilinin tüm özelliklerini desteklemediğinden dolayı birçok hata meydana gelebilmektedir.

Farklı Kaynakları Dahil(import) Etmek

Solidity, modülleme yapmak için farklı kaynak dosyalarını içerisine dahil(import) edebilir. Bu yazım şekli ve kullanım Javascript ES6 diline çok benzerdir.

import "dosya-konumu"; şeklinde kullanılır. "dosya-konumu" ile ayrılmış alana modüllerin, dosyaların konumu verilmelidir.

//Burada dahil(import) edilen dosyaya genel bir modül ismi "as" kodu kullanılarak verilir.
import * as symbolName from "filename"; 


//Yukarıdaki kodun alternatifi olarak kullanılır.
import "filename" as symbolName;


//Bu koddaysa modül içerisindeki birden fazla sembole farklı farklı takma isimler verebiliriz. Bunu yine "as" kodu ile sağlarız.
import {symbol1 as alias, symbol2} from "filename";


//Bir diğer örneği
import {symbol1, symbol2 as alias2} from "filename

Yorum Satırları (Comments)

Diğer birçok yazılım dilindeki gibi Solidity'de de yorum satırları //tek satır yorum alanıdırve /* çok satır yorum alanıdır */ şeklinde kullanılır. Yukarıdaki örnek kodları açıklamak için yorum satırlarını kullandım. Tekrardan göz gezdirebilirsiniz.

// İşaretten sonra tek satır yorum yazabilirsiniz.


/*
  Birden fazla satırda istediğiniz şekilde yorum yazabilirsiniz.
*/

Bu yazımızda Solidity diliyle ilgili teknik kısma giriş yapmış olduk. Temel kod yapıları, import özelliği, yorum satırları, pragmaları ve lisansları inceledik. Bundan sonraki yazımızda kodlarla daha iç içe olacağız. Takipte kalı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