STELLAR PLAFORMU VE BLOKZİNCİRİ

doğa özcan
9 min readJun 2, 2021

--

Bitcoin blokzinciri, ethereum blokzincirinden sonra şimdi de üçüncü blokzincir yapımıza giriş yapalım. Stellar, ethereum gibi blokzincir yapısının esnekliğini kullanarak bizlere platform sağlıyor. Yalnız stellar platformunun odaklandığı ana hedef finans sistemi en çok da bankacılık sisteminin blokzincire stellar üzerinden entegre olmasını bekliyorlar, açıkçası ben de buna ihtimal veriyorum, çünkü Ibm ve stellar çok güçlü bir ortaklık yaptılar hatta beraber bir stablecoin (volatil olmayan basılan para, altın,gümüş, petrol gibi rezerv varlıklara dayanan) çalışması yapıyorlar ayrıca Ortadoğu üzerinden özellikle BAE üzerinde ibm ve stellar beraber çalışmalar yapıyorlar.

Stellar üzerinde ethereum platformunda olduğu gibi token yaratabiliyorsunuz ve ağ üzerindeki node’ yapısı ile finansal işlemlerinizi gerçekleştirebiliyorsunuz, oldukça hızlı bir ödeme sistemi altyapısı sunuluyor ve iletişim masrafı da oldukça düşük zaten bu özelliklerinden dolayı kurumsal adaptasyona en yakın blokzincir ödeme sistemi görünüyor. Akıllı sözleşme konusuna gelince, evet bir sözleşme yapısı var ancak bu bizim alışageldiğimizi programatik Turing makinalarından değil. Turing makinasının çalıştığını google üzerinden rahatlıkla araştırabilirsiniz ama buradaki en önemli konu ethereum üzerinde solidity dilini kullanırken sonsuz döngülerin transaction’ın gas değerinin bitmesi ile döngüden çıkma üzerinde kurulu yani Turing complete sayılıyor. Ancak stellar üzerinde bu maalesef böyle değil. Stellar’ın kendi para birimi xlm (lumen) aynen ethereum gibi ancak dediğimiz gibi nasıl erc20 erc721 tokenları yaratabiliyorsak stellar üzerinde de kendi token yapımızı oluşturabiliyoruz.

Ben stellar uygulama geliştirirken stellar sdk yapısını kullandım. Size kendi github repom üzerinden bölüm bölüm kodlarını paylaşacağım kendi projemi gösteriyor olacağım, anlayışınıza sığınarak ticari bir proje olduğu için tüm kod detaylarını paylaşmam mümkün olmayacaktır. Proje bir ödeme sistemi altyapısı sunuyor, yaratılan bir token ile çeşitli işlemler yapabiliyorsunuz örneğin para yatırma, para çekme. Bu işlemlerin sonuçlarını stellar sdk nın sağlamış olduğu gerçek zamanlı event mekanizması ile takip edebiliyor ve logluyoruz, ayrıca sonrasında kullanmak üzere çeşitli dağıtık kuyruk ve mesaj yapılarında tutuyoruz. Ayrıca, mobil uygulama ile haberleşmenin sağlıklı olması için pub/sub yapısının kurulmasını sağlıyoruz, bu yapı ile çok hızlı yapılan para transferi ile bildirimlerimizi anlık yapabiliyoruz.

Öncelikler stellar üzerinde geliştrime yapamaya başlamak için platformu tanımak gerekiyor. İlk başlanacak yer geliştirme ortamını tanımak, aşağıdaki link başlangıç için uygundur.

https://www.stellar.org/developers/ kaynakça 18

adres içerisinde kodlama için sdk çeşitleri tanıtılmış, ihtiyacınıza ve bilginize göre bu sdk’ları kullanabilirsiniz, ben uygulamalarımı go ve javascript ile geliştiriyorum. Bu projemde node.js ile restful backend api yapısını anlatıyor olacağım.

Stellar sdk çeşitleri

Javascript sdk linkine tıklayınca karşınıza bazı bölümler çıkacaktır, bu bölümlerde

transactional işlemler nasıl yapılır.

mantığı nedir ve nasıl kullanabilirsiniz şeklinde uygun yönlendirmeler bulunmaktadır.

Ancak tabiki gerçek dünya uygulamalarını kodlarken uygun mimari ve kodlama için buradaki repo yol gösterici ancak pek yeterli değil pek tabi başlangıç için uygundur, size ek olarak stellar reddit üzerindeki bazı sayfaları okumanızı salık veririm.

