-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
9bf7dfa
commit c3daf31
Showing
12 changed files
with
301 additions
and
189 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.