Copyright © 2022-2025 aizws.net · 网站版本: v1.2.6·内部版本: v1.25.2·
页面加载耗时 0.00 毫秒·物理内存 119.1MB ·虚拟内存 1372.1MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
比特币地址的组成: 【版本 + 公钥哈希 + 校验和】,长度为26位到34位。

package main
import (
"bytes"
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"crypto/sha256"
"log"
"fmt"
"golang.org/x/crypto/ripemd160"
"github.com/btcsuite/btcutil/base58"
)
const walletVersion = byte(0x00) // 钱包版本
const addressChecksumLen = 4 // 验证码长度
// 钱包
type Wallet struct {
PrivateKey ecdsa.PrivateKey
PublicKey []byte
}
// 初始化钱包
func NewWallet() *Wallet {
private, public := newKeyPair()
wallet := Wallet{private, public}
return &wallet
}
// 得到比特币地址
func (w Wallet) GetAddress() string {
// ripemd160(sha256(publickey))
pubKeyHash := HashPubKey(w.PublicKey)
// 最前面添加一个字节的版本信息
walletVersionedPayload := append([]byte{walletVersion}, pubKeyHash...)
// 获得 sha256(sha256(versionPublickeyHash)) 四个字节
checksum := checksum(walletVersionedPayload)
// 拼接 walletVersionedPayload + checksumHash
fullPayload := append(walletVersionedPayload, checksum...)
// 进行 base58 编码,生成可视化地址
address := base58.Encode(fullPayload)
// 比特币地址格式:【钱包版本 + 公钥哈希 + 验证码】
return address
}
// 得到公钥哈希
func HashPubKey(pubKey []byte) []byte {
publicSHA256 := sha256.Sum256(pubKey)
RIPEMD160Hasher := ripemd160.New()
_, err := RIPEMD160Hasher.Write(publicSHA256[:])
if err != nil {
log.Panic(err)
}
publicRIPEMD160 := RIPEMD160Hasher.Sum(nil)
return publicRIPEMD160
}
// 通过【钱包版本+公钥哈希】生成验证码
func checksum(payload []byte) []byte {
firstSHA := sha256.Sum256(payload)
secondSHA := sha256.Sum256(firstSHA[:])
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
}
// 验证比特币地址
func ValidateAddress(address string) bool {
pubKeyHash := base58.Decode(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
}
func main() {
wallet := NewWallet()
bitcoinAddress := wallet.GetAddress()
fmt.Println("比特币地址:", string(bitcoinAddress))
fmt.Printf("比特币地址是否有效:%v\n:", ValidateAddress(string(bitcoinAddress)))
}
椭圆曲线加密算法(Elliptic Curve Cryptography),简称 ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法。ECC 相比 RSA,ECC 优势是可以使用更短的密钥,来实现与 RSA 相 ...