Solidity Mapping Nedir?

Solidity Mapping Nedir?

Merhabalar. Önceki yazılarımda referans türlerini ele almıştım. Bu yazımdaysa Mapping Types (Haritalama Türleri) konusunu örnekler vererek açıklayacağım.

Solidity'de Mapping Types Nedir?

Haritalama türü, mapping type, diğer programlama dillerindeki sözlük (dictionary) ya da karma tablolarına (hash table) benzer özellik taşıyan, anahtar-değer (key-value) eşleşmesi yapılarak verilerin depolandığı bir veri türüdür.

Anahtar-Değer (Key-Value) Eşleşmesi

Key-value, birbirinden farklı isimlendirilen her bir benzersiz anahtarın bir değerle eşleşmesidir. Açıklayıcı olması açısından Python'daki sözlük kullanım örneğini inceleyebilirsiniz.

# key-value eşleşmesi yapan bir sözlük (dictionary) tanımladık.
sozluk = {}


# Sözlük içerisine anahtarlar ekledik ve anahtarlara değer tanımladık. 
sozluk["key1"] = "A"
sozluk["key2"] = "B"
sozluk["key3"] = "C"
sozluk["key4"] = "D"


# Örnek Sözlük:=>  {"key1": "A", "key2": "B", "key3": "C", "key4": "D"

Burada önemli olan şudur:

  • Bir sözlükte her bir anahtar yalnızca bir kere kullanılabilir. Örneğin, key1 anahtarı bir sözlükte iki kere kullanılamaz.
# MÜMKÜN =>  {"key1": "A", "key2": "B", "key3": "C", "key4": "D"}
# MÜMKÜN DEĞİL =>  {"key1": "A", "key1": "X", "key2": "B", "key3": "C", "key4": "D"}

Haritalama türleri, mapping(_AnahtarTuru=> _DegerTuru) degiskenAdi şeklinde kullanılır.

  • _AnahtarTuru .değerle eşleşecek olan anahtarın sahip olacağı veri türüdür. Sıklıkla benzersiz olmaları nedeniyle address veri türü anahtar olarak kullanılmaktadır. Ancak farklı veri türleri de kullanılabilir.
  • _DegerTuru anahtarların hangi türde değerlerle eşleşeceğini gösteren veri türüdür. _DegerTuru, structs, arrays, mapping dahil olmak üzere herhangi bir veri türünde olabilir. Örneğin, her bir adresin sahip olduğu para miktarını tutmak için address => uint .şeklinde bir haritalama yapabiliriz. Böylelikle her bir ETH adresinin, address, sahip olduğu parasal değerin karşılığını, uint, depolayabiliriz.
pragma solidity >=0.4.0 <0.9.0;


struct sinif {
    uint id;
    string isim;
    string soyisim;
}


contract MappingTypes {
    enum enumListe { A, B, C } // Enum


    mapping(address => uint) haritalama;
    mapping(address => sinif) haritalama1;
    mapping(address => mapping(address => uint)) haritalama2;
    mapping(string => uint) haritalama3;
    mapping(uint => uint) haritalama4;
    mapping(enumListe => uint) haritalama6;


    // TypeError: Only elementary types, contract types or enums are allowed as mapping keys.
    // TypeError: Eşleme anahtarı olarak yalnızca temel türlere, sözleşme türlerine veya numaralandırmalara izin verilir.
    // mapping(ogrenci => uint) haritalama5

Haritalama türleri, mapping types, yalnızca storage da durum değişkeni, state variable, olarak depolanabilir. Mapping türleri public olarak tanımlandığında bir getter Solidity tarafından oluşturulur. Böylelikle istenilen değer anahtarla kolaylıkla çağrılabilir.

// address => uint eşlemesini sağlayan publicMapping isminde bir haritalama oluşturduk.
mapping(address => uint) public publicMapping;

Mapping Kullanım Örneği

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


contract MappingOrnegi {
    // Her bir adresin sahip olduğu bakiyeyi address => uint eşleşmesiyle tutuyoruz.
    mapping(address => uint) public bakiyeler;


    // bakiyeDegistir fonksiyonuyla parametre olarak gönderilen yeni bakiyeyi, işlemi yapan adrese (msg.sender) eşleştiriyoruz. Bakiye güncelleniyor.
    function bakiyeDegistir(uint yeniBakiye) public {
        // bakiyeler içerisinden işlemi yapan adresi (msg.sender) bulup ardından yeni bakiye tanımlıyoruz.
        bakiyeler[msg.sender] = yeniBakiye;
    }

MappingOrnegi sözleşmesini yayınladıktan hemen sonra işlem yaptığımız adresin bakiyesini bakiyeler ile kontrol edersek 0 sonucunu alacağız. Sonrasında bakiyeDegistir fonksiyonuyla yeni değer gönderdikten sonra kontrol ettikten sonra yeni değer sonuç olarak karşımıza çıkacaktır.

Mapping türleri, Solidity dilindeki akıllı sözleşmelerde sıklıkla kullanılmaktadır ve diğer yazılım dillerindeki dictionary ve hash table yapılarına benzer nitelik taşımaktadır. Bu yazımda Mapping Type konusunu örnekler vererek açıklamaya çalıştım. Umarım yardımcı olabilmişimdir.

Diğer yazılarımda görüşmek üzere. 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