1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 012 : Mapping

🧵 #100GündeSolidity 012 : Mapping
Mapping
0

Mapping: Anahtar-Değer Tabanlı Veri Depolama

#100GündeSolidity serisinin 12. gününde “Mapping” üzerine konuşacağız. Haydi bugün hangi konulara değineceğimizi listeleyelim.

  • Mapping nedir?
  • Mapping kullanımı nasıl olur?
  • Mapping örnekleri
  • Mapping ile ilgili yapabileceklerimiz
  • Mapping ile ilgili sıkça sorulan sorular ve yanıtlar.

Mapping, Solidity dili için anahtar-değer tabanlı veri depolama yapmamıza olanak tanır. Bu yapı, anahtar olarak bir değer tipi (özel olarak bytes veya string gibi) kullanır ve bu anahtar ile ilişkilendirilmiş bir değer tipini saklar. Örneğin, mapping(address => uint) yapısı kullanarak, her adres için bir uint değerini saklayabiliriz. Mapping yapısının kullanımı şöyledir:

mapping(keyType => valueType) myMap;

Mapping yapısı, valueType olarak başka bir mapping veya diziyi de kullanabilir. Örneğin, mapping(address => mapping(uint => bool)) yapısı ile, her adres için bir uint anahtarına bağlı bir bool değerini saklayabiliriz.

Mapping yapısı, dizi gibi iterable değildir, yani elemanlarını tek tek gezemeyiz. Ancak, anahtar değerlerini kullanarak belli bir elemana erişebiliriz. Örneğin:

myMap[key] = value;

Bu şekilde, myMap yapısının key anahtarına value değerini atayabiliriz.

Daha detaylı örneklerle devam edersek,

mapping(address => uint) balances;

Bu örnekte, her adres için bir bakiyeyi saklamak için mapping yapısı kullanılmış. Örneğin, balances[msg.sender] = 100; şeklinde bir kod parçası ile msg.sender adresinin bakiyesini 100 olarak atayabiliriz.

Mapping yapısı, veri depolama ihtiyacı olan birçok senaryoda çok yararlıdır. Özellikle, anahtar-değer ilişkisi olan veri yapılarını depolamak için idealdir.

Mapping nedir?

Mapping, Solidity dili için anahtar-değer tabanlı veri depolama yapmamıza olanak tanır. Bu yapı, anahtar olarak bir değer tipi (özel olarak bytes veya string gibi) kullanır ve bu anahtar ile ilişkilendirilmiş bir değer tipini saklar. Örneğin, mapping(address => uint) yapısı kullanarak, her adres için bir uint değerini saklayabiliriz.

Mapping kullanımı nasıl olur?

Mapping yapısının kullanımı şöyledir:

mapping(keyType => valueType) myMap;

Bu şekilde, myMap isimli bir mapping yapısı oluşturulur ve keyType tipinde bir anahtar ile valueType tipinde bir değer ilişkilendirilir. Örneğin,

mapping(address => uint) balances;

Bu örnekte, her adres için bir bakiyeyi saklamak için mapping yapısı kullanılmış.

Mapping yapısındaki elemanlara erişmek için anahtar değerini kullanabiliriz. Örneğin,

myMap[key] = value;

Bu şekilde, myMap yapısının key anahtarına value değerini atayabiliriz.

Mapping örnekleri

  1. Bir kontrat için kullanıcı bakiyelerini saklamak için:
mapping(address => uint) balances;

Bu örnekte, her adres için bir bakiyeyi saklamak için mapping yapısı kullanılmış. Örneğin, balances[msg.sender] = 100; şeklinde bir kod parçası ile msg.sender adresinin bakiyesini 100 olarak atayabiliriz.

  1. Bir auktion kontratında, her kullanıcının yaptığı teklifleri saklamak için:
mapping(address => mapping(uint => uint)) bids;

Bu örnekte, her adres için bir uint anahtarına bağlı bir uint değerini saklamak için iki adet mapping yapısı kullanılmış. bids[msg.sender][auctionID] = bidAmount; şeklinde bir kod parçası ile msg.sender adresinin, auctionID numaralı auktions için yaptığı teklifin miktarını bidAmount olarak atayabiliriz.

  1. Bir sertifika yönetim sistemi için, her sertifikayı verilen kullanıcıların bilgilerini saklamak için:
