Tradesoft Blog

Ethereum ve Akıllı Kontratlar Nedir ?

Yazar – Aydın Çelikten
Tradesoft Yazılım Geliştirme Direktörü

 

Bu yazımda blockchain tabanlı ikinci önemli dijital para platformu olan Ethereum’ a ve akıllı kontrat yapısına değineceğim.Önce konuyla ilgili genel bazı bilgiler vermek isterim.

 

Ethereum platformu bir dijital para araştırması ve yazılımcı olan Vitalik Buterin tarafından tasarlanmış olup 2014 de halka arz edilip, 2015 Temmuz sonunda gerçek hayatta kullanılmaya başlamıştır. Ethereum dağıtık bir platform olup, bu platform üzerinde dağıtık uygulamalar (Distributed Applications ya da kısaca DApps) çalıştırmamıza izin vermektedir. Bu uygulamalar bir ya da daha fazla akıllı kontrattan oluşur (Smart Contracts). Akıllı kontratlar zamanı geldiğinde ya da uygun şartlar sağlandığında hiçbir müdahaleden etkilenmeden çalışacak olan programlardır. Akıllı kontratlar yazmak için genelde Solidity, Serpent, LLL gibi diller kullanılır. En yaygın kullanılanı Solidity’dir.

 

Ethereum’un iç para birimine ether denir. Yazdığımız akıllı kontratları platforma yüklemek ya da var olan bir kontratın bir fonksiyonunu çağırmak için ether kullanılır. Etherler hesaplarda veya akıllı kontratlarda tutulabilir. Kontratların sisteme kaydedilmesi ya da çalıştırılması için gereken her bir hesaplama adımı için ödenecek komisyona gas adı verilir. Ödemeyi düşündüğümüz en yüksek komisyona da gas limit denir. Kontratı yazan bu bilgileri platforma gönderir ve madenciler bu bilgilere bakarak kontratımızı sisteme kaydetmeye karar verir.

 

Akıllı kontratların pek çok kullanımı olmakla birlikte en etkili kullanım alanlarından biri crowd funding yani yeni bir proje için halktan para toplanarak projenin fonlanması işlemidir. Ethereum platformunda yeni bir para birimi oluşturarak projemizi halka arz edip (ICO – Initial Coin Offering) ethereum karşılığında yeni para biriminizi satarak , katılımcıların projeye ortak olmasını sağlayabiliriz. Hisse satın alarak bir şirkete ortak olmak gibi yeni para biriminden satın alarak projeye ortak olmuş olunur. Bu konudan detaylı olarak daha sonraki yazılarımızda bahsedeceğiz.

 

Ethereum platformu üzerinde çalışan uygulamalara örnekleri https://www.stateofthedapps.com/ sitesinden inceleyebilirsiniz.

Ethereum’da akıllı kontrat yazılması konusuna geri dönersek, bu yazımızı örnek basit bir akıllı kontratın test ortamına yüklenerek denenmesine ayırmak istiyorum. Akıllı kontratların detayları ile ilgli bilgiyi daha sonraki yazılarımızda vereceğiz. Ethereum ağıyla ilişkiye geçebilmemizi sağlayan programın adı Geth (Go-Ethereum). Öncelikle bu programın işletim sistemimize uygun versiyonunu aşağıdaki linkten indirmemiz gerekiyor.

 

https://geth.ethereum.org/downloads/
Bu linki açtığımız zaman aşağıdaki gibi bir sayfa karşımıza geliyor

Geth’i indirdikten sonra geth kurduğunuz dizine gidip command window açarak (dizin üzerindeki iken Shift tuşu basılıyken mouse’un sağ kliklediğinizde command window’un o dizinde açılması için gerek Open Command Window Here komutunu menüde görebilirsiniz) aşağıdaki şekilde geth uygulamasını çalıştırdığımızda artık bir Ethereum noktası haline gelmiş oluyoruz.

Ancak şu aşamada gerçek ağa bağlanmayacağımız için şu aşamada geth exe yi çalıştırmıyoruz. Daha sonra kurduğumuz test ağında çalıştıracağız.

 

Daha sonra test uygulamalarımız için kendi özel Ethereum ağımızı oluşturabiliriz.

 

Öncelikle masaüstünüze ya da uygun bir yere ‘’Ethereum Test’’ dizinini açıyoruz. Sonra bu dizin altında ‘’TestDataDir’’ dizinini açıyoruz. Sonra kendi test blockchainimizin ilk bloğunu (genesis blok) oluşturmamız gerekiyor. Bunun için aşağıdaki bilgileri içeren bir text dosyası oluşturup adını genesis.json koyuyoruz ve EthereumTest dizinine kaydediyoruz.

{
“coinbase” : “0x0000000000000000000000000000000000000001”,
“difficulty” : “0x10000”,
“extraData” : “”,
“gasLimit” : ” 0x8000000″,
“nonce” : “0x0000000000000033”,
“mixhash” : “0x0000000000000000000000000000000000000000000000000000000000000000”,
“parentHash” : “0x0000000000000000000000000000000000000000000000000000000000000000”,
“timestamp” : “0x00”,
“alloc”: {},
“config”: {
“chainId”: 15,
“homesteadBlock”: 0,
“eip155Block”: 0,
“eip158Block”: 0
}
}
Daha sonra EthereumTest dizininde açtığımız comman window ekranında
geth –datadir=./TestDataDir/ init ./genesis.json
komutunu çalıştırıyoruz.

Bu komut sonrasında TestDataDir içerisinde geth ve keystore isimleri ile iki dizinin oluştuğunu görebilirsiniz.

Sonrasında geth –datadir=./TestDataDir/ komutunu çalıştırarak az sonra kuracağımız Mist programının yeni blockchainimize erişmesini sağlayabiliriz.

Ethereum’da yeni hesap oluşturmak , akıllı kontrat yazmak ve yüklemek için kullanılan programlardan birisi Mist’tir.Öncelikle aşağıdaki adresten Mist programını indiriyoruz.

https://github.com/ethereum/mist/releases
Bu adresten Mist-installer-0-9-3.exe çalıştırılır.

Mist kurulumunu yaptıktan sonra Mist exe’yi çalıştırmadan önce test networkünde olduğumuzdan emin olmak için önce varsa command window’dan çalışan geth exeleri kapatıyoruz. Sonra EthereumTest dizininde command window açıp geth –datadir=./TestDataDir komutunu çalıştırarak gethin mistin bağlanması için hazır olmasını sağlıyoruz.

Daha sonra mist exe yi çalıştırdığımızda aşağıdaki gibi sağ üstte PRIVATE-NET yazan bir pencere açılıyor. Bu bizim genel ethereum ağında değil, özel bir ağda olduğumuzu gösteriyor.

Burada beklememek için LAUNCH APPLICATION’a basıyoruz ve MIST programı açılıyor.

Şu anda hiç hesap yok . Önce hesap açıyoruz. Add Account butonuna basınca açılan ekrandan ‘’Create New Account’’ butonuna basıyoruz. Sonra açılan ekranda iki kere şifre girerek hesabı açıyoruz. Bu ekranda verdiğimiz şifreyi unutmamamız gerekiyor, unutursak bu hesap ile bir daha işlem yapamayız.

Hesap açıldığında aşağıdaki ekran gibi bir görüntü oluşuyor.

Yeni bir akıllı kontrat yükleyebilmek için öncelikle hesapta bir miktar Ether bulunması gerekiyor. Bunu sağlamak için önce madencilik faaliyetine başlamamız gerekiyor.

Bunun için ‘’EthereumTest’’ dizini altında açtığımız ‘’TestDataDir’’ dizininde açtığımız ‘’Command Window’’ dan Java konsolunu etkinleşirmek için geth attach komutunu çalıştırıyoruz . Daha sonra da miner.start(); komutu ile madenciliği başlatıyoruz.

