【區塊鏈開發指南】區塊鏈基礎之比特幣地址


比特幣地址是一個由數字和字母組成的字符串,並且由公鑰經過Hash函數生成。通常我們見到的比特幣地址是經過Base58Check編碼的,這種編碼使用了58個字符和校驗碼,提高了可讀性、避免了歧義,並能有效防止地址輸入時產生的錯誤。

Base58編碼

base58和base64一樣是一種二進制轉可視字符串的算法,主要用來轉換大整數值。區別是,轉換出來的字符串,去除了幾個看起來會產生歧義的字符,如 0 (零), O (大寫字母O), I (大寫的字母i) and l (小寫的字母L) ,和幾個影響雙擊選擇的字符,如/, +。結果字符集正好58個字符(包括9個數字,24個大寫字母,25個小寫字母)。

在比特幣的實現中,Base58Check編碼位於src\base58.cpp中,定義的所有字符如下:

/** All alphanumeric characters except for "0", "I", "O", and "l" */
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";

比特幣地址生成流程

上圖清楚的展示了如何將橢圓曲線(ECC)公鑰轉換成比特幣地址,首先我們知道ECC公鑰是指坐標上的一個點(x,y)橫縱坐標分別用32字節表示,也就是256位。然后每個步驟最前面的“1”表示1個字節,用來代表不同的網絡。最后就是兩種哈希函數,sha256ripemd160,我們從它們名稱結尾的數字就可以判斷它們輸出的比特位數,最后通過組合得出最到的比特幣地址。

那么一個直接的問題就是,為什么地址生成的流程要這么復雜呢?

個人認為,這種設計是為了防御量子計算機的攻擊,為了使比特幣系統更加安全。我們知道,如果量子計算機被成功的建造了出來,那么現存的幾乎所有的公鑰密碼系統都將被攻破,無論是基於大整數分解還是離散對數,亦或是橢圓曲線離散對數,都將是不安全的,而不安全的意思就是說能從公鑰直接計算出私鑰。但是哈希函數卻依然是安全的,當然前提是哈希函數具有足夠的隨機性,只能通過暴力枚舉的方式來破解,拿sha256來舉例,輸出為256位,那么哈希值的結果空間大小為2^256,這個空間大到就算量子計算機也無法在有效的時間內的破解。

在實際應用當中,假如地址A給地址B發送了一筆交易Tx1,那么B就可以通過將自己的公鑰和簽名寫入新交易Tx2中從而將Tx1作為Tx2的輸入,此時Tx2中就包括了地址B和B對應的公鑰,一旦B將Tx2廣播出去,那么所有人都將知道地址B和B對應的公鑰,此時攻擊者如果利用量子計算機進行攻擊,那么此后所有轉到地址B的交易攻擊者都能進行花費;但是在B暴露自己的公鑰之前,也就是沒有花費過任何轉到地址B的交易,那么即使有量子計算機也無法進行攻擊。

通過以上解釋,我們可以總結出量子計算機出來之后的比特幣安全交易方式:不要重復使用已花費過的比特幣地址,那么你的所有交易就是安全的。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com