比特币地址生成过程以及如何判断一个比特币地址是否有效

(一)比特币地址生成过程

1.由私钥通过椭圆曲线加密算法生成公钥,公钥实际就是一串字节数组。私钥是由一个随机产生的数字串经过哈希的十六进制字符串。

2.有了公钥以后,通过下图步骤生成比特币地址:

比特币地址生成过程以及如何判断一个比特币地址是否有效

具体过程:

1.将公钥进行256哈希,再进行160哈希,生成一个20个字节的哈希

RIPEMD160(SHA256(Pubkey))->20个字节Public key hash

2.在20个字节的Public key hash前加上1个字节的版本号,生成21个字节的值

version{0}+RIPEMD160(SHA256(Pubkey))->21个字节值

3.再将这21个字节的值进行两次256哈希运算,生成32个字节的哈希值,取前四位,得出

Checksum值

SHA256(SHA256(21个字节值))->32字节hash->取前4位字节(Checksum)

4.将1个字节的版本号,20个字节Public key hash,四个字节的Checksum相加,一共25个字节

Version+Public key hash+Checksum->25个字节的数

5.将第四步25个字节的数进行Base58编码,就生成了固定长度的比特币地址

 

二.如何判断一个比特币地址是否有效

func IsValidForAdress(adress []byte) bool {

version_public_checksumBytes := Base58Decode(adress)

checkSumBytes := version_public_checksumBytes[len(version_public_checksumBytes) - addressChecksumLen:]

version_ripemd160 := version_public_checksumBytes[:len(version_public_checksumBytes) - addressChecksumLen]

checkBytes := CheckSum(version_ripemd160)

if bytes.Compare(checkSumBytes,checkBytes) == 0 {

return true

}

return false

}

说明:1.将地址进行Base反编码,得到一个version+public+checksum的字节数组

           2.取version+public+checksum的字节数组的后4个字节为checksum值

           3.取version+public+checksum的字节数组的前21个字节进行两次256哈希运算,取结果值的前4个字节,与第二步中的checksum值进行比较,如果一致则地址有效。