1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 016 : Veri Depolama

🧵 #100GündeSolidity 016 : Veri Depolama
Veri Depolama
0

Veri Depolama: Storage, Memory ve Calldata

#100DaysOfSolidity serisinin bugünkü bülteninde “Data Locations – Storage, Memory and Calldata” konuşacağız. Hangi noktalara değineceğimize bir bakalım.

Storage Nedir ve Nasıl Kullanılır?

Storage, smart contractlar tarafından kullanılan veri depolama alanıdır. Veriler ölümsüzdür ve kontrat çalıştırılmadığı sürece silinemez. Storage kullanımı için “storage” keyword’ü kullanılır. Örneğin, bir değişkeni storage olarak tanımlamak için “storage uint x;” kodunu kullanabilirsiniz. Ayrıca, struct veya array gibi veri yapılarını da storage olarak tanımlayabilirsiniz. Storage kullanımındaki maliyetler, bellek tüketimine bağlı olarak değişebilir, ancak genellikle daha yüksektir çünkü veriler ölümsüzdür.

Memory Nedir ve Nasıl Kullanılır?

Memory, smart contractlar tarafından geçici olarak kullanılan veri depolama alanıdır. Veriler çağrı sonrası silinir. Memory kullanımı için “memory” keyword’ü kullanılır. Örneğin, bir değişkeni memory olarak tanımlamak için “memory uint x;” kodunu kullanabilirsiniz. Ayrıca, struct veya array gibi veri yapılarını da memory olarak tanımlayabilirsiniz. Memory kullanımındaki maliyetler, bellek tüketimine bağlı olarak değişebilir, ancak genellikle daha düşüktür çünkü veriler geçici olduğu için daha az bellek tüketir. Memory, işlemler arasında veri transferi yapmak için kullanılır.

Calldata Nedir ve Nasıl Kullanılır?

Calldata, işlemler arasında gönderilen verileri içerir ve smart contractlar tarafından okunabilir ancak değiştirilemez. Calldata, bir smart contract’ın başka bir contract’ı çağırması sırasında gönderilen verileri içerir. Calldata, “msg.data” ile erişilebilir. Calldata, gönderilen verilerin içeriğini okumak için kullanılabilir, ancak değiştirilemez çünkü sadece okuma amaçlıdır. Calldata kullanımı, işlemler arasında veri transferi yaparken önemlidir ve msg.sender ve msg.value gibi özellikleri içerir.

Storage ve Memory Arasındaki Farklar

Storage ve memory arasındaki en önemli fark, verilerin ömrüdür. Storage’da saklanan veriler ölümsüzdür ve smart contract çalıştırılmadığı sürece silinemez. Memory’de saklanan veriler ise çağrı sonrası silinir.

Storage’da veriler daha uzun ömürlüdür ve daha büyük bellek tüketir. Memory’de veriler daha geçici olduğu için daha az bellek tüketir.

Storage kullanımındaki maliyetler, bellek tüketimine bağlı olarak değişebilir, ancak genellikle daha yüksektir çünkü veriler ölümsüzdür. Memory kullanımındaki maliyetler, bellek tüketimine bağlı olarak değişebilir, ancak genellikle daha düşüktür çünkü veriler geçici olduğu için daha az bellek tüketir.

Storage, smart contractlar arasında veri paylaşımı yapmak için kullanılabilir. Memory, işlemler arasında veri transferi yapmak için kullanılır.

Storage, Memory ve Calldata Kullanım Örnekleri

Storage, Memory ve Calldata kullanım örnekleri aşağıdaki gibi olabilir:

  1. Storage: Bir smart contract içerisinde kullanıcıların bakiyelerini saklamak için kullanılabilir. Örneğin, “storage mapping(address => uint) balances;” kodu ile kullanıcıların bakiyelerini saklamak mümkündür.
  2. Memory: Bir smart contract içerisinde işlemler sırasında geçici verileri saklamak için kullanılabilir. Örneğin, “function transfer(address _to, uint _value) public { memory uint fee = _value * 0.01; _value -= fee; …. }” kodu ile işlemler sırasında geçici veri olarak ücret hesaplamak mümkündür.
  3. Calldata: Bir smart contract içerisinde başka bir contract’ı çağırırken gönderilen verileri okumak için kullanılabilir. Örneğin, “function execute(address _to, bytes calldata _data) public { uint value = msg.value; …. }” kodu ile işlem sırasında gönderilen verileri okumak mümkündür.

