DOLAR
32,4375
EURO
34,7411
ALTIN
2.439,70
BIST
9.915,62
Adana Adıyaman Afyon Ağrı Aksaray Amasya Ankara Antalya Ardahan Artvin Aydın Balıkesir Bartın Batman Bayburt Bilecik Bingöl Bitlis Bolu Burdur Bursa Çanakkale Çankırı Çorum Denizli Diyarbakır Düzce Edirne Elazığ Erzincan Erzurum Eskişehir Gaziantep Giresun Gümüşhane Hakkari Hatay Iğdır Isparta İstanbul İzmir K.Maraş Karabük Karaman Kars Kastamonu Kayseri Kırıkkale Kırklareli Kırşehir Kilis Kocaeli Konya Kütahya Malatya Manisa Mardin Mersin Muğla Muş Nevşehir Niğde Ordu Osmaniye Rize Sakarya Samsun Siirt Sinop Sivas Şanlıurfa Şırnak Tekirdağ Tokat Trabzon Tunceli Uşak Van Yalova Yozgat Zonguldak
Balıkesir
Az Bulutlu
17°C
Balıkesir
17°C
Az Bulutlu
Pazar Az Bulutlu
19°C
Pazartesi Çok Bulutlu
19°C
Salı Az Bulutlu
21°C
Çarşamba Az Bulutlu
24°C

Merhabalar; önceki yazımızda Blockchain yapısını anlatmıştım ve yazılım tarafına geçiş yapmıştık. Blocklarımızın içeriğini blok sınıfımızı kodlamış ve genesis bloğumuzu oluşturmuştuk. Blok içeriğine index,zaman, bir önceki bloğun hash kodu, mevcut bloğun hash kodu , taşıyacağı data ve mining deneme sayısını eklemiştik. Bu yazımızda Blockchain sınıfımızı oluşturup diğer yeni üreteceğimiz blokları ve birbiri arasındaki bağlantıyı oluşturalım

 

Görselde zorluk seviyemizi 2 yapıp şifremizin ilk iki karakterininde 9 olana kadar hash denemesi yapmış ve 247 denemede istediğimiz genesis Bloğu oluşmuş gözüküyor. Ve genesis bloğumuzun hash kodu “990UX1XIyoZ2A8pL/WiSu7OhG4IwwLsMB22gNMU+DM0=”

Üstteki görselde ikinci blok oluşturuldu ve fark edildiyse index1 olan yani ikinci bloğumuz 9625 deneme de bulundu ve hash kodu üretildi.  Fark ettiyseniz önceki hash kodumuzda yeni bloğumuzda eklenmiş oldu. Şimdi bu işlemlaerimizin kodlamasını yapalım.

 

Blockchain: (blok zincir sınıfımızı kodlayalım)

Imports System

Imports System.Collections.Generic

Imports System.Text

 

Namespace BlockchainMTN

Public Class Blockchain

Public PendingTransactions As IList(Of Transaction) = New List(Of Transaction)()

Public Sub InitializeChain()

Chain = New List(Of Block)()

AddGenesisBlock()

End Sub

 

Public Function CreateGenesisBlock() As Block

Dim block As Block = New Block(DateTime.Now, Nothing, PendingTransactions)

block.Mine(Difficulty)

PendingTransactions = New List(Of Transaction)()

Return block

End Function

 

Public Sub AddGenesisBlock()

Chain.Add(CreateGenesisBlock())

End Sub

 

Public Sub ProcessPendingTransactions(ByVal minerAddress As String)

PendingTransactions = New List(Of Transaction)()

CreateTransaction(New Transaction(Main.TextBox2.Text, minerAddress, Main.TextBox3.Text))

Dim block As Block = New Block(DateTime.Now, GetLatestBlock().sifre, PendingTransactions)

AddBlock(block)

End Sub

 

Public Sub CreateTransaction(ByVal transaction As Transaction)

PendingTransactions.Add(transaction)

End Sub

 

Public Function GetLatestBlock() As Block

Return Chain(Chain.Count – 1)

End Function

 

Public Sub AddBlock(ByVal block As Block)

Dim latestBlock As Block = GetLatestBlock()

block.Index = latestBlock.Index + 1

block.oncekisifre = latestBlock.sifre

block.Mine(Difficulty)

Chain.Add(block)

End Sub

 

Veri doğruluğunu kontrol etmek için IsValid yöntemini kullanıyoruz. Burada extra olarak önceki hash kodumuzu da kontrol edip sistemimizin bloklarının korumasını arttırmış oluyoruz. Olası bir saldırı halinde mevcut blok bozulsa bile, block zincirinin bozulması imkansızdır. Diğer kullacılar etkilenmeyecektir.

Public Function IsValid() As Boolean

For i As Integer = 1 To Chain.Count – 1

Dim currentBlock As Block = Chain(i)

Dim previousBlock As Block = Chain(i – 1)

If currentBlock.sifre <> currentBlock.CalculateHash() Then

Return False

End If

If currentBlock.oncekisifre <> previousBlock.sifre Then

Return False

End If

Next

Return True

End Function

 

 

Public Function GetBalance(ByVal address As String) As Integer

Dim balance As Integer = 0

For i As Integer = 0 To Chain.Count – 1

For j As Integer = 0 To Chain(i).icerik.Count – 1

Dim transaction = Chain(i).icerik(j)

If transaction.Kimden = address Then

balance -= transaction.Tutar

End If

If transaction.Kime = address Then

balance += transaction.Tutar

End If

Next

Next

Return balance

End Function

 

Transaction sınıfında ise taşıyacağımız verinin içeriği bulunmaktadır.  Örneğimizde oluşturduğumuz class da kimden kime ve miktar mevcut.

Namespace BlockchainMTN

Public Class Transaction

Public Property Kimden As String

Public Property Kime As String

Public Property Tutar As Integer

 

 

Transaction Bir sonraki yazımızda WebSocket ile sistemimizi yayınlamayı diğer bilgisayarların ağımıza katılmasını sağlayacağız.

Yazarın Diğer Yazıları
Yorumlar

Henüz yorum yapılmamış. İlk yorumu yukarıdaki form aracılığıyla siz yapabilirsiniz.