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.
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ı nedeniyleaddress
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çinaddress => 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;
// 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
Yorumlar
0 Yorum yokHenüz yorum yapılmamış. İlk yorum yapan sen ol.