• Sonuç bulunamadı

Proof-of-work (PoW), iş kanıtı olarak anılan mutabakat, yapbozu bir araya getirmek için saatlerce uğraşmaya benzer fakat bir yapboz doğru şekilde bir araya getirildiğinde, bunu anlamak için şöylesine bir bakmak yeterlidir. İş Kanıtı mutabakatında, bulmacayı çözmek için gereken çabaya İş ve çözüme de İş Kanıtı adı verilir. Bitcoin, Ethereum gibi coinler bu yöntemle yeni blokları oluşturmaktadır. İş

Kanıtı’nı kullanan blok zincirleri, zincire eklenecek her bir yeni blok için böyle bir kanıt gerektirir; bu şekilde yeni bloklar yaratmak için İş’in yapılması gerekir. Bu İş sık sık ‘madencilik’ olarak anılmaktadır.

Proof-of-stake (PoS), PoW için harcanan elektriğin artması ve blokların üretilme süresinin uzaması ile farklı yöntemlere ihtiyaç durulmuştur. “Proof of Stake”

kavramı bu nedenlerden dolayı ortaya çıkmıştır. PoW her yeni bloğun rastlantısal olmayan bir şekilde, kişinin bakiyesine göre belirlendiği sistemdir. PoS sistemiyle para kazanmak için sadece coinin elektronik cüzdanlarda tutulması gerekmektir.

Cüzdanda ne kadar çok para varsa o kadar çok para kazanılmaktadır.

Aşağıdaki şekilde PoW ve PoS yapılarının nasıl çalıştığı örnek şekillerle gösterilmiştir.

Şekil 2.3. PoW vs PoS

BÖLÜM 3. SİSTEMLERİN KURULUMU

3.1. Docker

Günümüzde yazılım hizmeti sağlayan şirketler, gereksinimlerini karşılayacak uygulamalar geliştirmektedir. Bu uygulamaları hizmete aktarabilmek için sunuculara ihtiyaç duyulmaktadır. Ancak sunucuların tedarik edilmesi, gerekli kurulum ve ayarlamaların yapılması uzun ve yoğun bir süreci beraberinde getirmektedir. Bu ihtiyaçlar doğrultusunda ise Sanallaştırma Teknolojisi HyperVisor hayatımıza girmiştir. Bu teknolojinin en bilinen örnekleri ise Vmware, Xen, Hyper-V gibi HyperVisorlerdir.

Bu HyperVisor teknolojisi işimizi her ne kadar kolaylaştırsa da istenileni tam olarak karşılamamaktaydı. Bunun nedeni ise aşırı derecede fazla CPU, RAM gibi kaynakların tüketimi olarak söylenebilir. Sanal bilgisayarlar Host işletim sisteminin dışında ayrıca bir işletim sistemi daha çalıştırıyordu. Bu ihtiyaçlarla beraber 2008 yılında Docker ve container kavramları ortaya çıkarak Linux Kernel’ine eklenmiştir.

Docker’ın sanallaştırma yapısı bir HyperVisor katmanına sahip değildir. Bunun yerine Docker Engine Host olarak bulunduğu işletim sistemine erişebilmekte ve sistem araçlarını paylaşımlı olarak kullanabilmektedir. Bu şekilde klasik sanal makinelere göre daha az sistem kaynağı kullanarak, daha faydalı bir sanallaştırma teknolojisi olduğunu kanıtlamıştır.

3.1.1. Docker container

Sunucu üzerine sadece bir işletim sistemi kurulup, daha sonra bu işletim sistemi üzerinde containerlar oluşturularak bu yapı içerisinde uygulamalar çalıştırılabilmektedir. Tek bir işletim sistemi tarafından oluşturulan containerlar ve içinde çalışan prosesler, işletim sisteminde sadece kendilerinin bulunduğu haliyle yönlendirilmektedirler. Bir makine gücüne bağlı yüzlerce Docker containerı birden aynı anda çalıştırılabilmektedir.

Aynı işletim sistemi üzerinde çalışan containerlar birbirlerinden izole edilmiş ve istenmediği sürece de bu iletişimsizlik devam ettirilebilmektedir. Böyle bir şey yapılmasının temel nedeni ise güvenliğin sağlanmak istenmesidir.

Container, klasik sanal makinelerden farklı olarak üzerinden uygulama çalıştırabilmek için misafir bir işletim sistemine ihtiyaç duymamaktadır. Container yapısında tek bir işletim sistemi olduğundan tüm containerlar güvenli bir şekilde bu işletim sistemini paylaşabilmektedir. HyperVisor’lerle karşılaştıldığında ise container yapısının daha ekonomik olduğunun farkına varılmaktadır.

Şekil 3.1. Sanal Sunucu Mimarisi

Şekil 3.2. Docker Container Mimarisi

