細說 | 比特幣地址

通過這篇文章,您將知道比特幣的地址的形式是什麼,比特幣地址的生成過程,以及比特幣地址的類型和種類。

全文的結構如下:

全文結構

1.簡單介紹

比特幣地址是一個有數字和字母組成的字元串,可以與任何想給你比特幣的人分享。由公鑰生成的比特幣地址是以數字「1」開頭。下面就是一個比特幣地址的例子:

1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

在介紹比特幣的時候,我們可以用支票來類比。在現實生活中,支票(check) 是銀行存款戶對銀行簽發的要求於見票時對收款人或持票人無條件支付一定金額的票據。也就是說,銀行只要見到支票,就會無條件的把錢轉到支票對應的賬戶地址上。支票的形式如下:

銀行轉賬支票

在一張支票中,收款人可能是某個銀行賬戶,也可能是某個公司,機構,甚至可能是另一個現金支票。支票不需要指定一個特定的賬戶,而是用一個抽象的名字作為收款人,這使它成為一種相當靈活的支付工具。

與此類似,比特幣地址使用類似的抽象。在比特幣交易中,比特幣地址通常以收款方出現。如果把比特幣交易比作一張支票,則比特幣地址就是收款人。

2.數字指紋

在比特幣交易的支付環節,收件人的公鑰是通過其數字指紋代表的,稱為比特幣地址,就像支票上的支付對象的名字 (即「收款方」)。一般情況下,比特幣地址由一個公鑰生成並對應於這個公鑰。然而,並非所有比特幣地址都是公鑰來生成的; 他們也可以代表其他支付對象,譬如腳本,關於這一點,將在後文中介紹。那麼,既然比特幣地址是收件人的公鑰通過數字指紋代表的,那麼什麼是數字指紋呢?

數字指紋是指將不同的標誌性識別代碼——指紋,利用數字水印技術嵌入到數字媒體中,然後將嵌入了指紋的數字媒體分發給用戶,是與用戶和某次購買過程有關的信息。數字指紋,其基本原理是利用單向散列函數對發送信息進行運算,生成一串固定長度的數字摘要。數字指紋並不是一種加密機制,但可以用來判斷數據有沒有被竄改,從而保證了信息的完整性不被破壞。

3.地址的生成過程

比特幣的地址是從公鑰生成比特幣地址的,簡單來講,將地址是經過公鑰進行兩次哈希運算,然後再通過最終的Base58Check編碼來實現。具體流程如下圖所示:

比特幣地址生成過程

介紹SHA256,首先要介紹SHA-2。SHA-2的全稱是安全散列演算法2(英語:Secure Hash Algorithm 2),是一種密碼散列函數演算法標準。SHA-2下面又分為六個不同的演算法標準,包括了SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。所以說,SHA256是一種密碼散列函數。

RIPEMD (RACE原始完整性校驗訊息摘要)是一種加密哈希函數。 RIPEMD-160是以原始版RIPEMD所改進的160位元版本,而且是RIPEMD系列中最常見的版本。 RIPEMD-160是設計給學術社群所使用的。由於沒有任何專利的限制,使得RIPEMD-160成為被比特幣網路選中的原因之一。

綜上所述,比特幣的地址就是由公鑰先經過單向哈希演算法SHA256計算,再進行RIPEMD160哈希計算,最後通過Base58Check編碼來得到的。總結起來,就是來自公鑰兩次哈希一次編碼

4.地址的解碼和編碼機制

為了更簡潔方便地表示長串的數字,使用更少的符號,許多計算機系統會使用一種以數字和字母組成的大於十進位的表示法。例如,傳統的十進位計數系統使用0-9十個數字,而十六進位系統使用了額外的 A-F 六個字母。一個同樣的數字,它的十六進位表 示就會比十進位表示更短。

Base58 是一種基於文本的二進位編碼格式,用在比特幣和其它的加密貨幣中。這種編碼格式不僅實現了數據壓縮,保持了易讀性,還具有錯誤診斷功能。Base58是使用大小寫字母和10個數字,但捨棄了一些容易錯 讀和在特定字體中容易混淆的字元。具體地,Base58不含數字0、大寫字母O、小寫字母 L、大寫字母I,以及「+」和「/」兩個字元。簡而言之,Base58就是由不包括(0,O,l,I)的大小寫字母和數字組成。比特幣的Base58字母表

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

