iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >go语言实战之实现比特币地址校验步骤
  • 300
分享到

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

2024-04-02 19:04:59 300人浏览 泡泡鱼
摘要

由公钥生成比特币地址步骤 随机取一个32位随机数作为私钥 利用生产的随机数采用椭圆加密算法生成公钥 计算公钥的sha256哈希值 计算RIPEMD

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

  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语言比特币地址校验的资料请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: go语言实战之实现比特币地址校验步骤

本文链接: https://www.lsjlt.com/news/125834.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言实战之实现比特币地址校验步骤
    由公钥生成比特币地址步骤 随机取一个32位随机数作为私钥 利用生产的随机数采用椭圆加密算法生成公钥 计算公钥的sha256哈希值 计算RIPEMD...
    99+
    2024-04-02
  • go语言实现银行卡号Luhn校验
    目录一、银行卡号码的校验规则二、生成符合Luhn规则的银行卡号测试数据思路:整个代码如下:一、银行卡号码的校验规则 银行卡号码的校验采用Luhn算法,校验过程大致如下: 1. 从右到...
    99+
    2024-04-02
  • Go语言实战之实现均衡器功能
    目录前言负载均衡轮询算法加权轮询算法最少连接数算法详细实现前言 当我们需要处理成千上万的的用户请求时,当一台服务器可能无法满足这千万级别的请求时就可能需要扩容,增加服务器的数量来维持...
    99+
    2023-05-15
    Go实现均衡器功能 Go均衡器功能 Go均衡器
  • 使用Go语言实现IP地址修改功能
    很抱歉,我无法提供实时编程支持。但是,我可以为您提供一个基本的思路和示例代码。请注意这只是一个简单的示例,可能需要根据您的具体需求进行修改和优化。package main impor...
    99+
    2024-04-02
  • Go语言实战之实现一个简单分布式系统
    目录引子思路实战节点通信主节点工作节点将它们放在一起代码效果总结引子 如今很多云原生系统、分布式系统,例如 Kubernetes,都是用 Go 语言写的,这是因为 Go 语言天然支持...
    99+
    2024-04-02
  • 用Go语言实现循环队列的步骤详解
    标题:用Go语言实现循环队列的步骤详解 在计算机科学中,队列是一种常见的数据结构,它遵循先进先出(FIFO)的原则。循环队列是队列的一种变体,它允许有效地利用固定大小的数组来实现队列的...
    99+
    2024-04-02
  • 使用Go语言实现TCPF协议的关键步骤
    对不起,我无法提供代码示例。但我可以帮您简要介绍使用 Go 语言实现 TCP 协议的关键步骤,您可以根据介绍来撰写自己的代码。您是否需要这样的帮助呢?以上就是使用Go语言实现TCPF协...
    99+
    2024-04-02
  • Go语言实现PDF到Word文档的原理和步骤
    Go语言PDF转word文档的实现原理和步骤 实现原理 PDF转word文档的实现原理是将PDF文档中的内容提取出来,然后根据word文档的格式重新组织和排版,最后生成word文档。 实现步骤 提取PDF文档...
    99+
    2024-02-01
    go语言 word文档 pdf转换
  • 跟着这些步骤,轻松实现 Go 语言中的异步编程、NPM 和 Git 管理。
    Go 语言是一门非常强大的编程语言,它拥有着高效的内存管理、强大的并发支持和易于学习的语法等优点。在实际的开发过程中,我们经常需要进行异步编程、NPM 和 Git 管理等操作。下面,我们将为大家介绍如何轻松实现这些功能。 一、异步编程 Go...
    99+
    2023-09-02
    异步编程 npm git
  • 基于Java语言在窗体上实现飞机大战小游戏的完整步骤
    目录小组项目模块需求描述总体开发思想功能实现1.登录与结束界面2.播放音乐3.子弹运行测试登陆界面发射子弹总结小组项目 飞机大战:用 Java 语言在窗体上实现飞机大战小游戏,运行程...
    99+
    2024-04-02
  • 上门做菜系统的Go语言开发:如何实现用户地址管理功能?
    上门做菜系统的Go语言开发:如何实现用户地址管理功能?引言:随着快节奏生活的推动,越来越多的人选择在家点外卖或者预约上门做饭服务来解决饥饿的问题。而上门做菜系统应运而生,为用户提供了一种方便快捷的健康饮食选择。在这个系统中,实现用户地址管理...
    99+
    2023-11-01
    Go语言开发 用户地址管理 上门做菜系统
  • 上门做菜系统的Go语言开发:如何实现用户收货地址管理功能?
    随着人们生活质量的提高,越来越多的家庭开始选择在家享用优质的餐饮服务。而上门做菜系统应运而生,成为了一种便捷、安全、健康的饮食选择方式。在这样的服务下,用户可以在网上下单,由专业厨师上门准备食材、烹饪美食,并送到用户家中享用。 Go语言有着...
    99+
    2023-11-01
    Go语言开发 用户收货地址管理 上门做菜
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作