• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    go语言实战之实现比特币地址校验步骤

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

    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语言实现比特币交易功能(Transaction)
    下一篇:GO语言创建钱包并遍历钱包(wallet)的实现代码
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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