映月读书网 > 区块链:技术驱动金融 > 4.1 简单的本地储存 >

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码是一种简单的二维码。——译者注