Stellar aşağıdaki şekilde bir gruplamaya gitmiş, şimdi bunlara biraz bakalım;

stellar üzerinde hesap yaratılması

asset (değer, token) yaratılması, asset native olursa xlm olarak kullanıyoruz ancak non- native seçersek kendi token yapımızı, uygun supply değerleri ile yaratmak bize bırakılıyor.

ödeme yapabilmek, hem xlm hem de non-native token ile yol gösteriliyor.

public ve private anahtar oluşumları ve key-pair kavramı

işlemleri build etmek ve imzalamak.

event yapısının kurulması

mutlaka ve mutlaka kullanmayı bilmeniz gereken stellar api referans sayfası bulunmaktadır.

https://stellar.github.io/js-stellar-sdk/

Aşağıda gördüğünüz gibi, api içerisindek ihtiyacımız olacak sınıflar ve onlara ait metodlar bulunmakta ve kullanımına dair ipuçları verilmektedir.

Stellar api referansı

Stellar üzerinde ödeme sistemi uygulaması geliştirme ve kodları

Projemizin github üzerindeki görüntüsünü paylaşmakla başlayacağım. Sonrasında projeyi tanıtacağım ve kod parçalarına değinip inceleyip, postman üzerinden projeyi çalıştırıp sonuçları göreceğiz. Projemiz herzamanki gibi dockerize şekilde çalışacak. Ayrıca dockerize çalışan bir redis veritabanına sahip olacak ve yarattığımız token için bu veritabanını saklama alanı olarak kullanacağız.

1) Öncelikle hesap yaratma kodlarını göreceğiz.

2) Sonrasında token yaratma kodlarını göreceğiz.

3) Hesapların yarattığımız token’ ı satın almalarını stellar xlm para birimi takası ile sağlayacağız.

4) Hesaplar ilgili token’ı elde ettikten sonra, bu token ile satın alma işlemlerin nasıl kullanacaklarını ve ödemeyi göstereceğiz,

5) Daha sonra event yapıları ile işlemlerin log yapılarına değineceğiz.

İlk olarak redis veritabanımızın github kodlarına bakalım sonrasında Amazon web servis üzerinde otomatik şekilde kurulmasına göz atalım.

Redis

1) Uygulamamız 6379 portundan dinleme yapacak gelen istekleri aynı şekilde container içine redis default portu olan 6379 ile gönderecektir. İmajımızı redis 4.0.5-alpine imajından oluşturulacaktır, bu light bir versiyon olduğu için tercih ettik.

2) Siz farklı bir versiyonu seçebilir ayrıca “xxxx:6379” şeklinde de çalıştırabilirsiniz.

Redis docker-compose dosyası

Aşağıdaki görüntüde ise aws üzerindeki ec2 sanal sunucularında bir redis container nasıl çalıştırılır onu gösteriyoruz.

Github üzerinden kodları nasıl çekilir.

İmaj nasıl oluşturulur ve sonrasında container nasıl çalışır hale getirilir onu görüyorsunuz.

Öncelikle sunucu üzerine Docker kurulumu yapıyoruz.

Durumu göre çoklu uyguluma kullanacaksanız Docker-compose ‘da kurmanız gerekebilir,

Örneğin bir önyüz uygulaması ve veritabanı uygulamanız var ve siz bunu tek bir şekilde yönetmek istiyorsunuz işte burada veritabanını dockerfile üzerinden ayağa kalkarken tüm sistem docker-compose ile yönetebilirsiniz.

Github linkimiz üzerinden klasörümüzü indirip klasör içine giriyoruz.

İlk önce docker-compose build ile imaj oluşturma aşamasını gerçekleştiriyoruz.

Sonrasında docker-compose up -d komutu ile detach modda container ‘ı ayağa kaldırıyoruz.

Redis bash script dosyası

Amazon web servis üzerinde user data bölümüne yukarıdaki bash script içerisindeki bilgileri kopyalayıp çalıştırıyoruz sonrasında amazon kendisi herşeyi hallediyor.

Aws-ec2 user data

Sonrasında elastik ip yaratıp sanal sunucumuza bu elastik ip adresimizi associate ediyoruz. Bunu yapma sebebimiz şudur. Sanal sunucular durduruldup yeniden çalıştırıldığında public ip adresleri değişiyor, biz containerlar üzerinden haberleşme yaptığımız için bu ip adreslerinin değişmesi demek container’ların tekrar bu yeni ip adresleri ile çalıştırılması demek, bu istediğimiz otomatize bir durum değildir, halbuki elastik ip adresleri asla değişmiyor ve tabiki ücretli.