Bu örnekler sadece yön göstermelidir, uygulamanız için kullanacağınız kodların içeriği işlemlerinizin ve özelliklerinize bağlı olarak farklılık gösterebilir.

Storage ve Memory Kullanımındaki Maliyetler

Storage ve Memory kullanımındaki maliyetler, bellek tüketimine bağlı olarak değişebilir. Storage kullanımındaki maliyetler genellikle daha yüksektir çünkü veriler ölümsüzdür. Memory kullanımındaki maliyetler ise genellikle daha düşüktür çünkü veriler geçici olduğu için daha az bellek tüketir.

Storage ve Memory bellek tüketimi, veri yapıları ve veri tiplerine göre değişebilir. Örneğin, bir storage mapping tüketimi, içerisinde sakladığı veri sayısına ve veri tipine göre değişebilir. Aynı şekilde, bir memory array tüketimi, içerisinde sakladığı veri sayısına ve veri tipine göre değişebilir.

Storage ve Memory kullanımındaki maliyetleri azaltmak için, veri yapılarını ve veri tiplerini dikkatli seçmeli, gereksiz veri saklamamalı ve verileri sık sık silmelisiniz. Ayrıca, smart contractlar arasında gereksiz veri transferi yapmamak için, gerektiğinde sadece gerekli verileri transfer etmelisiniz.

Storage, Memory ve Calldata Kullanımına Dair En iyi Örnekler

Storage, Memory ve Calldata kullanımına dair en iyi örnekler şöyle olabilir:

  1. Storage: Ölümsüz verileri saklamak için kullanılmalıdır. Örneğin, kullanıcıların bakiyelerini, smart contract’ta gerçekleştirilen işlemlerin kayıtlarını veya token stoklarını saklamak için storage kullanmalısınız.
  2. Memory: Geçici verileri saklamak için kullanılmalıdır. Örneğin, işlemler sırasında hesaplanan geçici verileri, çağrılacak fonksiyonların parametrelerini veya işlem sonucunda dönecek değerleri saklamak için memory kullanmalısınız.
  3. Calldata: Sadece okuma amaçlı verileri saklamak için kullanılmalıdır. Örneğin, bir smart contract’ta başka bir contract’ı çağırırken gönderilen verileri okumak için calldata kullanmalısınız.

Bu örnekler yalnızca yön göstermelidir, uygulamanız için kullanacağınız kodların içeriği işlemlerinizin ve özelliklerinize bağlı olarak farklılık gösterebilir. Ayrıca, her seferinde en iyi çözüm olmayabilir, fakat yine de maliyetleri azaltmak için dikkatli seçimler yapmak ve verileri güvenli saklamak önemlidir.

Storage ve Memory İçerisinde Veri Saklama Yöntemleri

Storage ve Memory içerisinde veri saklama yöntemleri arasında aşağıdaki yöntemler bulunabilir:

  1. Mapping: Bir anahtar-değer çifti olarak verileri saklar. Örneğin, “mapping(address => uint) balances;” kodu ile kullanıcıların bakiyelerini saklamak mümkündür.
  2. Struct: Birden fazla değişkeni bir arada saklar. Örneğin, “struct user { address addr; uint balance; }” kodu ile kullanıcıların adres ve bakiyelerini saklamak mümkündür.
  3. Array: Birden fazla değişkeni dizi şeklinde saklar. Örneğin, “address[] users;” kodu ile kullanıcıların adreslerini saklamak mümkündür.
  4. Enum: sınırlı sayıda sabit değerleri saklamak için kullanılabilir. Örneğin “enum color {Red, Green, Blue} color myColor; ” kodu ile renk değerlerini saklamak mümkündür.

Storage ve Memory İçerisinde Veri Tipleri ve Bellek Tüketimi

Storage ve Memory içerisinde kullanabileceğiniz veri tipleri, Solidity dilinde mevcut olan veri tipleridir. Örneğin, uint, address, bytes gibi veri tipleri storage ve memory içerisinde kullanılabilir.

Bellek tüketimi, kullanılan veri tipine, veri yapısına ve saklanan veri miktarına göre değişebilir. Örneğin, bir storage mapping tüketimi, içerisinde sakladığı veri sayısına ve veri tipine göre değişebilir. Aynı şekilde, bir memory array tüketimi, içerisinde sakladığı veri sayısına ve veri tipine göre değişebilir.

Örnek olarak, bir storage uint veri tipi, 32 bitlik bir bellek alanı tüketirken, bir storage address veri tipi, 160 bitlik bir bellek alanı tüketir.

