Skip to content

Commit

Permalink
wallet.go bir kısmı yazıldı
Browse files Browse the repository at this point in the history
  • Loading branch information
SadikSunbul committed Jun 19, 2024
1 parent 9bf7dfa commit c3daf31
Show file tree
Hide file tree
Showing 12 changed files with 301 additions and 189 deletions.
35 changes: 0 additions & 35 deletions blockchain/transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,6 @@ type Transaction struct {
Outputs []TxOutput //bu transectıondakı outputlar
}

type TxOutput struct { //transectıon cıktıları
Value int //token degeri
PubKey string //publıkkey sonra burası degısıcektır suan pubkey yerıne herhangıbır strıng deger kullanılıcak
}

type TxInput struct { //transectıon girdileri
ID []byte //cıkısı referans eder
Out int //cıkıs endexı referans eder
Sig string //gırıs verısıdir
}

func CoinbaseTx(to, data string) *Transaction {
if data == "" { //data boş ise gir
data = fmt.Sprintf("Coins to %s", to) //paralar to da der
Expand Down Expand Up @@ -104,27 +93,3 @@ func (tx *Transaction) IsCoinbase() bool {
// Bir coinbase işlemi sadece bir girişe sahiptir.
// Bu girişin işlem kimliği (ID) uzunluğu 0'a eşit olmalıdır ve çıkış (Out) -1 olmalıdır.
}

/*
CanUnlock metodunun görevi, bir işlem girişinin belirli bir veri ile kilidini açıp açamayacağını kontrol etmektir.
Genellikle işlem girişleri, işlemi imzalayan kişinin imzasını içerir. Bu metod, girişin imza alanının belirli bir
veri ile eşleşip eşleşmediğini kontrol eder. Eğer eşleşiyorsa, girişin doğru kişi tarafından yapıldığı doğrulanmış olur.
*/
func (in *TxInput) CanUnlock(data string) bool {
return in.Sig == data
// Bu fonksiyon, bir işlem girişinin belirli bir veri ile kilidini açıp açamayacağını kontrol eder.
// Girişin imza (Sig) alanı, verilen data değeri ile eşleşiyorsa true döner.
// Bu, girişin sahibinin işlemi imzalayan doğru kişi olduğunu doğrular.
}

/*
CanBeUnlocked metodunun amacı, bir işlem çıkışının belirli bir veri ile kilidini açıp açamayacağını kontrol etmektir.
Çıkış genellikle genel anahtar (public key) ile kilitlenmiştir ve bu metod, çıkışın belirli bir genel anahtar ile
eşleşip eşleşmediğini kontrol eder. Eğer eşleşiyorsa, çıkışın doğru kişiye ait olduğu doğrulanmış olur.
*/
func (out *TxOutput) CanBeUnlocked(data string) bool {
return out.PubKey == data
// Bu fonksiyon, bir işlem çıkışının belirli bir veri ile kilidini açıp açamayacağını kontrol eder.
// Çıkışın genel anahtarı (PubKey), verilen data değeri ile eşleşiyorsa true döner.
// Bu, çıkışın belirli bir kişiye ait olduğunu doğrular.
}
36 changes: 36 additions & 0 deletions blockchain/tx.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package blockchain

type TxOutput struct { //transectıon cıktıları
Value int //token degeri
PubKey string //publıkkey sonra burası degısıcektır suan pubkey yerıne herhangıbır strıng deger kullanılıcak
}

type TxInput struct { //transectıon girdileri
ID []byte //cıkısı referans eder
Out int //cıkıs endexı referans eder
Sig string //gırıs verısıdir
}

/*
CanUnlock metodunun görevi, bir işlem girişinin belirli bir veri ile kilidini açıp açamayacağını kontrol etmektir.
Genellikle işlem girişleri, işlemi imzalayan kişinin imzasını içerir. Bu metod, girişin imza alanının belirli bir
veri ile eşleşip eşleşmediğini kontrol eder. Eğer eşleşiyorsa, girişin doğru kişi tarafından yapıldığı doğrulanmış olur.
*/
func (in *TxInput) CanUnlock(data string) bool {
return in.Sig == data
// Bu fonksiyon, bir işlem girişinin belirli bir veri ile kilidini açıp açamayacağını kontrol eder.
// Girişin imza (Sig) alanı, verilen data değeri ile eşleşiyorsa true döner.
// Bu, girişin sahibinin işlemi imzalayan doğru kişi olduğunu doğrular.
}

/*
CanBeUnlocked metodunun amacı, bir işlem çıkışının belirli bir veri ile kilidini açıp açamayacağını kontrol etmektir.
Çıkış genellikle genel anahtar (public key) ile kilitlenmiştir ve bu metod, çıkışın belirli bir genel anahtar ile
eşleşip eşleşmediğini kontrol eder. Eğer eşleşiyorsa, çıkışın doğru kişiye ait olduğu doğrulanmış olur.
*/
func (out *TxOutput) CanBeUnlocked(data string) bool {
return out.PubKey == data
// Bu fonksiyon, bir işlem çıkışının belirli bir veri ile kilidini açıp açamayacağını kontrol eder.
// Çıkışın genel anahtarı (PubKey), verilen data değeri ile eşleşiyorsa true döner.
// Bu, çıkışın belirli bir kişiye ait olduğunu doğrular.
}
156 changes: 156 additions & 0 deletions cli/cli.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package cli

import (
"flag"
"fmt"
"github.com/SadikSunbul/GO-BlockChain-Simulation/blockchain"
"log"
"os"
"runtime"
)

// CommandLine struct, komut satırı işlemleri için kullanılan yapıyı temsil eder.
type CommandLine struct {
//blockchain *blockchain.BlockChain // blockchain adında bir BlockChain nesnesi
}

// PrintUsage fonksiyonu, komut satırında kullanıcıya kullanım talimatlarını gösterir.
func (cli *CommandLine) printUsage() {
fmt.Printf("Usage:\n")
fmt.Printf(" %-40s : %s\n", "getbalance -address ADDRESS", "Belirtilen adrese ait bakiyeyi görüntüler")
fmt.Printf(" %-40s : %s\n", "createblockchain -address ADDRESS", "Yeni bir blok zinciri oluşturur ve belirtilen adrese oluşum ödülünü gönderir")
fmt.Printf(" %-40s : %s\n", "printchain", "Blok zincirindeki tüm blokları yazdırır")
fmt.Printf(" %-40s : %s\n", "send -from FROM -to TO -amount AMOUNT", "Belirtilen miktarı belirtilen adresten diğer bir adrese gönderir")

}

// validateArgs fonksiyonu, komut satırı argümanlarını doğrular.
func (cli *CommandLine) validateArgs() {
// Eğer komut satırında argüman sayısı 2'den az ise (program adı dahil)
if len(os.Args) < 2 {
// Kullanım talimatlarını yazdır
cli.printUsage()
// Programın çalışmasını sonlandır ve kapat
runtime.Goexit()
}
}

func (cli *CommandLine) printChain() {
chain := blockchain.ContinueBlockChain("") // blockchain adında bir BlockChain nesnesi
defer chain.Database.Close() // blok zincirini kapat
iter := chain.Iterator() // blok zinciri iteratorunu olustur
fmt.Println()
for { // blok zinciri sonuna kadar döngü
block := iter.Next() // Sıradaki bloğu al

fmt.Printf(" %-10s : %x\n", "Prev. hash", block.PrevHash) // Blok zincirinden o bloğun önceki hash değerini yazdır
fmt.Printf(" %-10s : %x\n", "Hash", block.Hash) // Blok zincirinden o bloğun hash değerini yazdır

pow := blockchain.NewProof(block)
fmt.Printf(" %-10s : %v\n", "PoW", pow.Validate()) // Blok zincirinden o bloğun proof of work değerini yazdır
fmt.Println()

if len(block.PrevHash) == 0 {
break
}
}
}

func (cli *CommandLine) createBlockChain(address string) { // blockchain oluşturur
chain := blockchain.InitBlockChain(address) // blockchain adında bir BlockChain nesnesi
chain.Database.Close() // blok zincirini kapat
fmt.Println("Finished!")
}

func (cli *CommandLine) getBalance(address string) { // bakiye almak
chain := blockchain.ContinueBlockChain(address) // blockchain adında bir BlockChain nesnesi
defer chain.Database.Close() // blok zincirini kapat

balance := 0
UTXOs := chain.FindUTXO(address) // blok zincirinden o bloğun UTXO degerlerini al

for _, out := range UTXOs { // blok zincirinden o bloğun UTXO degerlerini döngürecek
balance += out.Value // blok zincirinden o bloğun UTXO degerlerinin toplamını al
}

fmt.Printf("Balance of %s: %d\n", address, balance)
}

func (cli *CommandLine) send(from, to string, amount int) { // para göndermek
chain := blockchain.ContinueBlockChain(from) // blockchain adında bir BlockChain nesnesi
defer chain.Database.Close() // blok zincirini kapat

tx := blockchain.NewTransaction(from, to, amount, chain) // Yeni bir işlem oluştur
chain.AddBlock([]*blockchain.Transaction{tx}) // blok zincirine ekler
fmt.Println("Success!")
}

func (cli *CommandLine) Run() { // komut satırı işlemleri
cli.validateArgs() // komut satırı argümanlarını dogrular

getBalanceCmd := flag.NewFlagSet("getbalance", flag.ExitOnError) // getbalance komutunu tanımla
createBlockchainCmd := flag.NewFlagSet("createblockchain", flag.ExitOnError) // createblockchain komutunu tanımla
sendCmd := flag.NewFlagSet("send", flag.ExitOnError) // send komutunu tanımla
printChainCmd := flag.NewFlagSet("printchain", flag.ExitOnError) // printchain komutunu tanımla

getBalanceAddress := getBalanceCmd.String("address", "", "Bakiye almanın adresi") // getbalance komutundaki adres bilgisini tanımla
createBlockchainAddress := createBlockchainCmd.String("address", "", "Genesis blok ödülünün gönderileceği adres") // createblockchain komutundaki adres bilgisini tanımla
sendFrom := sendCmd.String("from", "", "Kaynak cüzdan adresi") // send komutundaki kaynak adresini tanımla
sendTo := sendCmd.String("to", "", "Hedef cüzdan adresi") // send komutundaki hedef adresini tanımla
sendAmount := sendCmd.Int("amount", 0, "Gönderilecek tutar") // send komutundaki tutarı tanımla

switch os.Args[1] { // komut satırı argümanın hangi komut oldugunu bulur
case "getbalance": // getbalance komutunu çalıştır
err := getBalanceCmd.Parse(os.Args[2:]) // getbalance komutunu çalıştır
if err != nil {
log.Panic(err)
}
case "createblockchain":
err := createBlockchainCmd.Parse(os.Args[2:]) // createblockchain komutunu çalıştır
if err != nil {
log.Panic(err)
}
case "printchain":
err := printChainCmd.Parse(os.Args[2:]) // printchain komutunu çalıştır
if err != nil {
log.Panic(err)
}
case "send":
err := sendCmd.Parse(os.Args[2:]) // send komutunu çalıştır
if err != nil {
log.Panic(err)
}
default:
cli.printUsage() // komut satırı argümanlarını yazdır
runtime.Goexit() // programın çalışmasını sonlandır
}

if getBalanceCmd.Parsed() { // getbalance komutu parse edilirse
if *getBalanceAddress == "" { // getbalance komutundaki adres bilgisi bos ise
getBalanceCmd.Usage() // getbalance komutunu yazdır
runtime.Goexit()
}
cli.getBalance(*getBalanceAddress) // getbalance komutunu çalıştır
}

if createBlockchainCmd.Parsed() { // createblockchain komutu parse edilirse
if *createBlockchainAddress == "" { // createblockchain komutundaki adres bilgisi bos ise
createBlockchainCmd.Usage() // createblockchain komutunu yazdır
runtime.Goexit()
}
cli.createBlockChain(*createBlockchainAddress) // createblockchain komutunu çalıştır
}

if printChainCmd.Parsed() { // printchain komutu parse edilirse
cli.printChain() // printchain komutunu çalıştır
}

if sendCmd.Parsed() { // send komutu parse edilirse
if *sendFrom == "" || *sendTo == "" || *sendAmount <= 0 { // send komutundaki kaynak, hedef ve tutar bilgileri bos ise
sendCmd.Usage() // send komutunu yazdır
runtime.Goexit()
}

cli.send(*sendFrom, *sendTo, *sendAmount) // send komutunu çalıştır
}
}
6 changes: 5 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ module github.com/SadikSunbul/GO-BlockChain-Simulation

go 1.22.4

require github.com/dgraph-io/badger v1.6.2
require (
github.com/dgraph-io/badger v1.6.2
github.com/mr-tron/base58 v1.2.0
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
)

require (
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect
Expand Down
3 changes: 3 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
Expand All @@ -54,6 +56,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
Expand Down
Loading

0 comments on commit c3daf31

Please sign in to comment.