Arce 发表于 2021-6-29 22:48:48

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

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

   
[*]随机取一个32位随机数作为私钥   
[*]利用生产的随机数采用椭圆加密算法生成公钥   
[*]计算公钥的sha256哈希值   
[*]计算RIPEMD-160哈希值   
[*]第4步结果加上版本号(比特币为0x00)   
[*]对第5步结果取两次sha256哈希值   
[*]取上一步结果的前四个字节   
[*]将第7步结果加到第步的结果后面作为校验   
[*]利用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
    version := pubKeyHash
    pubKeyHash = pubKeyHash
    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
    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语言比特币地址校验的资料请关注脚本之家其它相关文章!

页: [1]
查看完整版本: go语言实战之实现比特币地址校验步骤