Ayrıca, veri tiplerinin boyutlarının farklı olması nedeniyle, örneğin bir storage bytes32 veri tipi 32 byte iken, bir storage bytes veri tipi dynamic olarak bellek tüketir.

Bu yüzden, veri tiplerini ve veri yapılarını dikkatli seçmeli ve gereksiz veri saklamamalısınız. Bu sayede, bellek tüketimini azaltabilir ve daha etkili smart contractlar yazabilirsiniz.

Smart Contract’lar Arasında Storage veya Memory Verilerinin Paylaşılması

Smart contractlar arasında storage veya memory verilerinin paylaşılması, smart contractlar arasında veri transferi yapmak için kullanılabilir. Bu veri transferi, contractlar arasında fonksiyon çağrıları ile gerçekleştirilir.

Storage verileri, smart contractlar arasında paylaşılabilir. Örneğin, bir smart contract, başka bir smart contract’ta saklanan verileri okuyabilir veya değiştirebilir. Ancak, bu işlemlerin gerçekleşebilmesi için contractlar arasında yetki kontrolü yapılması gerekir.

Memory verileri ise, smart contractlar arasında geçici olarak paylaşılabilir. Örneğin, bir smart contract, başka bir smart contract’a parametre olarak geçici veriler gönderebilir. Ancak, bu veriler çağrı sonrası silinir.

Ayrıca, smart contractlar arasında veri paylaşımı için, verilerin izin verilen contractlar tarafından okunabildiğinden ve değiştirilemeyeceğinden emin olmalısınız. Bu amaçla, smart contractlar arasında yetki kontrolü yapılması ve verilerin güvenli şekilde saklanması gerekir.

Storage ve Memory İçerisinde Veri Güvenliği

Storage ve Memory içerisinde veri güvenliği, smart contractların güvenliği açısından önemlidir. Özellikle storage içerisinde saklanan veriler ölümsüz olduğu için, bu verilerin güvenliği için özel önlemler alınması gerekir.

Storage ve Memory içerisinde veri güvenliği için aşağıdaki önlemler alınabilir:

  • Yetki kontrolü: Verilerin sadece yetkili contractlar tarafından okunabildiğinden ve değiştirilemeyeceğinden emin olmak için yetki kontrolü yapılması gerekir.
  • Güvenli veri yapıları: Verilerin güvenli bir şekilde saklanması için güvenli veri yapıları kullanılması gerekir. Örneğin, private ve internal gibi anahtar kelimeler ile verilerin gizliliği sağlanabilir.
  • Veri şifreleme: Verilerin güvenliği için şifreleme kullanılması gerekir. Örneğin, private verilerin şifrelenmesi ve sadece yetkili contractlar tarafından şifresi çözülerek okunması gerekir.
  • İzinlerin yönetimi: Smart contractlar arasında veri paylaşımının yapılması için izinlerin yönetimi yapılması gerekir. Bu sayede, contractlar arasında veri paylaşımı sadece izin verilen contractlar tarafından yapılabilir.
  • Güncelleme ve silme işlemleri: Storage içerisinde saklanan verilerin güncelleme ve silme işlemlerinin yetkili kullanıcılar tarafından yapılması sağlanmalıdır.

Bu önlemler, storage ve memory içerisinde saklanan verilerin güvenliğini arttırır ve smart contractların güvenliğini sağlar. Ancak, unutmayın ki, hiçbir güvenlik önlemi %100 güvenli değildir. Bu nedenle, sürekli olarak güncellenmeli ve geliştirilmelidir.

Storage ve Memory İçerisinde Veri Yedekleme ve Geri Yükleme Yöntemleri

Storage ve Memory içerisinde veri yedekleme ve geri yükleme yöntemleri, smart contractların güvenliği açısından önemlidir. Özellikle storage içerisinde saklanan veriler ölümsüz olduğu için, bu verilerin yedeklenmesi ve geri yüklenmesi için özel önlemler alınması gerekir.

Storage ve Memory içerisinde veri yedekleme ve geri yükleme için aşağıdaki yöntemler kullanılabilir:

  1. Manuel yedekleme: Smart contractların storage ve memory içerisindeki verileri manuel olarak yedeklemek ve geri yüklemek için kullanılabilir. Bu yöntem, storage ve memory içerisindeki verileri elle saklamak ve geri yüklemek için kullanılabilir.
  2. Otomatik yedekleme: Smart contractların storage ve memory içerisindeki verileri otomatik olarak yedeklemek ve geri yüklemek için kullanılabilir. Bu yöntem, smart contractların storage ve memory içerisindeki verileri belirli aralıklarla otomatik olarak yedeklemek ve geri yüklemek için kullanılabilir.
  3. Çoklu yedekleme: Smart contractların storage ve memory içerisindeki verileri birden fazla yerde yedeklemek ve geri yüklemek için kullanılabilir. Bu yöntem, smart contractların storage ve memory içerisindeki verileri birden fazla yerde saklamak ve geri yüklemek için kullanılabilir.