mapping(bytes32 => mapping(address => bool)) certificateHolders;

Bu örnekte, her bytes32 tipinde sertifika ID’si için bir adres anahtarına bağlı bir bool değerini saklamak için iki adet mapping yapısı kullanılmış. certificateHolders[certificateID][holderAddress] = true; şeklinde bir kod parçası ile holderAddress adresinin certificateID ID numaralı sertifikasına sahip olduğunu saklayabiliriz.

Mapping ile ilgili yapabileceklerimiz

  1. Anahtar-değer ilişkisi olan veri yapılarını depolamak: Mapping yapısı, anahtar-değer ilişkisi olan veri yapılarını depolamak için idealdir. Örneğin, kullanıcı bakiyelerini, yaptığı teklifleri, sahip olduğu sertifikaları vb. gibi verileri saklamak için kullanabiliriz.
  2. Anahtar-değer araması yapmak: Mapping yapısındaki elemanlar, anahtar değerleri kullanılarak çok hızlı bir şekilde aranabilir. Örneğin, bir kullanıcının bakiyesini bulmak için balances[userAddress] şeklinde bir kod parçası kullanabiliriz.
  3. Anahtar-değer eşleştirmesi yapmak: Mapping yapısındaki elemanlar, anahtar değerleri kullanılarak eşleştirme işlemleri yapabiliriz. Örneğin, bir kullanıcının sahip olduğu sertifikaların listesini bulmak için certificateHolders[certificateID][userAddress] şeklinde bir kod parçası kullanabiliriz.
  4. Anahtar-değer değişikliklerini izlemek: Mapping yapısındaki elemanlar, anahtar değerleri kullanılarak değişiklikler izlenebilir. Örneğin, bir kullanıcının bakiyesinin değiştiğini anlamak için event ile balances[userAddress] şeklinde bir kod parçası kullanabiliriz.
  5. Anahtar-değer sıralaması yapmak: Mapping yapısı, anahtar değerleri kullanarak sıralamalar yapmak için uygun değildir çünkü iterable değil.
  6. İşlem maliyetlerini azaltmak: Mapping yapıları, işlem maliyetlerini azaltmak için kullanılabilir çünkü veri depolama için gereken bellek miktarını azaltır.

Mapping ile ilgili Sıkça Sorulan Sorular ve Yanıtları

  1. Mapping yapısındaki elemanlar nasıl gezilir? Mapping yapısı, dizi gibi iterable değildir, yani elemanlarını tek tek gezemeyiz. Ancak, anahtar değerlerini kullanarak belli bir elemana erişebiliriz. Örneğin:
myMap[key] = value;

Bu şekilde, myMap yapısının key anahtarına value değerini atayabiliriz.

  1. Mapping yapısındaki elemanların sıralaması nasıl yapılır? Mapping yapısı, anahtar değerleri kullanarak sıralamalar yapmak için uygun değildir çünkü iterable değil. Ancak, sıralamak istediğiniz elemanları diziye atıp o diziyi sıralayabilirsiniz.
  2. Mapping yapısındaki elemanların önbellekte saklanması nasıl yapılır? Mapping yapısı, elemanları önbellekte saklamak için kullanılmaz. Önbellekte saklamak istediğiniz verileri, önbellekleme için uygun veri yapılarını kullanmalısınız.
  3. Mapping yapısındaki elemanların bellekte saklanması nasıl yapılır? Mapping yapısı, elemanları bellekte saklamak için kullanılabilir. Örneğin, mapping(address => uint) balances; şeklinde bir yapı oluşturulduğunda, elemanlar bellekte saklanır.
  4. Mapping yapısındaki elemanlar nasıl silinir? Mapping yapısındaki elemanlar, anahtar değerleri kullanarak tek tek silinebilir. Örneğin, delete myMap[key]; şeklinde bir kod parçası ile myMap yapısının key anahtarına bağlı elemanı silebilirsiniz.

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

Aşağıdaki Solidity kodunu güvenlik, işlev, verimlilik açılarından inceleyelim.

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

contract Mapping {
    // Mapping from address to uint
    mapping(address => uint) public myMap;

    function get(address _addr) public view returns (uint) {
        // Mapping always returns a value.
        // If the value was never set, it will return the default value.
        return myMap[_addr];
    }

    function set(address _addr, uint _i) public {
        // Update the value at this address
        myMap[_addr] = _i;
    }

    function remove(address _addr) public {
        // Reset the value to the default value.
        delete myMap[_addr];
    }
}

