天天看點

比特币學習之比特币位址

比特币位址是一個由數字和字母組成的字元串,可以與任何想給你比特币的人分享。由公鑰(一個同樣由數字和字母組成的字元串)生成的比特币位址以數字“1”開頭。下面是一個比特币位址的例子:1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

  
在上面介紹密鑰的文章中我們介紹了比特币位址是從公鑰通過一種單向加密的算法得到的。也就是我們經常說的雜湊演算法。在比特币中,經常使用的雜湊演算法有以 下兩種: SHA(Secure Hash Algorithm),RIPEMD(the RACE Integrity Primitives Evaluation Message Digest)。特别是 SHA256 和RIPEMD160。

  
現在就列出生成比特币位址的公式,其實非常簡單。

  
A = RIPEMD160(SHA256(K))

  
字母A就代表比特币位址(adress),字母K代表公鑰(key)。這種進行了兩次哈希加密方式也叫雙哈希加密。這樣就增強了比特币位址的安全性。 這樣得到的位址其實并不是我們經常看到的比特币位址。我們經常看到的位址是經過“Base58Check”編碼的。Base58編碼比Base64編碼少了6個容易混淆的數字和字母: 0(數字 0)、O(大寫字母 o)、l(小寫字母 L)、I(大寫字母i),以及“+”和“/”兩個字元。這種編碼格式不僅實作了資料壓縮,保持了易讀性,還具有錯誤診斷功能。

  

   
        
比特币學習之比特币位址
圖1 上圖就簡單說明了這個過程。 我們通過一段C++程式來說明一下這個過程,看看是如何從私鑰産生一個Base58Check格式編碼的比特币位址的。 #include <bitcoin/bitcoin.hpp> int main() { //1.先得到一個私鑰 bc::ec_secret secret = bc::decode_hash("038109007313a5807b2eccc082c8c3fbb988a973cacf1a7df9ce725c31b14776"); //2.通過私鑰得到公鑰。 bc::ec_point public_key = bc::secret_to_public_key(secret); std::cout << "Public key: " << bc::encode_hex(public_key) << std::endl; // 3.建立比特币位址 通過把公鑰進行哈希計算得到一個哈希值。 //計算p2pkh公共密鑰哈希位址 const bc::short_hash hash = bc::bitcoin_short_hash(public_key); //這個位址(unencoded_address)一共占25位元組。其中版本号(1位元組),hash資料(20位元組),校驗碼(4位元組) bc::data_chunk unencoded_address;//聲明一個位址 unencoded_address.reserve(25);// unencoded_address.push_back(0);//放入版本号,目前版本号為0 bc::extend_data(unencoded_address, hash);//放入哈希資料。這個過程估計就包括了雙哈希計算了。 bc::append_checksum(unencoded_address);//放入校驗碼。 const std::string address = bc::encode_base58(unencoded_address);//進行base58編碼。得到最終比特币位址。 std::cout << "Address: " << address << std::endl; return 0; } 大家可以參照下圖(圖2)看上面的代碼。希望大家對比特币位址有點了解。
比特币學習之比特币位址
圖2 大家如果有安裝好了比特币的編譯環境。可以嘗試編譯一下。下面是編譯指令和結果。供參考。 # Compile the addr.cpp code $ g++ -o addr addr.cpp $(pkg-config --cflags --libs libbitcoin) # Run the addr executable $ ./addr Public key: 0202a406624211f2abbdc68da3df929f938c3399dd79fac1b51b0e4ad1d26a47aa Address: 1PRTTaJesdNovgne6Ehcdu1fpEdX7913CK 作者:ttblack 連結:http://www.jianshu.com/p/76235a769f66 來源:簡書 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

繼續閱讀