3.1.2. Docker ile container oluşturmak

Bu bölümde Docker CLI’ı kullanarak container oluşturma silme gibi işlemler gösterilmiştir. Bütün komutlar Windows işletim sistemi üzerinde uygulanmıştır.

Diğer işletim sistemlerinde de bütün komutlar çalışabilir ancak farklı çıktılar elde edilebilir.

3.1.3. Docker’ın versiyonunu öğrenmek

İşletim sistemine yüklenen Docker’ın versiyonunu öğrenmek için yazılacak komut docker –version komutudur.

3.1.4. DockerHub’dan ilk imajı indirmek ve görüntelemek

Docker imajları DockerHub’dan indirebilir. docker pull ‘imaj ismi’ komutu ile indirilen imajlar docker images komutu ile de görüntülenebilir. Aşağıdaki örnekteki mongo veritabanı imajı indirilip, docker images komutu ile daha önceden indirilen hello-world ve mongo imajı görüntülenebilir.

3.1.5. Docker imajını kullanarak container yaratmak

İndiilen imajı container haline getirmek ve çalıştırmaya başlamak için docker run

‘imaj ismi’ komutu kullanılır. Bu komuta bazı parametreler eklenerek ekstra işler yapmasını sağlamak mümkündür. -d parametresi ile container arka planda çalışmaya devam edebilir. Bu parametre olmazsa imaj bir kere çalışıp daha sonra kapanacaktır.

-- name komutu ile oluşturulan container için isim verilebilir. --link parametresi iile iki container birlikte çalıştırabilir. -p parametresi ise port bilgisini verir. Bir kere hazırlanan Docker imajı sürekli olarak kullanılabilir.

Çalışan veya çalışmayan tüm containerları görmek için docker ps -a komutu kullanabilir. Docker run --name my-mongo mongo komutu ile çalıştırılan imajın port numarası, ismi, oluşturulma tarihi vb. bilgiler bu komut sayesinde görüntülenebilir.

3.1.6. Container’ı tekrar başlatmak ve silmek

Bir önceki adımda çıkış yapan container tekrar başlatılabilir. docker start -a 9407a4936a09 komutu ile hello-world containerı tekrar çalıştırılır. Komutta yazılan 9407a4936a09 ise containerın ID’sidir. Bu komutun çıktısı docker run hello-world komutunun çıktısıyla aynıdır. Eğer komutta -a parametresini kullanılmazsa aşağıdaki gibi sadece container ID’si görülür.

Bu adımda ise çalıştırılan ve birkaç kere tekrar başlatılan hello-world containerı silinmiştir. docker rm <container_id> komutu ile çıkış yapmış containerlar silinebilir. docker rm -f <container_id> komutu, yani -f Force parametresi ile bir container çalışır durumda dahi olsa silinebilir. Force opsiyonunu kullanmak yerine önce docker stop <container_id> ile container durdurulıp daha sonra silinebilir.

docker rm -f 9407a4936a09 komutu ile hello-world containerı silinmiştir. Artık docker ps -a komutu sadece mongo containerını listelemelidir.

3.2. Ethereum Ağı Oluşturmak

Bu aşamada özel bir Ethereum ağı nasıl oluşturulur, ondan bahsedilmektedir.

3.2.1. Geth ve yüklenmesi

Geth, Ethereum ağı ile iletişime geçilebilmeyi sağlayan yazılımdır. Yazılım Ethereum ağını sürekli izleyip buna göre bilgisayarınıza atanan işi güncellemektedir.

Geth ile Ethereum üzerinde madencilik, para transferleri ve akıllı sözleşme işlemleri gibi birçok işlem yapılabilir.

Geth’in kendi sitesinden kullanılan işletim sistemine göre Geth’in son versiyonu indirilebilir.

3.2.2. Ethereum blockchaini oluşturmak

İlk olarak Geth kurulumunu yaptıktan sonra bir klasör açarak, içine aşağıdaki kodların yazıldığı bir json dosyası oluşturulur.