contract NestedMapping {
    // Nested mapping (mapping from address to another mapping)
    mapping(address => mapping(uint => bool)) public nested;

    function get(address _addr1, uint _i) public view returns (bool) {
        // You can get values from a nested mapping
        // even when it is not initialized
        return nested[_addr1][_i];
    }

    function set(address _addr1, uint _i, bool _boo) public {
        nested[_addr1][_i] = _boo;
    }

    function remove(address _addr1, uint _i) public {
        delete nested[_addr1][_i];
    }
}

Kod, iki adet kontrat içermektedir: Mapping ve NestedMapping.

Mapping kontratı, bir adres için bir tamsayı değerini saklamak için mapping yapısını kullanır. Kontrat, adres verilen bir değeri döndürmek için “get” fonksiyonu, adres ve tamsayı değer verilen bir değeri güncellemek için “set” fonksiyonu ve adres verilen değeri sıfırlamak için “remove” fonksiyonu içermektedir.

NestedMapping kontratı, bir adres için bir tamsayı anahtarına bağlı bir bool değerini saklamak için iki adet mapping yapısını kullanır. Kontrat, adres ve tamsayı verilen bir değeri döndürmek için “get” fonksiyonu, adres, tamsayı ve bool değer verilen bir değeri güncellemek için “set” fonksiyonu ve adres ve tamsayı verilen değeri sıfırlamak için

“remove” fonksiyonu içermektedir.

Bu kontratlar, mapping yapısının nasıl kullanılabileceğini ve nested mapping yapısının nasıl oluşturulabileceğini göstermektedir. “get”, “set”, “remove” fonksiyonları ile anahtar-değer ilişkisi olan veri yapısını okuma, güncelleme ve sıfırlama işlemleri yapılabilmektedir.

Ayrıca, “view” ve “public” anahtar kelimeleri ile fonksiyonların sadece okunabilir veya herkes tarafından erişilebilir olarak tanımlanabildiği görülmektedir.

Kontratlar, Solidity 0.8.17 sürümü ile yazılmıştır ve MIT lisansı ile lisanslanmıştır.

