Implement ValidateAddress
This commit is contained in:
parent
7290aaac64
commit
a436da6c19
|
@ -1,8 +1,14 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
func (cli *CLI) createBlockchain(address string) {
|
func (cli *CLI) createBlockchain(address string) {
|
||||||
|
if !ValidateAddress(address) {
|
||||||
|
log.Panic("ERROR: Address is not valid")
|
||||||
|
}
|
||||||
bc := CreateBlockchain(address)
|
bc := CreateBlockchain(address)
|
||||||
bc.db.Close()
|
bc.db.Close()
|
||||||
fmt.Println("Done!")
|
fmt.Println("Done!")
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
func (cli *CLI) getBalance(address string) {
|
func (cli *CLI) getBalance(address string) {
|
||||||
|
if !ValidateAddress(address) {
|
||||||
|
log.Panic("ERROR: Address is not valid")
|
||||||
|
}
|
||||||
bc := NewBlockchain(address)
|
bc := NewBlockchain(address)
|
||||||
defer bc.db.Close()
|
defer bc.db.Close()
|
||||||
|
|
||||||
|
|
12
cli_send.go
12
cli_send.go
|
@ -1,8 +1,18 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
func (cli *CLI) send(from, to string, amount int) {
|
func (cli *CLI) send(from, to string, amount int) {
|
||||||
|
if !ValidateAddress(from) {
|
||||||
|
log.Panic("ERROR: Sender address is not valid")
|
||||||
|
}
|
||||||
|
if !ValidateAddress(to) {
|
||||||
|
log.Panic("ERROR: Recipient address is not valid")
|
||||||
|
}
|
||||||
|
|
||||||
bc := NewBlockchain(from)
|
bc := NewBlockchain(from)
|
||||||
defer bc.db.Close()
|
defer bc.db.Close()
|
||||||
|
|
||||||
|
|
37
wallet.go
37
wallet.go
|
@ -1,6 +1,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"crypto/elliptic"
|
"crypto/elliptic"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
|
@ -12,6 +13,7 @@ import (
|
||||||
|
|
||||||
const version = byte(0x00)
|
const version = byte(0x00)
|
||||||
const walletFile = "wallet.dat"
|
const walletFile = "wallet.dat"
|
||||||
|
const addressChecksumLen = 4
|
||||||
|
|
||||||
// Wallet stores private and public keys
|
// Wallet stores private and public keys
|
||||||
type Wallet struct {
|
type Wallet struct {
|
||||||
|
@ -40,17 +42,6 @@ func (w Wallet) GetAddress() []byte {
|
||||||
return address
|
return address
|
||||||
}
|
}
|
||||||
|
|
||||||
func newKeyPair() (ecdsa.PrivateKey, []byte) {
|
|
||||||
curve := elliptic.P256()
|
|
||||||
private, err := ecdsa.GenerateKey(curve, rand.Reader)
|
|
||||||
if err != nil {
|
|
||||||
log.Panic(err)
|
|
||||||
}
|
|
||||||
pubKey := append(private.PublicKey.X.Bytes(), private.PublicKey.Y.Bytes()...)
|
|
||||||
|
|
||||||
return *private, pubKey
|
|
||||||
}
|
|
||||||
|
|
||||||
// HashPubKey hashes public key
|
// HashPubKey hashes public key
|
||||||
func HashPubKey(pubKey []byte) []byte {
|
func HashPubKey(pubKey []byte) []byte {
|
||||||
publicSHA256 := sha256.Sum256(pubKey)
|
publicSHA256 := sha256.Sum256(pubKey)
|
||||||
|
@ -65,10 +56,32 @@ func HashPubKey(pubKey []byte) []byte {
|
||||||
return publicRIPEMD160
|
return publicRIPEMD160
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ValidateAddress check if address if valid
|
||||||
|
func ValidateAddress(address string) bool {
|
||||||
|
pubKeyHash := Base58Decode([]byte(address))
|
||||||
|
actualChecksum := pubKeyHash[len(pubKeyHash)-addressChecksumLen:]
|
||||||
|
version := pubKeyHash[0]
|
||||||
|
pubKeyHash = pubKeyHash[1 : len(pubKeyHash)-addressChecksumLen]
|
||||||
|
targetChecksum := checksum(append([]byte{version}, pubKeyHash...))
|
||||||
|
|
||||||
|
return bytes.Compare(actualChecksum, targetChecksum) == 0
|
||||||
|
}
|
||||||
|
|
||||||
// Checksum generates a checksum for a public key
|
// Checksum generates a checksum for a public key
|
||||||
func checksum(payload []byte) []byte {
|
func checksum(payload []byte) []byte {
|
||||||
firstSHA := sha256.Sum256(payload)
|
firstSHA := sha256.Sum256(payload)
|
||||||
secondSHA := sha256.Sum256(firstSHA[:])
|
secondSHA := sha256.Sum256(firstSHA[:])
|
||||||
|
|
||||||
return secondSHA[:4]
|
return secondSHA[:addressChecksumLen]
|
||||||
|
}
|
||||||
|
|
||||||
|
func newKeyPair() (ecdsa.PrivateKey, []byte) {
|
||||||
|
curve := elliptic.P256()
|
||||||
|
private, err := ecdsa.GenerateKey(curve, rand.Reader)
|
||||||
|
if err != nil {
|
||||||
|
log.Panic(err)
|
||||||
|
}
|
||||||
|
pubKey := append(private.PublicKey.X.Bytes(), private.PublicKey.Y.Bytes()...)
|
||||||
|
|
||||||
|
return *private, pubKey
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue