比特幣地址是一個由數(shù)字和字母組成的字符串,可以與任何想給你比特幣的人分享著瓶。由公鑰(一個同樣由數(shù)字和字母組成的字符串)生成的比特幣地址以數(shù)字“1”開頭半抱。下面是一個比特幣地址的例子:1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
在上面介紹密鑰的文章中我們介紹了比特幣地址是從公鑰通過一種單向加密的算法得到的获高。也就是我們經(jīng)常說的哈希算法。在比特幣中躬拢,經(jīng)常使用的哈希算法有以 下兩種: SHA(Secure Hash Algorithm)躲履,RIPEMD(the RACE Integrity Primitives Evaluation Message Digest)。特別是 SHA256 和RIPEMD160估灿。
現(xiàn)在就列出生成比特幣地址的公式崇呵,其實(shí)非常簡單。
A = RIPEMD160(SHA256(K))
字母A就代表比特幣地址(adress),字母K代表公鑰(key)馅袁。這種進(jìn)行了兩次哈希加密方式也叫雙哈希加密域慷。這樣就增強(qiáng)了比特幣地址的安全性。 這樣得到的地址其實(shí)并不是我們經(jīng)常看到的比特幣地址犹褒。我們經(jīng)车种希看到的地址是經(jīng)過“Base58Check”編碼的。Base58編碼比Base64編碼少了6個容易混淆的數(shù)字和字母: 0(數(shù)字 0)叠骑、O(大寫字母 o)李皇、l(小寫字母 L)、I(大寫字母i)宙枷,以及“+”和“/”兩個字符掉房。這種編碼格式不僅實(shí)現(xiàn)了數(shù)據(jù)壓縮,保持了易讀性慰丛,還具有錯誤診斷功能卓囚。
上圖就簡單說明了這個過程。
我們通過一段C++程序來說明一下這個過程诅病,看看是如何從私鑰產(chǎn)生一個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.創(chuàng)建比特幣地址 通過把公鑰進(jìn)行哈希計(jì)算得到一個哈希值贤笆。
//計(jì)算p2pkh公共密鑰哈希地址
const bc::short_hash hash = bc::bitcoin_short_hash(public_key);
//這個地址(unencoded_address)一共占25字節(jié)蝇棉。其中版本號(1字節(jié)),hash數(shù)據(jù)(20字節(jié))芥永,校驗(yàn)碼(4字節(jié))
bc::data_chunk unencoded_address;//聲明一個地址
unencoded_address.reserve(25);//
unencoded_address.push_back(0);//放入版本號篡殷,當(dāng)前版本號為0
bc::extend_data(unencoded_address, hash);//放入哈希數(shù)據(jù)。這個過程估計(jì)就包括了雙哈希計(jì)算了恤左。
bc::append_checksum(unencoded_address);//放入校驗(yàn)碼贴唇。
const std::string address = bc::encode_base58(unencoded_address);//進(jìn)行base58編碼。得到最終比特幣地址飞袋。
std::cout << "Address: " << address << std::endl;
return 0;
}
大家可以參照下圖(圖2)看上面的代碼。希望大家對比特幣地址有點(diǎn)了解链患。
大家如果有安裝好了比特幣的編譯環(huán)境巧鸭。可以嘗試編譯一下麻捻。下面是編譯命令和結(jié)果纲仍。供參考。
# 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
7
區(qū)塊鏈研習(xí)社比特幣源碼研讀班贸毕,black