Örnek Akıllı Sözleşmeyi Satır Satır Yorumlayalım

  1. Satır: “pragma solidity ^0.8.17;” Bu satır, kullanılan Solidity sürümünün 0.8.17 veya daha yüksek bir sürüm olduğunu belirtir.
  2. Satır: “contract Mapping {” Bu satır, “Mapping” adlı yeni bir sözleşmenin başlangıcını belirtir.
  3. Satır: “mapping(address => uint) public myMap;” Bu satır, “myMap” adında bir mapping yapısı oluşturur. Bu yapı, adres tipinde anahtarlar ve uint tipinde değerler içerir. “public” anahtar kelimesi, bu değişkenin herkes tarafından erişilebilir olmasını sağlar.
  4. Satır: “function get(address _addr) public view returns (uint) {” Bu satır, “get” adlı bir fonksiyon tanımlar. Bu fonksiyon, bir adres verildiğinde, o adres için kayıtlı olan değeri döndürür. Bu fonksiyon “public view” olarak tanımlanmıştır, yani herkes tarafından sadece okunabilir ve sadece veri döndürür, yapıcı bir işlem gerçekleştirmez. “address _addr” parametresi, fonksiyona verilen adresi alır ve “uint” tipinde bir değer döndürür.
  1. Satır: “return myMap[_addr];” Bu satır, fonksiyonda verilen adres için kayıtlı olan değeri döndürür.
  2. Satır: “function set(address _addr, uint _i) public {” Bu satır, “set” adlı bir fonksiyon tanımlar. Bu fonksiyon, verilen adres için verilen tamsayı değerini kaydeder. “public” anahtar kelimesi ile fonksiyon herkes tarafından erişilebilir olarak tanımlanmıştır. “address _addr” ve “uint _i” parametreleri, fonksiyona verilen adresi ve değeri alır.
  3. Satır: “myMap[_addr] = _i;” Bu satır, verilen adres için verilen değeri kaydeder.
  4. Satır: “functionremove(address _addr) public {” Bu satır, “remove” adlı bir fonksiyon tanımlar. Bu fonksiyon, verilen adres için kayıtlı olan değeri sıfırlar. “public” anahtar kelimesi ile fonksiyon herkes tarafından erişilebilir olarak tanımlanmıştır. “address _addr” parametresi, fonksiyona verilen adresi alır.
  5. Satır: “delete myMap[_addr];” Bu satır, verilen adres için kayıtlı olan değeri sıfırlar.
  6. Satır: “contract NestedMapping {” Bu satır, “NestedMapping” adlı yeni bir sözleşmenin başlangıcını belirtir.
  7. Satır: “mapping(address => mapping(uint => bool)) public nested;” Bu satır, “nested” adında bir nested mapping yapısı oluşturur. Bu yapı, adres tipinde anahtarlar, uint tipinde anahtarlar ve bool tipinde değerler içerir. “public” anahtar kelimesi, bu değişkenin herkes tarafından erişilebilir olmasını sağlar.
  8. Satır: “function get(address _addr1, uint _i) public view returns (bool) {” Bu satır, “get” adlı bir fonksiyon tanımlar. Bu fonksiyon, verilen adres ve tamsayı için kayıtlı olan bool değerini döndürür. “public view” olarak tanımlanmıştır, yani herkes tarafından sadece okunabilir ve sadece veri döndürür, yapıcı bir işlem gerçekleştirmez. “address _addr1” ve “uint _i” parametreleri, fonksiyona verilen adresi ve tamsayıyı alır ve “bool” tipinde bir değer döndürür.
  9. Satır: “return nested[_addr1][_i];” Bu satır, fonksiyonda verilen adres ve tamsayı için kayıtlı olan bool değerini döndürür.
  10. Satır: “function set(address _addr1, uint _i, bool _boo) public {” Bu satır, “set” adlı bir fonksiyon tanımlar. Bu fonksiyon, verilen adres ve tamsayı için verilen bool değerini kaydeder. “public” anahtar kelimesi ile fonksiyon herkes tarafından erişilebilir olarak tanımlanmıştır. “address _addr1”, “uint _i” ve “bool _boo” parametreleri, fonksiyona verilen adresi, tamsayıyı ve bool değerini alır.
  11. Satır: “nested[_addr1][_i] = _boo;” Bu satır, verilen adres ve tamsayı için verilen bool değerini kaydeder.
  12. Satır: “function remove(address _addr1, uint _i) public {” Bu satır, “remove” adlı bir fonksiyon tanımlar. Bu fonksiyon, verilen adres ve tamsayı için kayıtlı olan bool değerini sıfırlar. “public” anahtar kelimesi ile fonksiyon herkes tarafından erişilebilir olarak tanımlanmıştır. “address _addr1” ve “uint _i” parametreleri, fonksiyona verilen adresi ve tamsayıyı alır.
  13. Satır: “delete nested[_addr1][_i];” Bu satır, verilen adres ve tamsayı için kayıtlı olan bool değerini sıfırlar.
  14. Satır: “}” Bu satır, “NestedMapping” sözleşmesinin sonunu belirtir.
  15. Satır: “}” Bu satır, “Mapping” sözleşmesinin sonunu belirtir.

Bu kod parçası, Solidity dili için mapping yapısının nasıl kullanılabileceğini ve nested mapping yapısının nasıl oluşturulabileceğini göstermektedir. “get”, “set”, “remove” fonksiyonları ile anahtar-değer ilişkisi olan veri yapısını okuma, güncelleme ve sıfırlama işlemleri yapılabilmektedir.

Sonuç Bağlamı : Mapping

Sonuç olarak, Solidity dili için mapping yapısı, anahtar-değer ilişkisi olan veri yapılarının depolanmasına ve yönetilmesine olanak tanır. Bu yapı, herhangi bir anahtar türünü ve herhangi bir değer türünü kullanabilir ve bir kontrat içinde birden fazla mapping yapısı oluşturulabilir. Ayrıca, nested mapping yapısı da oluşturulabilir, bu sayede daha karmaşık veri yapıları depolanabilir ve yönetilebilir. Örnekte verilen kod parçası, mapping ve nested mapping yapılarının nasıl oluşturulabileceğini ve nasıl kullanılabileceğini göstermektedir. Bu yapılar, veri okuma, güncelleme ve sıfırlama işlemleri için kullanılabilir ve güvenlik, işlev ve verimlilik açılarından önemlidir.

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