diff --git a/blockchain/transaction.go b/blockchain/transaction.go index f6e4cc9..cfaad61 100644 --- a/blockchain/transaction.go +++ b/blockchain/transaction.go @@ -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 @@ -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. -} diff --git a/blockchain/tx.go b/blockchain/tx.go new file mode 100644 index 0000000..936a477 --- /dev/null +++ b/blockchain/tx.go @@ -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. +} diff --git a/cli/cli.go b/cli/cli.go new file mode 100644 index 0000000..6fefbe2 --- /dev/null +++ b/cli/cli.go @@ -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 + } +} diff --git a/go.mod b/go.mod index 2c9faa0..56981ed 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index 25900bb..196695c 100644 --- a/go.sum +++ b/go.sum @@ -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= @@ -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= diff --git a/main.go b/main.go index 0c498ef..dfbb1bd 100644 --- a/main.go +++ b/main.go @@ -1,162 +1,15 @@ package main import ( - "flag" - "fmt" - "github.com/SadikSunbul/GO-BlockChain-Simulation/blockchain" - "log" + "github.com/SadikSunbul/GO-BlockChain-Simulation/wallet" "os" - "runtime" ) func main() { - defer os.Exit(0) // programı sonlandırır - cli := CommandLine{} // Komut satırı işlemleri için kullanılan yapıyı temsil eder. - cli.run() // Komut satırı işlemlerini başlatır -} - -// 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() - } + defer os.Exit(0) // programı sonlandırır + //cli := cli.CommandLine{} // Komut satırı işlemleri için kullanılan yapıyı temsil eder. + //cli.Run() // Komut satırı işlemlerini başlatır - cli.send(*sendFrom, *sendTo, *sendAmount) // send komutunu çalıştır - } + w := wallet.MakeWallet() + w.Address() } diff --git a/tmp/blocks/000000.vlog b/tmp/blocks/000000.vlog index 135cfaa..5ff9180 100644 Binary files a/tmp/blocks/000000.vlog and b/tmp/blocks/000000.vlog differ diff --git a/tmp/blocks/000004.sst b/tmp/blocks/000004.sst deleted file mode 100644 index b12f82f..0000000 Binary files a/tmp/blocks/000004.sst and /dev/null differ diff --git a/tmp/blocks/000006.sst b/tmp/blocks/000006.sst new file mode 100644 index 0000000..6cb8b88 Binary files /dev/null and b/tmp/blocks/000006.sst differ diff --git a/tmp/blocks/MANIFEST b/tmp/blocks/MANIFEST index 35e15ad..3d18859 100644 Binary files a/tmp/blocks/MANIFEST and b/tmp/blocks/MANIFEST differ diff --git a/wallet/utils.go b/wallet/utils.go new file mode 100644 index 0000000..9632daa --- /dev/null +++ b/wallet/utils.go @@ -0,0 +1,23 @@ +package wallet + +import ( + "github.com/mr-tron/base58" + "log" +) + +// Base58 fonksiyonu, verilen byte dizisini base58 koduna doğru dönüştürür +func Base58Encode(input []byte) []byte { + encode := base58.Encode(input) // Byte dizisini base58 koduna dönüştürür + return []byte(encode) // Dönüştürülen kodu byte dizisine dönüştürür +} + +// Base58Decode fonksiyonu, verilen base58 kodunu byte dizisine dönüştürür +func Base58Decode(input []byte) []byte { + decode, err := base58.Decode(string(input)) // base58 kodunu byte dizisine dönüştürür + if err != nil { + log.Panic(err) + } + return decode +} + +// 0 o l I + / bunlar sıfrelerde yoktur diff --git a/wallet/wallet.go b/wallet/wallet.go new file mode 100644 index 0000000..480317f --- /dev/null +++ b/wallet/wallet.go @@ -0,0 +1,72 @@ +package wallet + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/sha256" + "fmt" + "golang.org/x/crypto/ripemd160" + "log" +) + +const ( + chechksumLength = 4 + version = byte(0x00) // 0 ın 16 lık gosterımıdır +) + +type Wallet struct { + PrivateKey ecdsa.PrivateKey //eliptik eğrisi ile private key + PublickKey []byte +} + +func NewKeyPair() (ecdsa.PrivateKey, []byte) { + curve := elliptic.P256() //kullanıcagımız eliptik tipi burdakı sıfreler 256 byte olur + + private, err := ecdsa.GenerateKey(curve, rand.Reader) //rastgele sayı uretıcısı ıle bırlıkte uratebılrrıız artık + if err != nil { + log.Panic(err) + } + pubKey := append(private.PublicKey.X.Bytes(), private.PublicKey.Y.Bytes()...) //public key olusturulur + return *private, pubKey +} + +// MakeWallet fonksiyonu, bir Wallet nesnesi olusturur +func MakeWallet() *Wallet { + private, public := NewKeyPair() // private ve public key olusturulur + wallet := Wallet{private, public} // wallet nesnesi olusturulur + return &wallet +} + +// PublicKeyHash fonksiyonu, bir public key hash kodu olusturur +func PublicKeyHash(pubKey []byte) []byte { + pubHash := sha256.Sum256(pubKey) // public key hash kodu olusturulur + hasher := ripemd160.New() // hasher nesnesi olusturulur + _, err := hasher.Write(pubHash[:]) // public key hash kodu yazılır + if err != nil { + log.Panic(err) + } + pubicRipMD := hasher.Sum(nil) // public key hash kodu olusturulur + return pubicRipMD +} + +// Checksum fonksiyonu, bir checksum kodu olusturur +func Checksum(payload []byte) []byte { + firstHash := sha256.Sum256(payload) // payload hash kodu olusturulur + secondHash := sha256.Sum256(firstHash[:]) // firstHash hash kodu olusturulur + return secondHash[:chechksumLength] // checksum kodu olusturulur +} + +// Address fonksiyonu, bir adres olusturur +func (w Wallet) Address() []byte { + pubHash := PublicKeyHash(w.PublickKey) // public key hash kodu olusturulur + versionedHash := append([]byte{version}, pubHash...) // version ve public key hash kodu birleştirilir + checksum := Checksum(versionedHash) // checksum kodu olusturulur + fullHash := append(versionedHash, checksum...) // versionedHash ve checksum kodu birleştirilir + address := Base58Encode(fullHash) // adres olusturulur + fmt.Printf("pub key: %x\n", w.PublickKey) + fmt.Printf("pub has: %x\n", pubHash) + fmt.Printf("address: %x\n", address) + + return address +}