比特幣地址生成過程以及如何判斷一個比特幣地址是否有效
(一)比特幣地址生成過程
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值進行比較,如果一致則地址有效。