脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - go语言实战之实现比特币地址校验步骤

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

2021-06-26 01:44m0_37719047 Golang

这篇文章主要介绍了go语言实战之实现比特币地址校验步骤,利用生产的随机数采用椭圆加密算法生成公钥,具体步骤实例代码请参考下本文

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

 

  1. 随机取一个32位随机数作为私钥
  2. 利用生产的随机数采用椭圆加密算法生成公钥
  3. 计算公钥的sha256哈希值
  4. 计算RIPEMD-160哈希值
  5. 第4步结果加上版本号(比特币为0x00)
  6. 对第5步结果取两次sha256哈希值
  7. 取上一步结果的前四个字节
  8. 将第7步结果加到第步的结果后面作为校验
  9. 利用base58对第8步结果进行变化得到地址

生成地址代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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]
}

校验比特币

 

地址是否正确代码

?
1
2
3
4
5
6
7
8
9
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再次算出校验位与地址的校验位做出对比,即可验证地址的正确性。 其中用到的函数有:

?
1
2
3
4
5
6
7
func checksum(payload []byte) []  //利用两次shah256求校验位
 byte {
    firstSHA := sha256.Sum256(payload)
    secondSHA := sha256.Sum256(firstSHA[:])
 
    return secondSHA[:addressChecksumLen]
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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语言比特币地址校验的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/m0_37719047/article/details/81945896

延伸 · 阅读

精彩推荐
  • Golanggo语言制作端口扫描器

    go语言制作端口扫描器

    本文给大家分享的是使用go语言编写的TCP端口扫描器,可以选择IP范围,扫描的端口,以及多线程,有需要的小伙伴可以参考下。 ...

    脚本之家3642020-04-25
  • Golanggo日志系统logrus显示文件和行号的操作

    go日志系统logrus显示文件和行号的操作

    这篇文章主要介绍了go日志系统logrus显示文件和行号的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    SmallQinYan12302021-02-02
  • GolangGolang通脉之数据类型详情

    Golang通脉之数据类型详情

    这篇文章主要介绍了Golang通脉之数据类型,在编程语言中标识符就是定义的具有某种意义的词,比如变量名、常量名、函数名等等,Go语言中标识符允许由...

    4272021-11-24
  • Golanggolang json.Marshal 特殊html字符被转义的解决方法

    golang json.Marshal 特殊html字符被转义的解决方法

    今天小编就为大家分享一篇golang json.Marshal 特殊html字符被转义的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    李浩的life12792020-05-27
  • GolangGolang中Bit数组的实现方式

    Golang中Bit数组的实现方式

    这篇文章主要介绍了Golang中Bit数组的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    天易独尊11682021-06-09
  • Golanggolang如何使用struct的tag属性的详细介绍

    golang如何使用struct的tag属性的详细介绍

    这篇文章主要介绍了golang如何使用struct的tag属性的详细介绍,从例子说起,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看...

    Go语言中文网11352020-05-21
  • Golanggolang的httpserver优雅重启方法详解

    golang的httpserver优雅重启方法详解

    这篇文章主要给大家介绍了关于golang的httpserver优雅重启的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    helight2992020-05-14
  • Golanggolang 通过ssh代理连接mysql的操作

    golang 通过ssh代理连接mysql的操作

    这篇文章主要介绍了golang 通过ssh代理连接mysql的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    a165861639710342021-03-08