Ethereum – Solidity – Working with Smart Contracts – Akıllı Sözleşmeler ile Çalışmak (Example Project)

 

Uzun süredir yoğunluktan blog ile ilgilenemediğimi farkettim ve bayadır aklımda olan bir konu hakkında yazmak istedim. Bugün ki makalemin konusu günümüzün en popüler konularından olan Blockchain teknolojisini altyapı edinen kripto para birimi olan Ethereum’un “Akıllı Sözleşmeler”i üzerine olacak.

Şuanda bilinen en yaygın kripto para Bitcoin’dir. Bitcoin bu anlamda en iyi para birimidir. Fakat artık bunları sadece para birimi olarak değil dijitalleşen hayatımızda farklı alanlar için de işlevsel kılmak istiyoruz. Bu noktada da bize bu esnekliği en iyi sağlayanlardan biri Ethereum’dur.

Peki sağladığı bu şey nedir? Cevabı makalenin başlığından da anlaşılacağı üzere “Smart Contracts” değimiz olay Akıllı Sözleşmeler‘dir. Bu akıllı sözleşmeleri en basit tabir ile örnekleyecek olursak, dijitalleşen dünyanın Dijital Noter‘leri dersek yanılmış olmayız. Fakat işin en önemli yanı ise bu sözleşmeler tek bir noktada değil, merkezi olmayan bir ağ üzerinde tutuluyor olmasıdır.

Şimdi biz developerlar bu işin neresindeyiz? Nasıl bir ortamı var? Nereden başlayacağız? gibi sorularınızın cevabı için ön açıklamayı kısa tutup asıl işe geçelim ve basitçe bir akıllı sözleşme nasıl oluşturabileceğimize değineyim.

1- Create Blockchain Network (1 – Blok zinciri ağı oluştur)

Öncelikle bilgisayarımızda blok zinciri ağı oluşturmak için Ganache‘ı indirip yüklüyoruz. (Ganache-x.xx.appx adında bir dosya inecek.)

install tamamlandıktan sonra block zinciri ağımız otomatik olarak başlayacak.

Artık network’ümüz hazır.

Şimdi contractları programlamak için online bir IDE kullanacağız. Bu IDE bize  javascript benzeri bir dil olan solidity ile programlama ortamı sağlayacak.
https://remix.ethereum.org/  bu linki browserınız ile açın.

Ve şimdi aşağıdaki kod bloğunu buraya yapıştırın. Ayrıca “Auto compile” checkine de tıklayınız.

pragma solidity ^0.4.0;

contract Counter {
    //count değişkeni private olarak tanımlanmış 
    //ve sözleşme sahibi dışında başkası direk erişemez.
    int private count = 0;
    
    //Sayacı 1 arttırır.
    function plusOne() public {
        count += 1;
    }
    
    //Sayacın son halini döndürür.
    function getCount() public constant returns (int) {
        return count;
    }
}

NOT: Siz yukarıdaki kod yerine kendi ihtiyaçlarınıza ve gereksinimlerinize uygun kodu yazıyor olacaksınız. Bu örnek herhangi bir gereksinimi yerine getirmesi için değil tamamen size bu altyapının kullanımını göstermek amacıyla hazırlanmıştır.

Buraya kadar herşey tamamsa devam edelim. Son olarak wallet kaldı. Onu da buradan indiriyoruz. (Linkteki dosyalardan etherwallet-v3.xx.xx.zip dosyasını indirin.)
Download ettiğiniz dosyayı zip den çıkartın ve index.html dosyasını browserınız ile açın.

Cüzdanımızı da indirdik. Şimdi wallet’i makinemize kurduğumuz blockchain networküne bağlayacağız.
Sağ en üstteki dropdowna tıklayarak “Add Custom Network / Node” optionını seçiyoruz.

Ve Ganache’daki local network adres bilgilerimizi buraya girip tamamlıyoruz.

