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.