{

Buradaki config, BlockChain konfigurasyon tanımlarını içerir. chainId, replay attack’a karşı koruma amacıyla kullanılmaktadır. homesteadBlock, Ethereum’um ikinci büyük versiyonudur, sıfır seçildiğinde bunu kullanır. difficulty, mining işleminin zorluğunu tanımlar. gasLimit ise blok başına gaz maliyetinin limitidir.

Artık Geth ile Blockchain oluşturabilir. datadir ile BlockChain’in oluşturulacağı klasörü belirleyip, init ile başlangıç noktası olan genesis.json dosyası gösterilir.

Bunun için aşağıdaki komutu kullanılır.

geth --datadir "c:\myEth" init "genesis.json"

Ethereum BlockChain hazır olduktan sonra hesap açma ve mining işlemlerine başlanılabilir. Geth’de bu tarz işlemleri yapabilmek için Javascript tabanlı bir komut yorumlayıcısı vardır. Bunun için aşağıdaki komut yazılır.

geth --datadir "c:\myEth" --ipcdisable --nodiscover console

Bu komut içinde güvenlik sağlamak amaçlı bazı parametereler kullanılmaktadır.

İçindeki parametrelerin anlamı ise nodiscover: Blockchain’i manuel olarak eklemeyenler tarafından keşfedilemediğinden emin olmak için kullanılır ve bilgimiz dışında eklenilmesini engeller, ipcdisable: IPC-RPC sunucusunu devre dışı bırakır.

Yukarıda yazılan komutla beraber Javascript konsolunun içerisine girilmiş olunur.

Şimdi ise hesap açıp şifre koyulabilir. Personal.newAccount() komutu ile yeni hesap oluşturup şifre belirlenmiştir. Personal.listAccounts komutu ile de oluşturalan bu hesaplar görüntülenebilir. Şu an tek hesap olduğu için sadece az önce açılan hesap bilgisini görüntülenmiştir.

eth ile mining işlemleri, hesaptaki para ile ilgili işlemler, blok işlemleri ve transaction gibi birçok işlem gerçekleştirilebilir. Öncelikle Ethereum BlockChain’indeki blok numarası öğrenilir. Bunun için eth.blockNumber komutu yazılır. Ancak henüz mining yapılmadığından genesis bloğundan başka bir blok görüntülenemez. Bu yüzden sonuç 0 olarak dönecektir. eth.getBlock(0) komutu ile de genesis bloğu görüntülenebilir.

miner.start(1) komutuyla mining işlemine başlanılır. Bu işlem ilk çalıştırmada biraz uzun sürecektir. Bir süre bekledikten sonra yeni bloklar mining edilmeye başlanacaktır. miner.stop() komutu ile mining işlemini durdurulduktan sonra blockNumber ile üretilen blok numarası kontrol edilebilir. Sonuç olarak da eth.blockNumber komutunu tekrar yazıldığında blok numarası artık sıfırdan farklı bir değerde olacaktır.

Hesaptaki miktar eth.getBalance(eth.accounts[0]) komutu ile öğrenilebilir. İlk başta bu değer wei olarak görüntülenmektedir. Bunu Ethereum para birimi olan ether’e çevirmek için web3.fromWei(eth.getBalance(eth.accounts[0]), "ether") kodu kullanılabilir. Aşağıdaki çıktıda 1245 ether olduğu görüntülenmiştir.

Bu aşamada bir hesap daha açılarak ilk hesaptan diğerine para gönderimi gerçekleştirilmiştir. Personal.newAccount() komutu ile yeni hesap açılır. Yeni hesap açıldıktan sonra ilk hesaptaki kilit işleminin kaldırılması gerekir. Bunun içinde aşağıdaki komut kullanılabilir.

Personal.unlockAccount(eth.accounts[0])

Eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value:

web3.toWei(245,"ether")}) komutu ile de 1245 ethere sahip olan hesaptan daha sonra açılan hesaba ether transferi gerçekleştirilmiştir.

Buradaki önemli nokta ise bu işlemin BlockChain’e eklenip gerçekleşmesi için miner’lar tarafından işlenmesi gerekimekte. Bunun için ise mining yapılmalıdır.

miner.start(1) ile mininge işlemine başlanıp miner.stop() ile bitirildiğinde ilk hesaptan ikinci hesaba ether transferinin gerçekleştirilmesi tamamlanmış olur.

3.3. Solidity ile Smart Contract Yazmak ve Derlemek

Solidty statik, nesne yönelimli ve şu anda akıllı sözleşmeler için en sık kullanılan programlama dilidir. Solidity ile akıllı sözleşme yazılma işlemi bittikten sonra Solidity derleyebilen bir derleyici ile derlenir ve BlockChain’e transaction olarak iletilir. Farklı türden akıllı sözleşmelerin BlockChain yapısında çalışması sağlanmaktadır.

Browser tabanlı olarak Solidity kodlarının yazılmasını ve daha sonra derleyip test edilmesi için https://remix.ethereum.org/ adresindeki Solidity derleyicisi olan Remix IDE kullanılabilir. Küçük sözleşmeler yazmak ve derlemek için uygundur.

Aşağıda şekilde Remix derleyisinde yazılmış basit bir akıllı sözleşme örneği verilmiştir.

Şekil 3.3. Solidity Compiler [4]

BÖLÜM 4. SONUÇLAR VE ÖNERİLER

Bu projede Geth kullanılarak iki hesap arasında para transferi gerçekleştirilmiş ve Solidity ile de akıllı sözleşmelere giriş yapılmıştır. Böylelikle gelecekte özellikle bankacılık ve finans sektöründe blok zinciri ve akıllı sözleşme kavramlarının ne kadar önemli olacağı gözlemlenmiştir.

