代码拉取完成,页面将自动刷新
同步操作将从 duke.du/go_bitcoin_example 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package main
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"log"
"crypto/sha256"
//"golang.org/x/crypto/ripemd160"
"./lib/ripemd160"
//"github.com/btcsuite/btcutil/base58"
"./lib/base58"
"fmt"
"bytes"
)
//这里的钱包时一结构,每一个钱包保存了公钥,私钥对
type Wallet struct {
//私钥
Private *ecdsa.PrivateKey
//PubKey *ecdsa.PublicKey
//约定,这里的PubKey不存储原始的公钥,而是存储X和Y拼接的字符串,在校验端重新拆分(参考r,s传递)
PubKey []byte //
}
//创建钱包
func NewWallet() *Wallet {
//创建曲线
curve := elliptic.P256()
//生成私钥
privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)
if err != nil {
log.Panic()
}
//生成公钥
pubKeyOrig := privateKey.PublicKey
//拼接X, Y
pubKey := append(pubKeyOrig.X.Bytes(), pubKeyOrig.Y.Bytes()...)
return &Wallet{Private: privateKey, PubKey: pubKey}
}
//生成地址
func (w *Wallet) NewAddress() string {
pubKey := w.PubKey
rip160HashValue := HashPubKey(pubKey)
version := byte(00)
//拼接version
payload := append([]byte{version}, rip160HashValue...)
//checksum
checkCode := CheckSum(payload)
//25字节数据
payload = append(payload, checkCode...)
//go语言有一个库,叫做btcd,这个是go语言实现的比特币全节点源码
address := base58.Encode(payload)
return address
}
func HashPubKey(data []byte) []byte {
hash := sha256.Sum256(data)
//理解为编码器
rip160hasher := ripemd160.New()
_, err := rip160hasher.Write(hash[:])
if err != nil {
log.Panic(err)
}
//返回rip160的哈希结果
rip160HashValue := rip160hasher.Sum(nil)
return rip160HashValue
}
func CheckSum(data []byte) []byte {
//两次sha256
hash1 := sha256.Sum256(data)
hash2 := sha256.Sum256(hash1[:])
//前4字节校验码
checkCode := hash2[:4]
return checkCode
}
func IsValidAddress(address string) bool {
//1. 解码
addressByte := base58.Decode(address)
if len(addressByte) < 4 {
return false
}
//2. 取数据
payload := addressByte[:len(addressByte)-4]
checksum1 := addressByte[len(addressByte)-4: ]
//3. 做checksum函数
checksum2 := CheckSum(payload)
fmt.Printf("checksum1 : %x\n", checksum1)
fmt.Printf("checksum2 : %x\n", checksum2)
//4. 比较
return bytes.Equal(checksum1, checksum2)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。