gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 35 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章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 。

最后此篇关于go语言实战之实现比特币地址校验步骤的文章就讲到这里了,如果你想了解更多关于go语言实战之实现比特币地址校验步骤的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com