代码拉取完成,页面将自动刷新
同步操作将从 duke.du/blockchain_go_console 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package main
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"log"
"crypto/sha256"
"golang.org/x/crypto/ripemd160"
"./base58"
"bytes"
)
//定义一个秘钥对结构, KeyPair
type Wallet struct {
PrivateKey *ecdsa.PrivateKey
//PubKey ecdsa.PublicKey
PubKey []byte //为了传输方便,在对端可以还原
}
func NewWallet() *Wallet {
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
log.Panic(err)
}
pubKeyRaw := privateKey.PublicKey
//真正传递的形式
pubKey := append(pubKeyRaw.X.Bytes(), pubKeyRaw.Y.Bytes()...)
return &Wallet{PrivateKey: privateKey, PubKey: pubKey}
}
func (w *Wallet) GetAddress() string {
ripHashValue := HashPubKey(w.PubKey)
address := HashToAddress(ripHashValue)
return address
}
func HashToAddress(pubkeHash []byte) string {
version := byte(00)
payload := append([]byte{version}, pubkeHash...)
checkSum := checksum(payload)
payload = append(payload, checkSum...)
address := base58.Encode(payload)
return address
}
func AddressToHash(address string) []byte {
decodeInfo := base58.Decode(address)
pubkeyHash := decodeInfo[1:len(decodeInfo)-4]
return pubkeyHash
}
func IsValidAddress(address string) bool {
//1. 解码base58
decodeInfo := base58.Decode(address)
//2. 截取前21字节和 后四个字节
payload := decodeInfo[0: len(decodeInfo)-4]
checksum1 := decodeInfo[len(decodeInfo)-4:]
//3. 对前21字节进行checksum计算
firstHash := sha256.Sum256(payload)
secondHash := sha256.Sum256(firstHash[:])
checksum2 := secondHash[0:4]
//4. 比较生成cheksum1和截取cheksum2
return bytes.Equal(checksum1, checksum2)
}
func HashPubKey(pubkey []byte) []byte {
hash := sha256.Sum256(pubkey)
rip160Hasher := ripemd160.New()
_, err := rip160Hasher.Write(hash[:])
if err != nil {
log.Panic(err)
}
ripHashValue := rip160Hasher.Sum(nil)
return ripHashValue
}
func checksum(payload []byte) []byte {
firsHash := sha256.Sum256(payload)
sencondHash := sha256.Sum256(firsHash[:])
checkSum := sencondHash[0:4]
return checkSum
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。