Save butonuna tıkladıktan sonra headerdaki menüden “Contracts” menüsüne tıklayıp ardından “Deploy Contract” sekmesini seçiyoruz.

 

Yukarıdaki “Byte Code” alanının datasını online IDE’miz üzerinden alacağız. IDE’yi açıp “Details” butonuna tıklıyoruz. Daha sonra ise byte code datasını kopyalayıp wallet’deki alana yapıştırıyoruz.

ve şimdi bytecode u yapıştırdıktan sonra yukarıdaki resimdeki gibi “Private Key” i seçip Ganache üzerinden keyimizi alıp buraya yapıştıracağız.

 

“Unlock” butonuna bastıktan sonra transactionımızı sign ediyoruz.

Ardından “Deploy” butonuna basıp açılan popup dan işlemi onaylıyoruz.

 

 

Buraya kadar herhangi bir sorun yoksa şuanda contractımızı deploy ettik. Şimdi bu contract ile etkileşime nasıl geçeceğimize geldi sıra.

Yine wallet üzerinde headerdaki menüden “Contracts”a tıklıyoruz. Ardından “Interact with Contracts” sekmesine tıklıyoruz.

“Contract Adress”imizi öğrenmek için Ganache üzerinden “Transtactions” menüsüne tıklıyoruz. Oradan açılan ekrandaki transactionın detayına gidip oradaki contract address alanını kopyalayıp wallet deki ekranda ilgili yere yapıştırıyoruz.

 

Daha sonra ise online IDE’miz üzerinden ABI/Json Interface datasını detail den kopyalayıp walletdeki ilgili alana yapıştırıp “Access” butonuna tıklıyoruz.

Gelen dropdowndan çağırmak istediğiniz function’ı seçip işlemi gerçekleştirebilirsiniz.

 

“plusOne” functionını run ettikten sonra tekrar “getCount”u çağırıyoruz.

 

Yaptığımız bu işlemleri blockchain network’ümüz üzerindeki kontrol edebilirsiniz.

Tüm işlemleri resimlerle olabildiğince detaylı göstermeye çalıştım. Günün sonunda sizinle simple olarak uçtan uca bir “Smart Contract” oluşturmuş olduk. Umarım faydalı olmuştur. Bir sonraki makalemizde görüşmek üzere. Güncel kalın. = )

SP(Stored Procedure)’lerin Hangi Tabloları Kullanıdığını Bulmak

Bazen uzunca business içeren procedure’ler ile karşılaştığımız oluyordur. Bu noktalarda hangi tablolara dependency edildiğini rahatlıkla analiz etmemize imkan tanıyan bir kodu aşağıda paylaşıyorum. Bir yerde denk geldiğim bir koddu. Unutmayayım diye buraya koyuyorum. İhtiyaç halinde iş görüyor.

DECLARE @temptableforSP TABLE  (spName varchar(100), tableName nvarchar(100))
DECLARE @SP_Name as NVARCHAR(100);
DECLARE @SP_Cursor as CURSOR;
 
SET @SP_Cursor = CURSOR FOR
    SELECT [name] FROM sys.objects WHERE name LIKE 'sp%' AND type='P' -- Gets SPs for specific names
 
OPEN @SP_Cursor;
FETCH NEXT FROM @SP_Cursor INTO @SP_Name;
WHILE @@FETCH_STATUS = 0
BEGIN
 --print(@SP_Name)
 INSERT INTO @temptableforSP
     SELECT 
        OBJECT_NAME(referencing_id) AS referencing_entity_name,    
        referenced_entity_name     
    FROM sys.sql_expression_dependencies AS sed  
    INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
    WHERE referencing_id = OBJECT_ID(@SP_Name); 

 FETCH NEXT FROM @SP_Cursor INTO @SP_Name;
END
 
CLOSE @SP_Cursor;
DEALLOCATE @SP_Cursor;       

-------Display temp. table for SP and Table relation
SELECT * FROM @temptableforSP
------------------