Örnek Akıllı Sözleşme İNCELEME

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

contract DataLocations {
    uint[] public arr;
    mapping(uint => address) map;
    struct MyStruct {
        uint foo;
    }
    mapping(uint => MyStruct) myStructs;

    function f() public {
        // call _f with state variables
        _f(arr, map, myStructs[1]);

        // get a struct from a mapping
        MyStruct storage myStruct = myStructs[1];
        // create a struct in memory
        MyStruct memory myMemStruct = MyStruct(0);
    }

    function _f(
        uint[] storage _arr,
        mapping(uint => address) storage _map,
        MyStruct storage _myStruct
    ) internal {
        // do something with storage variables
    }

    // You can return memory variables
    function g(uint[] memory _arr) public returns (uint[] memory) {
        // do something with memory array
    }

    function h(uint[] calldata _arr) external {
        // do something with calldata array
    }
}

Bu smart contract, “Data Locations – Storage, Memory and Calldata” konusunu ele alır. Bu sözleşmede, storage, memory ve calldata veri yerlerinde veri saklama ve kullanma örnekleri verilmiştir.

  • Storage verileri: Sözleşmenin içinde, “arr” adlı bir dizi ve “map” ve “myStructs” adlı iki farklı mapping veri yapıları storage içerisinde saklanmıştır.
  • Memory verileri: Sözleşmenin içinde, “_f” fonksiyonu içerisinde oluşturulan “myMemStruct” adlı bir yapı memory içerisinde saklanmıştır.
  • Calldata verileri: Sözleşmenin içinde, “h” fonksiyonu içerisinde kullanılan “calldata _arr” adlı bir dizi calldata içerisinde saklanmıştır.

Fonksiyonların içerisinde, storage, memory ve calldata veri yerlerinde veri saklama ve kullanma örnekleri verilmiştir. Örneğin, “f” fonksiyonu içerisinde storage verilerin kullanımı, “g” fonksiyonu içerisinde memory verilerin geri döndürülmesi ve “h” fonksiyonu içerisinde calldata verilerin kullanımı gösterilmiştir.

Bu sözleşme, storage, memory ve calldata veri yerlerinde veri saklama ve kullanma için kullanabileceğiniz örnekler sunmaktadır. Ancak, gerçek uygulamalar için daha uygun olabilecek farklı yollar ve yöntemler olabilir.

Sonuç Bağlamı

Bu makalede, “Data Locations – Storage, Memory and Calldata” konusunu ele aldık. Smart contractlar içerisinde verilerin nasıl saklanması ve kullanılması gerektiği ve bu verilerin nasıl korunması gerektiği konularını inceledik. Solidity dilinde, verilerin saklanması için storage, memory ve calldata gibi farklı veri yerleri kullanılabilir.

Storage verileri, smart contractlar içerisinde ölümsüz olarak saklanır ve herhangi bir işlem yapıldığında değişmez. Memory verileri ise, smart contractlar içerisinde sadece o işlem süresince geçerlidir ve işlem tamamlandıktan sonra silinir. Calldata verileri ise, smart contractlar arasında gönderilen ve sadece okunabilir olarak saklanır.

Storage verileri için, güvenli veri yapıları kullanılması, yetki kontrolü yapılması ve veri şifrelemesi gibi önlemler alınması gerekir. Ayrıca, storage verileri için yedekleme ve geri yükleme yöntemleri de önemlidir.

Bu makalede, storage, memory ve calldata veri yerlerinde veri saklama ve kullanma yöntemleri ve örnekleri incelendi. Ayrıca, storage ve memory içerisinde veri güvenliği, veri yedekleme ve geri yükleme yöntemleri, smart contractlar arasında veri paylaşımı gibi konular da ele alındı. Bu makale, smart contractlar içerisinde verilerin nasıl saklanması ve kullanılması gerektiğini ve bu verilerin nasıl korunması gerektiğini anlamanıza yardımcı olacaktır. Smart contractların gerçekleştirilmesinde verilerin doğru ve güvenli bir şekilde saklanması ve kullanılması çok önemlidir. Bu makale, bu konuda size bilgi ve fikirler sunmaya çalıştı.

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