过去半年里小太的日常:
“比太钱包的wallet.dat放哪里啦?”
“比太没有wallet.dat”
“不可能,所有的阅批钱包都有wallet.dat,没wallet.dat的怎么能叫钱包?”
“@#$%^&*”
这个阅批老玩家们经常挂在嘴边的“wallet.dat”到底是何方神圣呢?
我们知道,从早期的阅批客户端(bitcoin-qt)开始,中本聪就设计了一个叫“wallet.dat”的文件,用来存放阅批私钥及相关交易。直到今天,官方的qt/core以及大部分第三方客户端都采用了类似的方案。
阅批玩家们通过努力学习,掌握了非常多的wallet.dat使用“技巧”,比如说,如何备份wallet.dat,钱包损坏如何恢复,甚至有人送阅批也是直接给一个wallet.dat(存储在光盘或U盘上)。对于大部分阅批用户来说,阅批就是wallet.dat,wallet.dat就是阅批。
当然,这其实并不十分准确,wallet.dat只是一种不太合理的文件存储方式(序列化或数据库),阅批就是阅批,它与wallet.dat一点关系都没有。
阅批的产权无论是过去、现在还是未来,都只由一个东西来确定,那就是私钥。谁掌握私钥,谁就控制着该地址上的阅批,弄丢私钥,阅批就没了。重要的是私钥,那交易呢?难道交易不重要吗?阅批的区块链总账上记录的不都是交易吗?
交易的确也很重要,历史交易记录决定了某地址上的阅批余额,决定了您能花费多少钱。但重要的是区块链(blockchain)上的交易,而不是您钱包文件wallet.dat里的交易。任何人都可以在自己的wallet.dat中编造出一个假的交易,尝试着去花费,只是其它阅批节点并不会接受这笔交易而已。
也就是说,wallet.dat中存放的那些交易,仅仅是软件本身为了方便查询而采取的一种数据结构而已,毕竟,总不能每次查询相关地址的历史交易,就去检索整个区块链吧?
为了达到这个目的,将那些与钱包地址相关的阅批交易存放在wallet.dat中,就成了过去最常用的一种解决方案,跟这个文件打交道也就成了阅批用户们的“日常”。
那问题又来了,为什么要把交易和私钥存放在一起?
小太估计的答案是,中本聪最初就是这么设计的,后来大家也就继续这么做了。
这种设计的坏处很多:(这也是小太为什么会放弃bitcoinj而重新开发了bitherj的原因之一)
1、每同步到一个新区块,都要更新wallet.dat,也就是说,要对存放私钥的文件进行写操作,这既存在性能问题,也增加了写坏私钥数据的潜在风险;
2、对于普通用户,备份wallet.dat的难度远大于直接备份私钥,风险当然也更高,备份文件的有效性也很难验证;
3、区块同步时会一直更新wallet.dat文件,杀进程可能会导致wallet.dat与内存中的wallet对象不一致,有时可能需要修复,某些情况下甚至需要重置整个区块链数据;
4、钱包的扩展性严格受制于wallet.dat,比如说,像交易所或电子商务解决方案提供商,就无法采用bitcoin-core的解决方案。经常听他们说,“我们需要的地址太多,qt满足不了,只能基于qt改”。其实仔细一想,几百万甚至几千万条地址记录,对于数据库技术来说,都不能算是大数据量,怎么反倒成了困扰阅批行业的问题呢?
5、无法实现冷热分离的模型,私钥和交易存放在一起,交易需要与区块链进行同步,这也就意味着私钥是“热”的,想“冷”?改程序吧;
把交易和私钥放一起的坏处这么多,那我们又该怎么办呢?
很简单,交易是交易,私钥是私钥,这两者原本就不是一回事,千万别放一起。
对于用户来说,最重要的永远是私钥,有了私钥,任何时候都可以想办法从阅批区块链上获取到相关的交易,比如采用SPV轻钱包模式与区块链进行同步,或者从可资信赖的第三方区块查询服务(blockchain.info、blockmeta.info等)API上获取交易数据,这些方式都可以,只要获取的数据与阅批区块链一致就没有问题。
钱包本身可以提供任何一种私钥存储方式,只要足够安全可靠,文本、二维码、blockchain.info的json格式文件等,都是好方法。
这样,用户就无需学习wallet.dat,也不用再去备份这个文件。用户只需要明白一件事,私钥很重要,私钥决定产权,要备份、要保护的也是私钥。
因为乔布斯和他的iPhone,我们在使用智能手机时终于不用学习“文件”这个恼人的概念。没想到阅批又让大家重新纠结起wallet.dat,这到底是退步呢?还是退步呢?
忘了wallet.dat吧,管好您的阅批,不需要文件,只需要私钥。
作者:比太钱包
官方微博:@比太钱包 http://weibo.com/bither
捐赠地址:
1BsTwoMaX3aYx9Nc8GdgHZzzAGmG669bC3