学习区块链怎样入门七

这里是段博士。开讲之前,先介绍一下我常用的两种钱包,分别是imToken(以太坊代币)和Bitbill(BTC为主)。选择它们的原因主要是用户多、安全性经过一定考验、操作简单。这段时间EOS主链上线,imToken即时地提醒用户自己完成主链映射,以及支持多种空投代币,很好地满足了不少用户的需求。

imToken

Bitbill

一、钱包的概念

要想讲清楚虚拟数字货币的钱包,得分别从用户角度、宏观角度和程序员角度说明。

用户角度:就是存储和使用数字货币的工具,用来存储或者交易数字货币。

宏观角度:钱包主要就是为用户提供用户界面的一个应用。它掌管着用户的金钱,管理着密钥和地址,追踪账户余额以及创建交易和签名。

程序员角度:从一个程序员的角度更准确的讲,「钱包」这个词语指的就是存储和管理密钥和地址的系统。每一个「钱包」都有一个密钥管理组件。而对于有些钱包来说,这就是钱包的全部。其他的大部分钱包都是「浏览器」,其实就是基于以太坊的去中心化应用的接口。所以这些各式各样的「钱包」之间并没有什么明确的界限。

二、钱包技术概述

以imToken为例,关于以太坊钱包,最常见的误解就是大部分人认为以太坊钱包包含ETH和其他代币。而实际上,钱包只包含密钥。ETH和其他代币都被记录在以太坊的区块链中。用户通过使用他们钱包中的密钥对钱包签名来控制代币。所以从某种意义上讲,以太坊钱包就是一个钥匙串。

以太坊钱包就像一个钥匙串

目前主要有两种类型的钱包,他们的区别就是所包含的密钥之间是否有关联。

第一种类型叫做非确定性钱包,它的每一个密钥都是通过一个随机数独立生成的。密钥之间相互没有关联。这种钱包也叫做 JBOK 钱包( Just a Bunch Of Keys)。

第二种钱包叫做确定性钱包,它所有的密钥都来源于一个单独的叫做种子的主密钥。在这个钱包中所有的密钥都相互关联,并且任何拥有原始种子的人都可以将这些密钥再生成一遍。这种确定性钱包会使用很多不同的密钥派生方法。而其中使用最普遍的则是一种类似树形结构的方法,这样的钱包被称为分层确定性或者 HD 钱包。

分层确定性钱包是通过一个种子来初始化的。而为了便于使用,种子会被编码成英语单词(或者其他语言的单词),这些单词被称为助记词。助记词的具体描述可以参考我前面的文章《学习区块链怎样入门五(细节篇之三)》。

三、非确定性钱包

在第一个的以太坊钱包中,钱包文件会存储一个单独随机生成的私钥。然而这种钱包之后被确定性钱包取代了,因为这种钱包无法管理、备份以及导入私钥。但是随机密钥的缺点是,如果你生成了很多那么你就要把它们全部拷贝下来。每一个密钥都要备份,否则一旦钱包丢失,那些密钥对应的资产也会丢失。进一步讲,以太坊地址的隐私性会因为相互之间关联的多笔交易和地址的重复使用而大大降低。

很多以太坊客户端(包括 go-ethereum 和 geth)都会使用一个钥匙串文件,这是一个 JSON 编码的文件,而且它还包含一个单独的(随机生成的)私钥,为了安全性,这个私钥会通过一个密码进行加密。

钥匙串格式使用的是Key Derivation Function (KDF),同时还被成为密码拉伸算法,这个算法可以防止暴力破解、字典攻击以及彩虹表攻击。简单来说就是私钥并不是直接通过密码简单的进行加密的。相反,这个密码是通过不断的重复哈希拉伸过的。这个哈希函数会重复 262144 轮,这个数字就是钥匙串 JSON 文件中的 crypto.kdfparams.n 这个参数指定的。一个攻击者试图通过暴力破解的手段来破解密码的话,那么他需要为每一个可能的密码执行 262144 轮哈希,这样对于一个足够复杂和长度的密码来说被破解几乎是不可能的。

四、确定性钱包(种子)钱包

确定性或者说「种子」钱包是指那些所有的私钥都是通过一个普通的种子使用一个单向哈希函数延伸而来的钱包。这个种子是结合一些其他的数据而随机生成的数字,例如利用一个索引数字或者「链码」(查看HD 钱包(BIP-32/BIP-44)来派生出私钥。在一个确定性钱包中,一个种子就足够恢复出所有派生的密钥,因此只需要在创建的时候做一次备份就可以了。同时,这个种子对于钱包来说也是可以导入导出的,可以让所有用户的密钥在各种不同的钱包之间进行简单的迁移。

确定性钱包的开发就是为了可以简单的从一个「种子」派生出很多个密钥。而这种确定性钱包最高级的实现就是由比特币的 BIP-32 标准定义的 HD 钱包。HD 钱包包含的密钥来源于一个树形的结构,例如一个父密钥可以派生出一系列子密钥,每一个子密钥又可以派生出一系列孙子密钥,不停的循环往复,没有尽头。这个树形结构的示意图如下:

HD 钱包相对于随机的(非确定性的)密钥有两个主要的优势。

树形结构可以表达额外的组织意义,例如当一个子密钥特定的分支用来接收转入支付而另一个不同的分支可以接收转出支付的改变。密钥的分支也可以在一些共同的设置中被使用,例如可以分配不同的分支给部门、子公司、特定的函数或者不同的账单类别。

第二个优势就是用户可以使用 HD 钱包在不利用相关私钥的情况下创建一系列公钥。这样 HD 钱包就可以用来做一个安全的服务或者是一个仅仅用来观察和接收的服务,而钱包本身却没有私钥,所以它也无法花费资金。

五、助记词的标准

随着数字货币钱包技术的逐渐成熟,也慢慢形成了共同的行业标准,使得钱包在交互性、易用性、安全性和灵活性等方面大幅度提高。这些标准同时也使得钱包可以仅仅从一个单独助记词就为各种不同的数字货币派生出不同的密钥。这些共同的标准主要有:

基于 BIP-39 的助记词

基于 BIP-32 的 HD 钱包

基于 BIP-43 的多用途 HD 钱包结构

基于 BIP-44 的多货币多账户钱包

参考文献:

[译] 数字货币钱包详解

总结:本文从概念和技术细节介绍了数字货币的钱包。钱包和交易所一起构成了普通用户和虚拟数字货币的接口。然而这两类接口目前存在互相排斥的关系,交易所希望人们尽量少的提币次数,一是减少交易所提币系统压力,二是提升交易数量;而钱包则希望人们尽量多的把币存在钱包里,这样才能做大生态。我推荐的资产配置策略是如果你的数字货币资产足够多且希望长期持有,则把80%的资产提到钱包中,20%的资产存到交易所供交易使用。

国内外从事钱包开发的公司有一个非常宏大的愿景,即把交易所整合进来,成为和用户交互最多的虚拟数字货币入口。但受限于目前虚拟数字货币主要作为一种投资资产而不是支付货币存在,所以钱包未来的命运如何?是否能构建一个巨大的市场值得我们持续关注。

下一篇将针对以太坊的智能合约概念,继续讲述区块链技术的细节。

欢迎大家关注我的公众号,多多交流!

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180617G13BRF00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区