1. 程式人生 > >比特幣地址生成過程以及如何判斷一個比特幣地址是否有效

比特幣地址生成過程以及如何判斷一個比特幣地址是否有效

(一)比特幣地址生成過程

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值進行比較,如果一致則地址有效。