贡献者: addis
本文简单介绍几种不同类型的数字货币钱包。本文只从技术上科普数字货币,而这也是区块链技术的原理(我国支持区块链技术的发展)。本文不构成任何投资建议,请严格遵守当地法律和规定。
我们接下来主要以比特币为例讲解,其他数字货币也大同小异。比特币最原始的钱包形式就是一个地址和一个私钥。地址用于接收转账以及查询余额,而私钥则相当于密码。一个用于生成地址和私钥的常用网站是 bitaddress.org,笔者用它生成的一个钱包如下,另见图 1 。
地址: 1KwgSiapZKYCeq5Bwh1hHm2c51PQpuxU5c
私钥: L2SqERmStxZaiF8dq8eWF1DXpaSWeH5BAZZxrnnTL6F1NM3vjfsD
地址中的每位都在以下 58 个字符中选取,称为 base58:数字 0
到 9
,小写字母 a
到 z
以及大写字母 A
到 Z
,但为避免混淆不使用数字 0
,大写字母 O
,大写字母 I
,和小写字母 l
。根据地址类型的不同,比特币地址的开头通常是 1
,3
或者 bc1
(bc1q
最常见)。
注意任何持有私钥的人就等同于持有该地址中的所有比特币,可以进行任意转账。比特币转账不可撤销,一旦被盗几乎不可能追回。你可以放心把你的地址交给需要给你转账的人,但为了隐私起见最好不要把地址和身份信息同时公开,因为任何持有地址的人都可以轻易查到其所有交易信息。
事实上,比特币地址是由对应的公钥生成的,而公钥是由对应的私钥生成的2。所以即使只有你的私钥泄露,同样会导致比特币被盗。
另外一点是,比特币地址自带校验功能3,所以如果意外改动了地址中的任意几位或扫码错误,几乎肯定会导致无法转账,而不会转到错误的地址中。所以一般情况下要确认两个地址相同也仅需要对比前后几位即可。
比特币区块链上的所有信息都是公开的,有许多网站可以搜索并查看任意地址的余额和转账历史。常用的区块链浏览器(blockchain explorer)网站是 blockchain.com,你可以在上面搜索要查看的地址。图 2 中的乞丐的账户没有隐私可言,因为他一直使用一个地址。下文会讨论如何保护隐私。
若需要完全确定一笔比特币转账成功,你需要在 explorer 中看到该转账至少有 6 次确认,也就是在它后面至少新增了 6 个区块。软件钱包通常也会显示确认的次数。对于小额转账,通常 1 次确认就可以足够放心了。比特币每个区块的生成时间在 10 分钟左右,也就是说一次转账需要大约 10 分钟。事实上在交易广播后,很快就可以在 explorer 中看到,此时交易信息还没有写入区块,只是缓存在矿工的临时储存中。
比特币的代号是 BTC,最小计量单位是 “聪(Satoshi 或 Sat)”,1 Satoshi 等于 $10^{-8}$ BTC。无论是交易所的买卖还是用户之间的转账,都可以精确到 1 聪。一个严重的误解是 BTC 的单价太贵,自己买不起也用不起,但事实上一些交易所如 Coinbase 的最少买入门槛只有 10 美元,用户间转账甚至可以低至 1 聪。不同的数字货币单价相差很大,但单纯对比单价没有任何意义,因为每种币的发行总量不同,总市值(总量乘以单价)也不同。
以下列出数字货币各种常见钱包的类型。笔者推荐的做法是把需要长期存放的大额比特币直接存在钢板钱包中,把需要时常转账的大额比特币存在硬件钱包中,把日常小额零花钱存在手机钱包中。
顾名思义,把地址和私钥写在纸上(也可以使用助记词,见下文),或者打印出来(通常包含二维码),并保存到安全的地方(如保险柜或银行)就叫纸钱包。纸钱包的缺点是使用起来不太方便,以及可能被烧毁,泡烂,褪色等。
为了克服纸钱包在物理上的脆弱,市面上也可以买到一些专用的小钢板,可以在上面以打点或拼图的方式记录地址和私钥(或助记词)。钢板钱包是长期保存比特币最安全最稳定的方式,不需要依赖任何第三方数字设备或软件,无法被骇客盗取,也可以抵抗常见的自然灾害。
类似于银行的 U 盾,通常带有 USB 接口。地址和私钥信息储存在钱包中,需要转账时将其插入电脑即可。硬件钱包一般配有用于转账的软件可以安装在电脑或手机上,但理论上硬件钱包不会把私钥以任何方式传输到其他设备上,并从硬件上保证无法从外部入侵。硬件钱包由于含有电路,在物理上没有钢板钱包坚固。
托管钱包是一种中心化的软件钱包,可以类比微信或支付宝等软件,本质上是钱包公司替你保管和操作数字货币。交易所提供的钱包就属于典型的托管钱包,所有用户的比特币统一存放在交易所持有的若干地址中,用户通过交易所的网站或 app,使用交易所的账号密码登录并进行转账、交易等操作。托管钱包用户无法直接获取属于自己的私钥。用户可以获取一些私有地址用于收款,但这些地址的余额也会被交易所定期转移。
托管钱包的优势有
某种意义上,托管钱包是相对来说最不安全的钱包,一旦交易所倒闭、服务器出现故障或被骇客攻击就可能直接导致无法取出数字货币。此前已经有一些交易所被骇客盗窃的案例。但一些较为正规的交易所(例如 Coinbase)所会把大部分比特币存入离线钱包,并给流通的币购买全额保险。
除了托管钱包,其他硬件和软件钱包都可以称为非托管钱包。非托管软件钱包可以在电脑或手机上安装,并把私钥保存于所在设备上而不是开发者的服务器。软件钱包通常自带转账甚至交易功能。原则上这种钱包不会让私钥离开软件,但这同样要求你信任该开发者。为安全起见应该尽量选择口碑好的开源软件钱包,其源代码经过大量审评,存在恶意行为或漏洞的风险大大降低。注意一定要通过官方渠道下载钱包 app。
以上的钱包中,若储存私钥的设备是不连接网络的,则称为冷钱包或离线钱包,反之则称为热钱包。如果把非托管软件钱包所在的设备断网保存,则可视为冷钱包。
如果你需要直接用私钥进行转账,可以使用 blockchain.com。你需要先用邮箱注册一个账号并在钱包管理页面中导入私钥,然后转账即可。许多软件钱包也有所谓的 sweep 功能(或者叫 redeem private key),可以先把私钥中的全部余额转入软件钱包然后再使用。
每次转账都需要给赢得所在区块的矿工支付一笔手续费,原则上手续费可以任意设定,但手续费过低可能会导致确认速度非常慢(多至一星期)甚至转账失败。几乎所有钱包软件在转账时都有自动计算手续费的功能,也通常会给用户提供多种不同的选项和预期的确认时间,但不是所有钱包都可以自定义手续费。
比特币网络支持在一次转账请求包含多个来源地址和多个目标地址,例如 blockchain.com 支持导入多个私钥并一次转出。在其他条件相同时,手续费和转账请求的字节数大致成正比,而单笔转帐中包含的地址数越多,字节数也就越多。一般衡量手续费的指标是 “聪/字节(sat/byte)”。该指标体现了当前网络的忙碌程度。注意转账手续费和转账的数额没有关系,当前(2021 年 5 月)一笔 1 对 1 转账的手续费约为 $2 \times 10^{-5} $ 到 $10^{-4}$ BTC(约 0.8-8 美元),对应的预期时间为 10 分钟到 1 天。
当前功能最齐全的比特币软件是 bitcoin core,它是比特币网络中一个完整的服务器节点,运行前需要下载完整的区块链数据(目前大约占用 200 GB 硬盘)。对大部分普通用户来说,不需要使用如此重量级的软件。
理论上,当一个比特币地址生成以后,如果只单独挖矿或者和随机的地址之间转账,那么其他人无法得知该地址的持有者是谁。但如果该地址直接接收交易所的转账,且交易所中存有转账者的身份信息,那么由于区块链上所有的转账都是公开的,那么这个地址的身份也可能暴露。类似地,如果和你交易的人知道你的身份信息,那么你用于交易的钱包地址的隐私性也可能会降低。下面我们会看到市面上大部分非托管钱包钱包都为此提供了较好的解决方案。
另外也存在一种提供混币(coinjoin)功能的去中心化托管钱包,在汇款时会把不同的随机汇款混合到一个地址中后再发向最终地址,这在一定程度上可以保护转账双方的隐私。有人认为这会帮助犯罪行为,但也有人认为这只是达到了和纸币一样的保护隐私效果。
除了直接生成和保存地址/私钥,一种更方便的办法是使用助记词。按照一定的标准算法,助记词可以以一定的顺序生成任意多个地址和私钥5。最常见的助记词标准规范是 BIP39(bitcoin improvement proposal 39),该规范中规定了 2048 个常见且不易混淆的单词用于选取助记词。常见的助记词个数是 12 个或者 24 个(表 1 ),但 12 个助记词的安全性已经和直接使用比特币私钥几乎相当。助记词也有中文和其他语言的版本6,但不同语言之间不能相互转换。由于目前大部分钱包软件只支持英文助记词,强烈建议选择英文。
1.trend | 2.cage | 3.spell | 4.cycle |
5.foster | 6.garbage | 7.upset | 8.peasant |
9.mention | 10.purpose | 11.menu | 12.isolate |
助记词一个最大的优势是方便记忆,例如可以把助记词串联成几句话,而且即使发生轻微的拼写错误也容易更正(而私钥一位都不能出错)。第二是一组助记词可生成任意多个7私钥和地址。上述的纸钱包和钢板钱包也可以用于记录助记词而不是地址和私钥。
一个常用的助记词生成和转换网页是 hiancoleman.io/bip39。该页面可以随机生成助记词8,以及选择不同的算法按顺序生成任意多的地址/私钥,同一组助记词也可以生成多种数字货币的钱包地址和私钥。注意该页面可以保存为 html 文件并离线使用,推荐在安全的设备上离线使用(使用以前断开网线和 wifi)。由于助记词需要满足一定的限制,所以用户通常不能逐个选择。
为什么一组助记词可以生成任意多个地址和私钥?你可以把这组词理解为随机数生成器的种子,在一定规则下进行反复迭代就可以生成不同的地址和私钥。
非托管软钱包和硬钱包无需注册和登录,而是使用助记词在设备上生成地址和私钥,例如 BRD 钱包(bread wallet) 使用 12 个英文助记词。在初次使用时,软件会随机生成助记词并提示用户用纸笔或钢板将其记下,任何掌握这些助记词的人都等同于拥有其生成地址中的数字货币。
在网页 hiancoleman.io/bip39 中,你可以输入这些助记词并获得一些对应的地址和私钥,但为了安全起见不建议这么做。BRD 的推导算法是 BIP32
,推导路径(derivation path)是 m/0'/0
,你需要在网页中输入这些才会得到正确的地址和私钥(再次提醒注意安全)。所以在使用类似的钱包时,你不需要担心这个 app 以后是否会被下架,你唯一需要信任的是它不会偷偷上传你的助记词和私钥。
软件和硬件钱包为了保证用户隐私,每次收款时都会根据助记词按顺序生成一个新的地址;转出时,除了把指定的数额转给目标地址,也可能会把剩下的余额转到一个新生成的地址。钱包会定期自动按顺序检查每个地址中的余额,并显示每个币种的总余额。
1. ^ 这在黑客技术中俗称 5 dollar wrench attack。
2. ^ 这两个过程的算法都是不可逆的,所以无法从地址或公钥得出私钥。
3. ^ 简单来说就是把未验证的地址的指纹(连接未完成)后几位附加在最后。
4. ^ 这是因为这种情况下交易所并没有真的把比特币从一个地址转到另一个地址,而只是更改了交易所的用户数据。只有用户提币时才会真正把币转到用户提供的地址中。
5. ^ 注意如果你的私钥是直接生成的,将无法使用助记词,但你可以把全部余额转到助记词生成的地址。
6. ^ 中文版本中一个助记词就是一个汉字
7. ^ 这不是数学意义上的无穷,毕竟钱包地址的总数量是有限的。
8. ^ 声明:笔者并不了解其随机数生成算法是否足够安全,请谨慎使用。