Mist uygulamasında madenciliğin çalıştığını hesap bakiyesine sürekli 5 ether eklenmesi ile görebiliriz. Hesap bakiyesi belli bir rakama ulaştığında miner.stop(); komutu ile madenciliği durduruyoruz . Akıllı kontrat oluşturmak için ‘’Contracts’’ butonuna basıyoruz.
Burada açılan pencerede Deploy New Contract butonuna basıyoruz.

Bu ekranın alt kısmında akıllı kontrat yüklemek için Solidity penceresi bulunuyor Buraya örnek kontratı yapıştırıp sağ taraftaki Pick Contract butonuna basarak OrnekKontrat’ı seçiyoruz.

Örnek kontraımızın kodu şu şekilde:
pragma solidity ^0.4.18;
contract OrnekKontrat {

uint256 sayi= 2;
address owner = msg.sender;
function ekle() public {
sayi++;
}

function ucilecarp() public {
sayi=sayi*3;
}
function goster() public constant returns (uint256) {
return sayi;
}

function yoket() public {
if(msg.sender == owner) {
selfdestruct(owner);
}
}
}

 

Daha sonra bu ekranın en altındaki Deploy tuşuna bastığımızda aşağıdaki ekran açılıyor. Hesap için girdiğimiz şifreyi bu ekranın alt tarafına girdiğimizde kontratımız blockchaine yüklenmek üzere networke yollanıyor.

 

Ancak kontratın blockchain’de yer alabilmesi için madencilik faaliyeti yapılması gerekli. Bu nedenle daha önce açtığımız java konsolunda miner.start() komutunu tekrar çalıştırıyoruz.

Wallet tarafında kontrat için oluşan transaction ın 12 konfirmasyon almasını bekledikten sonra kontrat blockchaine  yazılmış oluyor.

Daha sonra Contracts tarafına tekrar geçerek kontratımızın üstüne basarak fonksiyonlarını deneyebiliriz.

Fonksiyonu seçtikten sonra ‘’Execute’’ tuşuna bastığımızda yine şifre penceresi gelecek ve sonrasında Goster fonksiyonunda görünen rakam değişecektir.

7 olan değerimiz 3 ile çarp fonksiyonu sonrası 21 olarak güncellendi.

Kontratımız oldukça basit ancak kısaca anlatmak gerekirse ilk satırdaki pragma fonksiyonu bu kontratın çalışabileceği minimum versiyonu gösteriyor . pragma solidity ^0.4.18; Program 0.4.18 ve sonraki versiyonlarda çalışacak, 0.4.18 öncesi versiyonlarda çalışmayacak ayrıca ^ koyduğumuz için 0.5.0 ve sonraki versiyonlarda da çalışmayacaktır.

 

Sayi değişkenine önce 2 atadık . Ucilecarp fonksiyonu sayi değişkenindeki son değeri 3 ile çarpıyor. Ekle fonksiyonu 1 ekliyor. Goster fonksiyonu ise sayi değişkeninin son değerini gösteriyor.

 

Ayrıca kontratı pasif hale getirebilmek için yoket fonksiyonunu koyduk ve bu fonkisyonu sadece kontratı yazan kişinin çağırabilmesi için de if(msg.sender == owner) komutunu koyduk. Bu fonksiyon çalıştığında kontratta biriken ether varsa otomaitk olarak kontart sahibinin adresine aktarılmaktadır.

 

Akıllı kontratlar hakkında daha detaylı bilgiyi sonraki yazılarımızda vereceğiz. Bu yazıda örnek bir akıllı kontratın test ortamında yüklenmesi ile ilgili gerekli temel bilgileri vermeye çalıştık. Yazımızın Ethereum’a ilgi duyanlar için faydalı olacağını ümit ediyoruz.

Leave a Reply