4.1 簡單的本地儲存

讓我們從最簡單的儲存方式開始,也就是把比特幣存放在本地設備上。如我們之前所說,要使用比特幣,你首先要知道一些公共的信息和一些私密的信息。公共信息就是那些記錄在區塊鏈上的內容——該比特幣的識別信息、幣值等。私密信息即比特幣持有人——也就是你本人的私鑰。你不必太擔心如何儲存公共信息,因為你隨時都可以去調取。但是私鑰則是你需要好好保管的。所以在實際運用中,儲存比特幣就是儲存與管理你的私鑰。

儲存比特幣其實就是如何保存和管理比特幣私鑰。

儲存與管理私鑰,主要有三個目標:第一是可獲取性,當你要用比特幣的時候,可以隨時隨地取用;第二是安全性,保證沒有其他人可以動用你的比特幣,如果有人能動用你的比特幣,那他可以直接轉賬給自己,之後你就不再擁有這個比特幣;第三是便利性,密鑰管理應當是簡單易行的。你可以想到,要同時做到這三點是很不容易的:

不同的密鑰管理方法就是對上述三點(可獲取性、安全性和便利性)做出權衡。

最簡單的鑰匙管理當然是把它們儲存在你自己的本地設備上:你的個人電腦、你的手機,或你持有的、擁有的或控制的小玩意。用智能手機應用軟件,按幾個鍵你就可以支配使用你的比特幣了,這麼做的確非常方便。但這樣做的可獲取性或安全性都不是很好,如果你的設備丟失,或者你的設備死機,你需要格式化你的磁盤,或者你的文件被病毒侵蝕,你的私鑰就丟失了,你的比特幣也就一同丟失了。安全性方面的問題是類似的,例如有人竊取你的設備或入侵你的設備或者讓你的設備中毒,將你的私鑰拷貝,這樣他們就可以將你所有的比特幣轉給他們自己了。

換言之,將私鑰存儲在你的本地設備,尤其是手機設備,就好比你將錢放在你的錢包裡。在日常花銷的時候是很方便,但你一定不想將你的畢生積蓄都帶在身邊,因為你不想遺失或被盜。所以一般而言,你只把一小部分信息——一小部分錢放在你的錢包裡,而把你大部分錢存在其他地方。

比特幣錢包軟件

如果你想本地存放比特幣,一般都會使用比特幣錢包軟件,也就是一個管理你的比特幣和私鑰信息並讓你方便使用的一個應用軟件。例如你想花相當於4.25美元的比特幣在咖啡館買杯咖啡,這個錢包應用應該很容易讓你做到。比特幣錢包非常有用,尤其是你需要處理一大堆地址和與其相關的密鑰的時候。前面說過,制定一對公鑰私鑰很容易,你可以用其來匿名與保護你的個人隱私。錢包應用就是這樣一個簡單的接口,告訴你錢包裡有多少比特幣。當你要使用比特幣的時候,它會處理關於密鑰管理的一切技術細節,比如使用密鑰或生成新的地址等。

編碼解碼(encoding keys):Base58編碼和二維碼

要使用或是接收比特幣,你需要與對方交換地址——比特幣送達的地址。目前有兩種主流的方式將地址加密:一種是字符串,另一種是QR(Quick Response)碼[1]。

為了給地址賦予一個字符串,我們把密鑰的字節從二進制字符轉換成Base58碼。Base58就是用一個包含58個字符的字符集來編碼,這被稱為base58記號法。為什麼是58個字符?我們把大寫小寫字母都算上,然後去掉幾個比較容易混淆的字母,比如大寫的「O」與「0」看起來很像,就得到了58個字符。我們可以將加密的地址讀出來,或者在需要時也能夠打印出來。理想情況下,最好能避免這種手工的方式,而是採用其他方法,例如我們接下來要討論的QR碼。

1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

以上就是比特幣創世塊地址的Base58代碼。

圖4.1 QR碼

註:一個QR碼代表著一個真實的比特幣地址。請掃上面的QR碼給我們轉賬一些比特幣。

第二種方法是用QR碼,一種簡單的二維碼。用QR碼的好處是你可以用手機拍張照片,然後錢包應用會把QR碼自動轉換成代表比特幣地址的字節。這對商店十分有用:比如一個付款機可以顯示一個QR碼,你可以用手機掃瞄一下,然後就可以用手機把比特幣轉賬到付款地址。這對於手機與手機之間的轉賬也很有用。

虛榮地址

有些商家或個人喜歡將地址轉換成一些人能夠識別的字符。例如,博彩公司網站中本聰骨頭(Satoshi Bones)的收款地址中就含有「骨頭」(bones),如下所示的2—6位字符(1bonesEeTcABPjLzAb1VkFgySY6Zqu3sX),當然所有的地址都是1開頭的,代表支付到比特幣地址的標準交易或者說是標準的比特幣轉賬流程(pay-to-pubkey-hash)。

地址都是通過哈希計算產生的隨機字符串,那麼如何才能獲得含有「bones」字符串的地址呢?如果中本聰骨頭只是隨便制定它們的地址,無法進行逆向計算哈希函數,它們無法得到相應的私鑰,也無法控制地址的生成。這樣的話,它們只能不停地重複生成私鑰,直到私鑰中包含它們希望出現的字符串。這樣的地址被稱為虛榮地址(vanity address)。這種地址事實上是可以通過工具生成的。

一般需要多少工作量能得到這樣的結果呢?由於每個字符位有58種可能性,如果你想得到一個字符串中有k個字節的特殊字符,你平均需要生成58的k次方次地址,才能獲得你要的結果。所以如果要生成「bones」開頭的地址則要生成超過6億個地址!這個工作現在通過一台筆記本電腦就可以完成。但是你每增加一個字符,工作量會幾何級數增長。獲得一個15位字符的地址需要的計算量難以想像,而且是不間斷的哈希計算,這是無法實現的。

虛榮地址的加速生成

在比特幣世界,如果我們將一個私鑰稱為x,公鑰是gx,其地址是H(gx),即公鑰的哈希值。我們不會探討其中的細節。但是通過指數運算來生成地址顯然是很慢的。

最直接的方式是挑選一個偽隨機序列x,計算H(gx),不停地生成地址,直到得到想要的結果為止。一個更快的方式是,如果使用x無法得到想要的結果,接下來就使用x+1來計算,如此反覆。而不是重新挑選一個x。因為gx+1 =g gx,而我們已經計算過了gx,所以我們只需要做乘法運算而無須做指數運算,這會更快。事實上,這種方式比最直接的方式要快兩個數量級以上。

[1] QR碼是一種簡單的二維碼。——譯者注

《區塊鏈:技術驅動金融》