Base58Check是一種常用在比特幣中的Base58編碼格式,是一種檢錯碼,目的是為了防增加止列印和轉錄錯誤的安全性。這種編碼演算法在編碼數據的末端添加四個位元組大小的校驗和,用來檢測並避免轉錄和輸入中產生的錯誤。

為了將數據轉換成Base58Check格式,我們要對數據添加一個稱為「版本位元組」的前綴,用這個前綴來識別編碼的數據的類型。例如,比特幣地址的前綴是0(對應的十六進位是0x00),而對私鑰編碼時前綴是128(十六進位是0x80)。下表列出了一下常見版本的前綴。

Base58Check編碼常見前綴

了解了為什麼要添加前綴,接下來,我們來看看Base58Check編碼的過程。

Base58Check編碼過程

第一步:添加前綴n 添加前綴是為了將數據(數字)轉換成Base58Check格式。n第二步:兩次哈希n 我們要計算「雙哈希」校驗和,這也就意味著要對之前的結果(前綴和數據)運行兩次哈希演算法:n checksum = SHA256(SHA256(prefix+data))n第三步:添加校驗碼n 在產生的長32個位元組的哈希值(兩次哈希運算)中,我們只取前4個位元組。n 這4個位元組就作為檢驗錯誤的代碼或者校驗和。校驗碼會添加到數據之後。n第四步:使用Base-58編碼n

在比特幣中,大多數需要向用戶展示的數據都使用了Base58Check編碼,可以實現數據壓縮,易讀而且有錯誤檢驗。而且,Base58Check編碼中的版本前綴是用來創造易於辨別的格式,在Base58里的格式在Base58Check編碼的有效載荷的開始包含了明確的屬性。這些屬性使用戶可以輕鬆明確被編碼的數據的類型以及如何使用它們。可謂是居家旅行,行走江湖之必備的編碼方式!

5.地址的種類

1.P2PKH 傳統比特幣地址

P2PKH(Pay-to-Public-Key), .正如我們所知,傳統的比特幣地址從數字1開頭,來源於公鑰,而公鑰來源於私鑰。雖然任何人都可以將比特幣發送到 一個1開頭的地址,但比特幣只能在通過相應的私鑰簽名和公鑰哈希值後才能消費。

2.P2SH地址

P2SH(pay-to-Script Hash),是一種以數字3開頭的比特幣地址。他們指定比特幣交易中受益者為哈希的腳本,而不是公鑰的所有者。不同於P2PKH交易發送資金到傳統1開頭的比特幣地址,資金被發送到3開頭的地址時,需要的不僅僅是一個公鑰的哈希值和一個私鑰簽名作為所有者證明。在創建地址的時候,這些要求會被指定在腳本中,所有對地址的輸入都被這些要求阻隔。

3. M-N 多重簽名地址

M-N(Multiple Signatures),多重簽名地址是目前P2SH函數中最常見的實現。意如其名,底層腳本需要多個簽名來證明所有權,此後才能消費資金。設計比特幣多重簽名特性是需要從總共N個密鑰中需要M個簽名,被稱為M-N多簽名,其中M小於等於N。

4.比特幣靚號地址

靚號地址是包含了人類可讀信息的有效比特幣地址。 例如,1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33就是包含了Base-58 字母love的。靚號地址需要生成並通過數十億的候選私鑰測試,直到一個私鑰能生成具有所需圖案的比特幣地址。該方法必須設計隨機選擇一個私鑰,生成公鑰,再生成比特幣地址。一旦找到一個所要圖案的靚號地址,來自該靚號地址的私鑰可以和其他地址相同的方式被擁有這消費比特幣。

參考資料

《精通比特幣》第二版第四章-密鑰和地址


推薦閱讀:

5 - 10年後,你認為最有可能取代比特幣的加密貨幣是哪一個?
PBFT協議在超過100個節點的時候性能會下降,能優化PBFT使其能支持更高量級(1000)的節點嗎?
什麼是比特幣的閃電網路?
你是如何理解比特幣及區塊鏈的?
如果升級BTS2.0至3.0,有哪些應該改進的地方?

TAG:比特币Bitcoin | 区块链Blockchain | 读书笔记 |