阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

go语言实战之实现比特币地址校验教程

83次阅读
没有评论

共计 1978 个字符,预计需要花费 5 分钟才能阅读完成。

导读 这篇文章主要介绍了 go 语言实战之实现比特币地址校验步骤,利用生产的随机数采用椭圆加密算法生成公钥,具体步骤实例代码请参考下本文
由公钥生成比特币地址步骤
  • 随机取一个 32 位随机数作为私钥
  • 利用生产的随机数采用椭圆加密算法生成公钥
  • 计算公钥的 sha256 哈希值
  • 计算 RIPEMD-160 哈希值
  • 第 4 步结果加上版本号(比特币为 0x00)
  • 对第 5 步结果取两次 sha256 哈希值
  • 取上一步结果的前四个字节
  • 将第 7 步结果加到第步的结果后面作为校验
  • 利用 base58 对第 8 步结果进行变化得到地址
生成地址代码如下
func (w Wallet) GetAddress() []byte {pubKeyHash := HashPubKey(w.PublicKey)
 
    versionedPayload := append([]byte{version}, pubKeyHash...)
    checksum := checksum(versionedPayload)
 
    fullPayload := append(versionedPayload, checksum...)
    address := Base58Encode(fullPayload)
 
    return address
}
func HashPubKey(pubKey []byte) []byte {publicSHA256 := sha256.Sum256(pubKey)
 
    RIPEMD160Hasher := ripemd160.New()
    _, err := RIPEMD160Hasher.Write(publicSHA256[:])
    publicRIPEMD160 := RIPEMD160Hasher.Sum(nil)
 
    return publicRIPEMD160
}
 
func checksum(payload []byte) []byte {firstSHA := sha256.Sum256(payload)
    secondSHA := sha256.Sum256(firstSHA[:])
 
    return secondSHA[:addressChecksumLen]
}
校验比特币

地址是否正确代码

addressChecksumLen:=4
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
}

Base58Decode 是对比特币地址进行解码,然后取后四位校验位 actualChecksum,利用去掉校验位的 pubKeyHash 再次算出校验位与地址的校验位做出对比,即可验证地址的正确性。其中用到的函数有:

func checksum(payload []byte) []  // 利用两次 shah256 求校验位
 byte {firstSHA := sha256.Sum256(payload)
    secondSHA := sha256.Sum256(firstSHA[:])
 
    return secondSHA[:addressChecksumLen]
}

这是解码的函数,已经有不少现有的代码支持,故不作讲解

func Base58Decode(input []byte) []byte {result := big.NewInt(0)
    zeroBytes := 0
 
    for b := range input {
        if b == 0x00 {zeroBytes++}
    }
 
    payload := input[zeroBytes:]
    for _, b := range payload {charIndex := bytes.IndexByte(b58Alphabet, b)
        result.Mul(result, big.NewInt(58))
        result.Add(result, big.NewInt(int64(charIndex)))
    }
 
    decoded := result.Bytes()
    decoded = append(bytes.Repeat([]byte{byte(0x00)}, zeroBytes), decoded...)
 
    return decoded
}

以上就是 go 语言实战之实现比特币地址校验步骤的详细内容

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1978字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中