Elastik ip yaratılması
Elastik ip sanal sunucu eşleştirmesi
İp adresi ve sanal sunucu portalı

1) Aşağıda, stellar projemizin readme dosyasını görmekteyiz. Şimdi buradaki direktiflere biraz göz gezdirelim.

2) Öncelikle projemiz hakkında bilgi paylaşılmış, proje test ve public olmak üzere iki farklı stellar ağı üzerinde kullanılabilinir.

3) Önyüz projemiz olmadığı için postman üzerinden gönderilecek isteklerin detayları verilmiş.

4) Uygulama 4000 portundan hizmet veriyor ve her bir resource tanımlaması şu şekilde yapılmış

a) AccountCreate

· hesap yaratma

· get isteği

b) TokenCreate

· token yaratma

· issuer ve receiver değerleri

· post isteği

c) GetAsset

· yaratılan token bilgisi

· publicKey

· post isteği

d) GetBalance

· yaratılan token veya native para birimi (xlm) için bakiye sorgulama

· publicKey

· post isteği

Stellar — readme bilgileri ve istekler — 1

e) DepositToken

· yaratılan token ‘ın isteyen hesaplara gönderilmesi

· tokenHolderSecret, tokenBuyerSecret, amount

· post isteği

f) MakePayment

· Sahip olunan non-native asset token ile ödeme işlemi yapabilme

· receiverPublicKey, senderSecret, paymentAmount

Stellar — readme bilgileri ve istekler — 2

AccountCreate -1

1) blokzincire dair daha önceki bölümlerde gördüğümüz public ve private adres kavramları stellar platformu üzerinde aynı mantık ama farklı isimlendirme ile devam etmektedir, her yaratılan hesabın bir public private anahtardan oluşmak üzere KeyPair sınıfına ait bir objesi bulunmaktadır.

2) Public adres için public, private adres içinse secret kavramını kullanacağız.

3) Bu metodumuz asıl işi yapan metodumuz çağıran ve mobil önyüz için geri dönüş objelerimizi hazırlayan metodumuzdur.

AccountCreate — 1

AccountCreate -2

1) Stellar network test ve public olmak üzere ikiye ayrılmıştır, biz öncelikle uygulamamızı finansal kayıp yaşanmaması için test networkü üzerinde çalıştıracağız

2) Yaratılan her stellar hesabın test networkü için belli bir xlm bakiyesi ile yaratılır ve biz bu bakiyeyi kullanacağız, halbuki canlı ortamda yarattığımız hesabımızın işlem yapabilmesi için bir cüzdan üzerinden xlm göndermemiz gerekecektir.

3) Daha sonra ilgili hesap yaratma api çağrımıza istekte bulunuyoruz.

4) Bize çağrı sonrası gereken dönen promise yapısı içerisinde test network bilgisini set ediyoruz.

5) loadAccount metodumuz yarattığımız adresimizin public anahtar adres bilgisi ile çağrılıyor.

bunu yapmaktaki amacımız hesabımıza ait bilgileri teyit etmek.

AccountCreate — 2

GetAsset

1) bu metodumuz ile yaratacağımız token’ın bilgilerine ait bilgileri kontrol edeceğiz.

2) Artık yaratılan hesaplara ait kritik bilgileri redis veritabanımızda topluyoruz. İhtiyacımız olduğu zamanlarda bu veritabanı üzerinden ilgili verileri çekiyoruz.

3) horizon-testnet api üzerine yapacağımız Asset çağrısı bize token için gerekli bilgileri dönecektir.

4) Postman üzerinde cevabı görmek için asset objemizi oluşturup hazırlıyoruz.

GetBalance

1) Verilen adresime ait bakiye bilgilerini elde etmemizi sağlar

2) Horizon-testnet api üzerinden effects resource metodu bize bakiye bilgilerini dönecektir.

GetAsset
GetBalance

TokenCreate

1) Stellar üzerinde token yaratmamız için öncelikle api çağrımı öncesi hazırlamamız gereken objelerimiz mevcuttur bunlar şu şekildedir:

· issuerSecret : token yaratma yetkisine sahip hesabın private anahtar adres bilgisi.

· receiverSecret : token yaratıldıktan sonra ilgili supply ile bu token ‘un gönderileceği hesabın public adres bilgisi.

