一文講透比特幣地址

比特幣地址格式有哪幾種?

1 開頭的地址,也是最原始的地址(Legacy),稱之為普通的BTC地址,至今仍在使用。也稱為 P2PKH(pay-to-public-key-hash) 地址,P2PKH 是 Pay To PubKey Hash(付款至公鑰哈希)的縮寫。

3開頭的地址,是隔離見證地址,也稱為兼容隔離見證(Nested P2SH)。P2SH 是Pay To Script Hash(支付至腳本哈希)的縮寫。它是由隔離見證的腳本使用 P2SH 的方式打包而成的,舊節點也能識別的地址類型,以此來兼容老版本。

bc1開頭的地址,也是隔離見證地址,也稱為原生隔離見證(Native SegWit) 地址格式。是由完全新的隔離見證的腳本而生成的地址(P2WPKH 或 P2WSH),這類地址才是純正的隔離見證地址,而且能比前兩類地址有更多的優勢:沒有大小寫,生成的二維碼面積更小,可以錯誤糾正(但不推薦使用)等。這類地址也會被稱為Bech32格式。

同一個BTC私鑰雖然對應著3個不同的BTC地址,但是這3個地址都是正常地址,都是可以使用的。

3個地址的"餘額"是彼此獨立的,假如分別向這3個地址轉賬1BTC,每個地址的"餘額"也分別顯示1BTC,而不是3BTC。

實際上BTC地址沒有餘額的概念,只有UTXO(unspent transaction output),比特幣規定每一筆新的交易的輸入必須是某筆交易未花費的輸出。

比特幣地址長度是多少?

1開頭的比特幣地址,長度26位到34位。

3開頭的比特幣地址,34位。

絕大多數的比特幣地址長度是34位。

比特幣地址的生成過程是:私鑰==>公鑰==>Hash160<==>地址,有一個公式可以表達比特幣地址生成:

Address = base58([version] + [hash160(SHA-256(public key))] + [checksum])

比特幣私鑰本質上是一個32字節(256位)的隨機數,1個字節等於8位二進制,一個二進制只有兩個值0或者1,32字節就是由256個0或者1組成的原始隨機數,如果顯示出來,不僅僅是識別率不高,而且私鑰太長。因此私鑰字符串就需要對原始的隨機數進行一定的轉換,轉換為識別率高的形式,例如比特幣就是做Base58的轉換。

Base58是用於比特幣中使用的一種獨特的編碼方式,主要用於產生比特幣的錢包地址和私鑰。相比Base64,Base58不使用數字"0",字母大寫"O",字母大寫"I",和字母小寫"l",以及"+"和"/"符號。這樣做的主要原因是為了肉眼容易識別,在輸入的時候不容易出錯。

比特幣地址生成的流程如下:

1、使用橢圓曲線加密算法(ECDSA-SECP256k1)計算私鑰所對應的非壓縮公鑰(共65字節,1字節0x04,32字節為x座標,32字節為y座標)。

2、計算公鑰的SHA-256哈希值。

sha-256-hash= SHA-256(public key)

3、計算上一步哈希值的RIPEMD-160哈希值。

hash160=hash160(sha-256-hash)

RIPEMD(PACE integrity Primitives Evaluation Message Digest)是一種原始完整性校驗消息摘要,160標準對應20字節。

4、在上一步結果之前加入地址版本號(如比特幣主網版本號"0x00")。

進行hash160處理後得到一個20字節(160位)的數,在這個20字節的數前面再加上一個地址的版本信息,長度為一個字節。

5、對上一步結果做兩次SHA-256哈希值計算。

SHA-256(SHA-256(version+hash160))

6、取上一步結果的前4個字節(8位十六進制數),把這4個字節加在第五步結果的後面,作為校驗checksum(這就是比特幣地址的16進制形態)。

checksum=get_front_four( SHA-256(SHA-256(version+hash160)))

6、生成比特幣地址。

有了版本前綴(1位),Hash160值(20位)以及checksum值,進而就可以生成Base58格式的比特幣地址。而從Base58格式的地址中也可以得到hash160,也就是說hash160格式可以和Base58格式的地址互換。

比特幣地址長度不一樣是因為base58編碼格式與十六進制格式轉換結果位數不確定導致的。

如何驗證比特幣地址是否合法?

知道了生成流程,就好實現校驗方法了。

第一步,先把地址base58解碼成字節數組,然後把數組分成兩個字節數組A和B。A是後4字節數組,B是減去後4字節的數組,然後把字節數組B做兩次Sha256Hash,然後取其前4位,跟字節數組A比較,是相同的,就校驗通過。

第二步,把第一步校驗通過的解碼字節數組取第一個字節&0xff,得到版本號,然後檢驗版本號的合法性。


分享到:


相關文章: