主页 > 知识库 > go语言实战之实现比特币地址校验步骤

go语言实战之实现比特币地址校验步骤

热门标签:AI电销 网站排名优化 百度竞价排名 呼叫中心市场需求 Linux服务器 服务外包 铁路电话系统 地方门户网站

由公钥生成比特币地址步骤

  1. 随机取一个32位随机数作为私钥
  2. 利用生产的随机数采用椭圆加密算法生成公钥
  3. 计算公钥的sha256哈希值
  4. 计算RIPEMD-160哈希值
  5. 第4步结果加上版本号(比特币为0x00)
  6. 对第5步结果取两次sha256哈希值
  7. 取上一步结果的前四个字节
  8. 将第7步结果加到第步的结果后面作为校验
  9. 利用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语言实战之实现比特币地址校验步骤的详细内容,更多关于go语言比特币地址校验的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
  • golang gin框架获取参数的操作
  • golang gin 框架 异步同步 goroutine 并发操作
  • go语言 xorm框架 postgresql 的用法及详细注解
  • goland 搭建 gin 框架的步骤详解
  • GO语言gin框架实现管理员认证登陆接口
  • Go语言框架Beego项目搭建的方法步骤
  • Go语言快速入门图文教程
  • 详解Go语言微服务开发框架之Go chassis

标签:湘潭 衡水 崇左 黄山 湖南 兰州 铜川 仙桃

巨人网络通讯声明:本文标题《go语言实战之实现比特币地址校验步骤》,本文关键词  ;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 收缩
    • 微信客服
    • 微信二维码
    • 电话咨询

    • 400-1100-266