Gelecekte bu tarz kripto paraların kullanım alanları artarak günlük hayatımızın çoğu yerinde kullanılmaya başlanacaktır. 2008 yılında Satoshi Nakamoto ile hayatımıza giren Blockchain yapısı ve Bitcoin gibi paralar sayesinde farklı bir gelecek şekillenmektedir. Bu sonuca bakarak “gelecek merkezi olmayan sistemdedir”

denilebilir [5].

Gelişmek isteyen ülkelerin, bu teknojileri yakından takip edip bu teknojiler konusunda deneyimli eleman yetişirmeleri gerekmektedir. Finans, Bankacılık, Eğitim ve daha bir sürü sektörle bu teknolojileri senkronize ederek tüm dünyada yaşanan teknolojik gelişime ayak uydurmak gerekmektedir.

KAYNAKLAR

[1] Satoshi Nakamoto “Bitcoin: A Peer-to-Peer Electronic Cash System”

https://bitcoin.org/bitcoin.pdf, 2008 [2] En Değerli Sanal Paralar,

https://tr.investing.com/crypto/currencies , 30.12.2019 [3] Süleyman Kaya “DApps-Merkezi Olmayan Uygulamalar”,

https://coinbalina.com/dapps/

[4] Remix Ethereum IDE https://remix.ethereum.org/

[5]

Bob Wigley, Nicolas Cary “The Future is Decentralised”

ÖZGEÇMİŞ

Ufuk Erdoğan, 06.05.1995 de İstanbul’da doğdu. İlk, orta ve lise eğitimini Sarıyer’de tamamladı. 2013 yılında Firuzan Kemal Demironaran Lisesi’nden mezun oldu. 2013 yılında Sakarya Üniversitesi Bilgisayar Mühendisliği Bölümü’nü kazandı. 2015 yılında Arkas Lojistik Şirketinde donanım stajını ve 2016 yılında da İnnova Şirketinde yazılım stajını yaptı. Şu anda Sakarya Üniversitesi Bilgisayar Mühendisliği Bölümünde öğrenim görmektedir.

BSM 401 BİLGİSAYAR MÜHENDİSLİĞİ TASARIMI DEĞERLENDİRME VE SÖZLÜ SINAV TUTANAĞI

KONU :

ÖĞRENCİLER (Öğrenci No/AD/SOYAD):

Değerlendirme Konusu İstenenler Not

Aralığı Not

Yazılı Çalışma

Çalışma klavuza uygun olarak hazırlanmış mı? x 0-5

Teknik Yönden

Problemin tanımı yapılmış mı? x 0-5

Geliştirilecek yazılımın/donanımın mimarisini içeren blok şeması

(yazılımlar için veri akış şeması (dfd) da olabilir) çizilerek açıklanmış mı?

Blok şemadaki birimler arasındaki bilgi akışına ait model/gösterim var mı?

Yazılımın gereksinim listesi oluşturulmuş mu?

Kullanılan/kullanılması düşünülen araçlar/teknolojiler anlatılmış mı?

Donanımların programlanması/konfigürasyonu için yazılım gereksinimleri belirtilmiş mi?

UML ile modelleme yapılmış mı?

Veritabanları kullanılmış ise kavramsal model çıkarılmış mı? (Varlık ilişki modeli, noSQL kavramsal modelleri v.b.)

Projeye yönelik iş-zaman çizelgesi çıkarılarak maliyet analizi yapılmış mı?

Donanım bileşenlerinin maliyet analizi (prototip-adetli seri üretim vb.) çıkarılmış mı?

Donanım için gerekli enerji analizi (minimum-uyku-aktif-maksimum) yapılmış mı?

Grup çalışmalarında grup üyelerinin görev tanımları verilmiş mi (iş-zaman çizelgesinde belirtilebilir)?

Sürüm denetim sistemi (Version Control System; Git, Subversion v.s.) kullanılmış mı?

Sistemin genel testi için uygulanan metotlar ve iyileştirme süreçlerinin dökümü verilmiş mi?

Yazılımın sızma testi yapılmış mı?

Performans testi yapılmış mı?

Tasarımın uygulamasında ortaya çıkan uyumsuzluklar ve aksaklıklar belirtilerek çözüm yöntemleri tartışılmış mı?

Yapılan işlerin zorluk derecesi? x 0-25

Sözlü Sınav

Yapılan sunum başarılı mı? x 0-5

Soruları yanıtlama yetkinliği? x 0-20

Devam Durumu

Öğrenci dönem içerisindeki raporlarını düzenli olarak hazırladı mı? x 0-5

Diğer Maddeler

Toplam

DANIŞMAN : DANIŞMAN İMZASI:

Benzer Belgeler