· Yaratacağımız token ismi için “MTP” kodunu seçtik, bu konulardaki kısıtlamalar stellar api web sayfasında rahatlıkla bulunabilinir.

2) TokenCreate metodumuz artık token kodu ve yaratıcı hesabın public anahtar adresi ile çağrılır.

3) Token objemiz bize geri döndürülür artık bundan sonraki adım token için xdr objesi hazırlamaktır. Xdr obesini hazırlamaktaki amacımız daha sonra token bilgilerini direk xdr objesinden get etmek içindir.

4) addOperation api çağrısını changeTrust metodu ile yapıyoruz. Bu metodumuz token yaratma aşamasında sonraki aşamadır ve yaratıcı hesap ile alıcı hesap arasındaki güveni sağlar, bu güven sağlanmadan token aktarımı yapılamaz. Çünkü stellar istenmeyen token gönderimini bu yöntemle garanti altına almıştır.

Yaratacağımız token için supply seçimini stellar bize bırakıyor ve burada 1.00.000.000 sayıda “MTP” token oluşturuyor ve işlemi imzalıyoruz.

TokenCreate — 1

1) Token yaratma işlemimiz istenilen miktarda yaratıldıktan sonra, yaratılan token’ların ilgili hesaba gönderilmesine geldi, bu işlem için skd api metodu olan addOperation fonksiyonunu çağırıyoruz. Metodumuz operation tipi olarak payment metodunu ilgi obje ile çağırıyor.

2) Oluşturulan objemiz parametreleri şu şekildedir;

· destination : alıcı adresin public anahtar adresi.

· asset : yarattığımız token objemiz.

· amount : yaratılan token üzerinden ne kadar gönderim yapılacağı bilgisi.

3) Hatırlarsanız bir önceki aşamada changeTrust metodunu çalıştırmıştık şimdi ise payment ile token gönderim işlemini başarıyla gerçekleştiriyoruz.

İşlemin blokzincir işlemi olduğunu unutmamalıyız ve mutlaka private anahtar ile imzalanması gerekiyor. Sonrasında işlem blokzincire gönderiliyor

TokenCreate — 2

DepositToken

1) Hesap yaratma, bakiye kontrolü, asset kontrolü ve token yaratma işlemlerinden sonra sıra yaratılan token için değiş tokuş yapma işlemine geldi, bu işleme deposit adını veriyoruz, yani xlm karşılığında “MTP” token satın alma.

2) Bu işlem için gerekli olan parametrelerimize göz atalım.

· tokenHolderSecret : yaratılan token’ları elinde tutan hesabın private anahtar adresidir.

· tokenBuyerSecret :token alacak olan hesabın private anahtar adresidir.

· amount : ne kadar token alacağı miktarıdır.

3) Redis üzerinden daha önce token yaratan hesabın bilgilerini çekiyoruz ve sonrasında token bilgileri stellar sdk üzerinden tekrar çekiyoruz.

· Bu işlemi StellarSdk.Asset.fromOperation api metodu ile yapıyoruz.

· Bu metodun alacağı parametreler;

* token bilgisi.

* nekadarlık bir gönderim yapılacağı bilgisi.

* ve karşılığında xlm native para birimi kullanılacağı bilgisidir.

* burada dikkat edilmesi gereken; buy ve sell terimlerinin doğru doldurulmasıdır.

4) StellarSdk.Operation.manageOffer metodu ile işlemimizin gerçekleştirilmesi için bir köprü kuruyoruz, karşılıklı güven kurulmasındna sonra ödeme aşamasına yani asset transferine geçebiliriz.

5) StellarSdk.Operation.payment metodu ile ödeme işlemimizi yapıyoruz. Bu işlem sonucunda ilk hesabın “MTP” token sayısı azalırken, ikinci hesabın xlm sayısı azalacaktır. Ödeme işlemi için gerekli parametreler şu şekildedir;

· destination : alıcı hesabın public anahtar adresi.

· asset : “MTP” token bilgisi.

· amount : nekadarlık bir alım yapılacağı bilgisi.

Daha sonra işlemimiz imzalayıp blokzincire gönderiyoruz.

DepositToken — 1
İlgili bilgileri redis üzerinde çeken metod
DepositToken — 2

Payment

1) Ödeme metodumuz artık “MTP” token ‘a sahip hesapların işlem yapmaları üzerinde kurulmuştur ve bir önceki metodumuzda bulunan payment metodu ile aynı şekilde işlemektedir.

Payment

--

--

No responses yet