Sui Nasıl Çalışır?
Objeler
Sui’ deki en temel depolama birimi objelerdir. Geleneksel blokzincirlerdeki anahtar-değer ilişkisine dayanan depolama sisteminin aksine Sui’ de herşey objelerden oluşmaktadır. Akıllı sözleşmelerin her biri Move Paketi adı verilen objelerden oluşurken bu akıllı sözleşmeler Move objelerini düzenler.
Move Paketi: Birkaç Move modülünden oluşur. Her modülün o paket içerisinde kendine has bir adı vardır. Bu modül adı ve paket id’ sinin kombinasyonu her modülü benzersiz kılar.
Move Objesi: Move modülleri tarafından yönetilen kategorilendirilmiş (typed) veridir. Her objenin değeri içinde ilkel tipleri, başka objeleri veya obje olmayan yapıları bulundurabilen yapılardır. Her obje varsayılan olarak yaratılış zamanında değiştirilebilir haldedir ve sahipliği bir hesaba aittir. Ancak yaratılıştan sonra dondurularak sonsuza kadar değiştirilemez kılınabilir veya sahiplik paylaşılarak diğer adresler tarafından erişilebilir hale getirilebilir.
Obje Metadatası: Tüm Sui objeleri metadata olarak şunları içermektedir:
- 20 baytlık global eşsiz bir id. Bir obje id’si o objeyi yaratan işlem ve o işlem boyunca kaç obje yaratıldığını tutan bir sayacın “digest” i alınarak türetilir.
- Versiyonu temsil eden 8 baytlık işaretsiz bir tamsayı. Versiyon, bu objeyi çıktı olarak dahil eden tüm işlemlerin sayısını temsil eder. Bu da yeni olarak üretilmiş bir objenin otomatik olarak versiyonunun 1 olduğu anlamına gelir.
- Objeyi çıktı olarak en son dahil eden işlemin 32 baytlık bir digest’i.
- Objenin sahiplik ve erişim haklarını belirten 21 baytlık bir sahiplik alanı.
Ortak metadataya ek olarak objeler kategoriye özel, değişken boyutlu içeriklere sahip olabilir. Bir veri değeri için bu ek metadata Move tipindeki objeyi ve bunun Binary Canonical Serialization (BCS)- encoded payload’ unu içerir.
Obje sahipliği
Her obje, onun sahipliğini ve erişim haklarını belirleyen bir sahiplik alanına sahiptir. Bu sahiplik bu objenin işlemler içinde nasıl kullanılabileceğini dikte eder. Sui’ de 4 çeşit sahiplik bulunur.
1- Hesap tarafından sahiplenilen:
Bu move objeleri için en yaygın durumdur. Bir move objesi yaratılıştan itibaren doğal olarak bir hesaba aktarılabilir. Transferden sonra bu obje bir hesap tarafından sahiplenilecek. Bir hesaba ait olan objeler sadece o hesab tarafından imzalanan işlemlerce kullanılabilir. Sahiplenilmiş bir obje bir move fonksiyonuna 3 farklı şekilde parametre olarak verilebilir.
- sadece okuma referansı ile
- değiştirilebilir referans ile
- doğrudan değer olarak
Önemli bir nokta ise obje sadece okuma referansı ile verilmiş olsa bile sadece o objeye sahip hesaplar tarafından çağrılabilir. Bu da bir move objesinin kullanma izninin kullanılma amacına değil de sahiplik bilgisine bağlı olduğu anlamına gelir.
2- Başka bir obje tarafından sahiplenilen:
Bir obje başka bir obje tarafından sahiplenilebilir. Bunu sahipliği objeyi başka bir objenin içine paketlemekten ayırmak önemli. Bir obje, eğer tanımı gereği yapısı içinde bir alan olarak başka bir objeyi barındırabiliyorsa o objeyi sarabilir.
Örneğin yukarıdaki örnekte A adında içinde B adında başka bir obje barındıran bir obje tipi tanımlanıyor. Bu durumda B objemizin A objesi içine sarılı olduğunu söyleyebilriz. Obje paketleme yöntemiyle paketlenmiş/sarılmış obje (bu durumda b) Sui depolama alanında en üst seviyede depolanan bir obje sayılmaz ve bu yüzden obje id si ile erişilemez. Bunun yerine b objemiz sadece a objesinin baytkoduna seriliazed olarak gömülü bulunan a objesinin bir parçasıdır. Obje paketlemeyi bir objeyi silmek gibi düşünebilirsiniz tek farkı bu objenin içeriği hala blockchain üzerinde bir yerde bulunmaktadır.Şimdi başka bir obje tarafından sahiplenilen objelere geri dönersek bu objeler paketlenmiş objeler değillerdir. Bu çocuk objenin hala kendi başına bir objenin tüm özelliklerini taşıdığı anlamına gelir. Sahiplik ilişkisi
3- Değiştirilemez:
Bu sahiplik türündeki objeler hiç kimse tarafından değiştirilemez. Bu özelliğinden dolayı bu tarz objelerin doğrudan bir sahibi bulunmamaktadır. Herhangi bir kişi bu objeleri Move çağırılarında kullanabilir. Tüm move paketleri değiştirilemez objelerdir, yayınlandıkları andan itibaren değiştirilemezler. Bir move objesi freeze_object API’si tarafından değiştirilemez hale getirilebilir. Değiştirilemez objeler Move çağırılarına sadece okuma referansı ile verilebilir.
4- Paylaşılan:
Bu objeler paylaşılabilir ki bu da herkes tarafından kullanılabilir ve değiştirilebilir oldukları anlamına gelir. Bu objelerin düzgün desteklenilebilmesi için çalışmalar hala yürütülmektedir. Paylaşılan objeler hakkında daha detaylı bir açıklama yakında internet üzerinden paylaşılacaktır. Kısaca bahsetmek gerekirse, başka herhangi bir değiştirilebilir ama paylaşılmayan obje için hiçbir iki işlem aynı anda aynı objeyi değiştiremez. Bunun sebebi ise Sui ‘nin consensus’ a ulaşmak veya sıralama için fazladan işlem yapmak istemediği için her bir işemi kullandığı objenin spesifik olarak en son versiyonuna pinlemesidir. Bununla birlikte paylaşılan objelerin çoklu işlemler tarafından aynı andan değiştirilebilmesi için işlemleri sıralayacak bir sıralayıcıya ihtiyaç duymaktayız. Bundan dolayı paylaşılan bir objeyi kullanmak gecikme, gaz ücreti ve verim açısından daha pahalı olacaktır.
Objelere Erişmek
Tüm içeriklerini ve metadatayı belirtmeden objelere erişmenin birkaç farklı yolu bulunmaktadır. Bunlar
1- ID
Objejnin global olarak eşsiz olan id si ile erişilebilir. Id objeler için stabil ve zaman içinde değişmeyen benzersiz bir ayraç olmasının yanında bir objenin anlık state’ini sorgulamakta ve bu objenin aktarım tarihini incelemekte oldukça faydalıdır.
2- Versiyon ve ID çifti
Bu objenin geçmiş bir zamandaki state’ine erişmek ve bir objenin görünümünün şu an ne kadar yeni olduğunu saptamak için mükemmel bir yöntemdir.
3- Obje Referansı (ID, versiyon ve obje digesti üçlüsü)
Obje digesti o objenin içeriği ve metadatasının hash’ idir. Obje referansı o objenin tarihindeki belirli bir noktadaki görüntüsünü verir. İşlemlere parametre olarak objelerin verilmesi için objelerin referansları kullanılır ki işlemi gönderen kişi ve validatör objenin içeriği ve metadatası üzerinde hemfikir olabilsinler.
İşlem Objesi DAG: Objeler ve İşlemleri İlişkilendirmek
İşlemler (ve dolayısıyla sertifikalar) objeleri girdi olarak alır, bu girdileri okur / yazar / değiştirir ve çıktı olarak değiştirlimiş veya yeni oluşturulmuş objeler üretir. Ve yukarıda bahsedildiği gibi, her obje onu bir çıktı olarak üreten son işlemin hash’ini bilir. Bu nedenle, objeler ve işlemler arasındaki ilişkiyi temsil etmenin doğal bir yolu, yönlendirilmiş bir asiklik grafiktir (DAG). DAG larda:
1- Validatörler işlemlerdir.
2- Yönlendirilmiş kenarlar, işlem çıktı objelerini işlem giriş objelerine bağlar ve nesne referanslarıyla etiketlenir.
Bu grafiği oluşturmak için, işlenen her işlem için bir validatör ekleriz ve üretilen bir nesne O (yani oluşturulmuş veya mutasyona uğramış O) ve işlem B obje O’yu bir girdi olarak alırsa, işlem A’dan işlem B’ye obje referansı O ile etiketlenmiş bir kenar çizeriz.
Bu dag’ın kökü, girdi almayan ve sistemin başlangıç durumunda var olan objeleri üreten bir oluşum işlemidir. DAG, sisteme gönderilmiş herhangi bir işlem tarafından henüz tüketilmeyen değişken işlem çıktılarını belirleyerek ve bu çıktıları (ve isteğe bağlı olarak değişmez işlem çıktılarını) girdi olarak alan yeni bir işlem göndererek genişletilebilir.
Bir işlem tarafından girdi olarak alınabilecek nesneler kümesi canlı nesnelerdir ve Sui tarafından tutulan state bu nesnelerin toplamından oluşur. Belirli bir Sui adresi A’nın canlı nesneleri, sistemdeki tüm değişmez nesnelerle birlikte A’ya ait tüm nesnelerdir.
Bu DAG, sistemdeki tüm sisteme girmiş işlemleri içerdiğinde, sistemin durumu ve geçmişinin eksiksiz (ve kritografik olarak denetlenebilir) bir görünümünü oluşturur. Ek olarak, yukarıdaki şemayı, işlemlerin veya objelerin bir alt kümesine (örneğin, tek bir adrese ait nesneler) ait geçmişin bir DAG’ini oluşturmak için kullanabiliriz.
Kaynak : https://medium.com/@suiturkiye