数字货币钱包

Vincent Ma
DEX.top
Published in
13 min readSep 21, 2018

— — 生态及技术

目录

第一章 钱包概述及其生态介绍

1.1 数字货币钱包生态结构

1.2 数字货币钱包商业模式

1.3 数字货币钱包发展展望

第二章 钱包安全性

2.1 HD钱包使用安全注意事项

2.2 种子生成方式对于钱包的安全影响

第三章 钱包设计原理

3.1 钱包相关概念概述

3.2 非确定性钱包设计原理

3.3 HD钱包设计原理

3.4 钱包种子生成方式及原理

第四章 附录

4.1 现有非确定性钱包及HD钱包统揽

4.2 常见问题

第一章 钱包概述及其生态介绍

1.1 数字货币钱包生态结构

钱包作为数字货币行业的基础设施,在数字货币行业中具有资产管理,巩固用户群体流量及导流的相关作用,下面的一张图中大致介绍了数字货币钱包的生态结构。

图1.1 数字货币钱包生态上下游关系
  • 钱包上游

作为钱包的主要流量来源。考虑到钱包的实际功能性,钱包的主要上游来自矿工及交易所交易用户。矿工需要安全渠道长期存储数字货币,交易所用户为了资产的安全存储将数字资产放置于钱包进行存储。

  • 钱包平行行业

平行关系中,传统数字货币钱包业务与平行行业不存在重叠的机会,但为了丰富钱包的功能性,很多数字货币钱包加入了行情,社交,资讯的附加功能,既丰富了钱包的功能性又为钱包带来了更多流量。

  • 钱包下游

依托钱包的技术实现及资金存储的属性,数字货币钱包可以天然的作为Dapps,场外交易,资金管理,借贷等产业的流量入口。

随着钱包交易功能的丰富且Dapps中就包含交易所,交易所与钱包的上下游关系变得越来越模糊。

1.2 数字货币钱包商业模式

数字货币钱包的商业模式主要围绕钱包的生态结构展开,钱包的价值在于拥有数字货币行业中的巨大流量资源,而流量资源怎么实现变现便是大家努力在数字货币钱包行业所探索的。下文将给出几种比较成熟的商业合作模式。

  • 引流返佣

交易所引流返佣

中心化交易所,钱包接入中心化交易所API,用户可以直接在钱包中实现交易相关操作;去中心化交易所,目前去中心化交易所以基于以太坊智能合约为主要类型。钱包需要提供Web3接口,以实现去中心化交易所与钱包地址直接的通信功能。

Dapps引流返佣

目前市场上众多的Dapps,极大丰富了区块链世界的功能性。众多数字货币钱包也开始接入Dapps,不断丰富钱包的实用功能。

借贷引流返佣

钱包作为天然的资金流量入口,具有先天优势。符合借贷行业对于资金的持续稳定需求。

  • 资产管理

理财产品

钱包推出定期存款理财业务,钱包通过汇集资金进行投资或高频套利交易赚取利润。

  • 手续费

场外交易手续费

为了规避风险,钱包用户可以使用OTC功能,实现数字货币出金及入金。

交易功能手续费

一些钱包在其中内嵌了交易功能,用户可以实现数字货币与主流数字货币之前的交易。

  • 广告

众筹项目接入

众筹项目为了增强品牌影响力,向钱包付费,实现添加Token,广告宣传的服务。

Dapps 接入

为丰富Dapps流量来源,Dapp开发者向钱包付费,实现接入。但目前由于Dapp接入钱包仍处于早期阶段,多数Dapps接入钱包均为免费,实现双向共赢流量吸引。

1.3 数字货币钱包发展展望

1.3.1 钱包类型

  • HD多币种钱包

HD钱包由于支持多币种,且只需备份种子助记词(详情见3.4),提高了操作简易性及兼容性。

  • 中心化,去中心化混合钱包

为降低用户教育成本,早期接触数字货币用户更容易接受中心化数字货币钱包。混合类型钱包将起到良好的教育用户的作用。

1.3.2 功能拓展

  • 功能集合

功能集合化的数字货币钱包已经成为数字货币钱包的发展方向,未来将有更加丰富的功能与数字货币钱包对接。

1.3.3 合作方式

  • 交易所与钱包

钱包作为稳定的流量来源,越来越多的数字货币交易所意识到钱包在数字货币生态中的重要作用。Coinbase收购Toshi Wallet;Binance 收购 Trust钱包。可见主流交易所倾向于拥有自己的数字货币钱包,以实现自己在整个生态中的拓展。

  • 资产管理与钱包

目前钱包大多没有自己的资产管理团队,以钱包为资金入口,越来越多钱包将开发自己的交易系统并培养自己的量化交易团队。

  • 矿池与钱包

矿池作为矿工流量的汇集点,矿池与钱包的合作将更大限度提高矿工钱包用户的转化率。将来会出现越来越多的矿池与钱包合作共赢的新模式

  • 零售商,结算机构与钱包

随着数字货币得到越来越多的认可,零售商,结算机构将作为数字货币钱包上游,打通用户使用数字货币消费壁垒。

第二章 钱包安全性

2.1 HD钱包使用安全注意事项

2.1.1 钱包种子/助记词备份及保存

对于HD钱包来说,有两种不同类型的私钥:主私钥及每个不同数字货币的私钥,备份主私钥的同时建议备份常用地址私钥

安全建议:

  • 钱包应用下载好后,断网生成钱包账户
  • 备份主私钥及主私钥助记词,备份时建议手写或使用未联网电脑打印
  • 同时备份常用的币种地址,备份时建议手写或使用未联网电脑打印

2.1.2 资金发送及消息签名

由于资金发送过程,会利用私钥进行签名,且进行联网通讯。容易在联网的情况下暴露私钥在互联网下,存在安全风险

安全建议:

使用离线钱包签名发送交易功能(imToken),详细步骤可查看imToken的冷钱包离线签名方法

https://help-center.token.im/hc/article/360003147833

2.1.3 钱包导入

目前HD钱包导入通常使用助记词,私钥的方式进行导入。

安全建议:

  • 使用助记词进行导入
  • 避免使用联网的设备对私钥,助记词进行复制粘贴操作
  • 一些用户体验较差钱包,注意助记词导入时的空格

2.2 种子生成方式对于钱包的安全影响

概述:

钱包种子的随机性决定了钱包的安全性,一旦钱包的随机规律被获知,将对钱包安全性造成毁灭性的打击。怎样保证钱包种子生成序列的随机性,成为了各大钱包努力实现的目标。

由于种子随机序列的生成算法关系到钱包的安全性,目前各大主流钱包的种子生成算法均未开源,保证黑客无法通过暴力碰撞的方式生成合法种子。

目前主要有几种方式获取种子随机性序列

  • 通过软件系统提供信息,时间,系统版本号等等
  • 通过硬件系统提供信息,CPU型号,MAC地址等等
  • 通过用户提供信息,照片像素,用户选取随机因素

举例说明种子生成方式对于钱包的安全性影响:

假如钱包A通过硬件信息获取种子随机序列,而黑客B熟知目前主流手机终端型号及硬件数据。

黑客通过脚本程序模拟随机序列生成过程,随机来源为熟知的硬件型号及硬件数据。生成了大量私钥。

用户C很不幸,所使用的硬件设备恰好在黑客的随机来源范围内,那么用户C所生成的私钥其实早就被黑客所控制,一旦用户C向该地址充值资金,黑客便可以通过私钥随意控制用户C的资金。

第三章 钱包设计原理

3.1 钱包相关概念概述

  • 非确定性钱包及HD钱包概述

非确定性钱包:钱包中每一个私钥随机独立生成,私钥之间没有逻辑关联。

由于私钥之间没有逻辑关系,导致用户需要每个地址都进行备份,用户体验较差。

图3.1 非确定性钱包

HD(分层确定性)钱包:钱包中所有密钥都由主密钥生成,密钥具有关联性,拥有原始主密钥便可以生成全部密钥。

图3.2 确定性钱包
  • 钱包种子/助记词概述

钱包种子/助记词:代表一个随机数的单词序列,序列可以再次创建种子,派生出更多密钥。其长度通常为一组12到24的单词序列

3.2 非确定性钱包设计原理

概述:

最早期的比特币钱包采用这种方式,独立的私钥使钱包拥有更好的匿名安全性,但随着数字货币的普及,易用性变得愈发重要,使得非确定钱包逐渐退出历史舞台。

非确定性钱包设计简单,目前仅早期的数字货币钱包采用该模式。私钥是由没有逻辑关系的随机序列生成,所以私钥之间没有逻辑关系。

3.3 HD钱包设计原理

概述:

HD钱包的实现是由比特币BIP-32标准定义的HD钱包,BIP-44是对于BIP-32进行改进可以支持多币种的HD钱包协议,钱包密钥来源一个树形结构。父密钥派生出一系列子密钥,子密钥又可以派生出一系列孙密钥。

图3.3 HD钱包密钥生成
  • BIP-32:定义了HD钱包私钥的生成过程
图3.4 HD钱包生成过程

HD钱包密钥路径标识:

HD钱包密钥的命名规则由路径来标识,每一级通过“/ “分割。主私钥派生出得私钥以“m” 开头,主公私钥派生出得私钥以“M”开头,“/”后数字表示第几个子密钥。如,m/x/y 就是m/x的第y个子密钥。

m/0’标示硬化子辈,在某数字加一瞥即标示该子辈的生成方式经过加密处理,无法通过子密钥反推出其母密钥,为了可以让该层级下的密钥可以在非安全环境中导出可用公钥。

  • BIP-44

基于BIP-32,对每层树状结构赋予了特殊含义,制定了多币种HD种子生成规则,指明预定义了五个层级,也是目前钱包大多数采取的HD种子标准

m / purpose’ / coin_type’ / account’ / change / address_index

以m/44'/60'/0'/0/0(imToken,MetaMask,Jaxx,MyEtherWallet,TREZOR,Exodus)标准为例:

coin_type具体编号详见:

https://github.com/satoshilabs/slips/blob/master/slip-0044.md

故m/44'/60'/0'/0/0的含义为:第一个以太坊账户的私钥

  • 现有以太坊客户端路径实现
  1. m/44'/60'/0'/0/x: imToken(可以自定义路径),MetaMask,Jaxx,MyEtherWallet,TREZOR,Exodus
  2. m/44'/60'/x’/0/0:KeepKey,MetaMask
  3. m/44'/60'/0'/x:Electrum,Ledger Chrome App
  4. m/44'/coin_type’/account’/0:Coinomi

3.4 钱包种子生成方式及原理

BIP-39:定义了助记词编码和种子的生成过程,种子的生成过程分为9步

  • 创建一个128位到256位的随机序列(尽可能保证随机性)
  • 取SHA256结果长度/32位,创建随机序列校验和
  • 将校验和加入到随机序列末尾
  • 生成序列分为12部分,每部分为11位( [128位随机序列/32+128]/12=11 )
  • 从预定义的2048单词表中将每一个11位的值映射到一个单词上
  • 生成助记词
图3.5 助记词生成方式

当随机序列长度不同时,生成助记词数量也会有所不同

从备份的助记词数量便可以反推回随机序列位数

  • 密钥拉伸函数 PBKDF2 的第一个参数为第六步中生成的助记词
  • 密钥拉伸函数 PBKDF2 的第二个参数,用户提供的密码字符串(盐),与助记词拼接(保证用户私钥安全,但是遗忘密码会造成资产丢失)
  • PBKDF2 使用 HMAC-SHA512 算法进行了 2048 轮哈希运算对助记词和盐进行拉伸,生成一个 512 位的值作为最后的输出。这个 512 位的值就是种子
图3.6 从助记词生成钱包种子

为了与其他钱包进行兼容,通常HD钱包不会在种子生成过程中添加用户设置的密码字符串(盐)。

这里可以体验到完整的种子生成过程:https://iancoleman.io/bip39/

第四章 附录

4.1 现有非确定性钱包及HD钱包统揽

图4.1 HD钱包及非确定钱包统揽

4.2 常见问题

  • imToken,Trust等钱包仅支持ETH及ERC20 Tokens,为什么钱包种子也为HD钱包格式?

目前主流钱包均采用HD钱包格式,为了与更多HD钱包兼容,imToken等以太坊钱包选择采取HD钱包种子格式

  • 在HD钱包中,为什么同一种数字货币会有多个地址?

为方便用户使用,保证资产安全匿名性。HD钱包允许用户窗户创建多个子地址,相同数字货币地址在同一树层级

  • 钱包地址发生异常转账,应该怎么做?

钱包出现资产减少,或发送异常转账,应第一时间创建并备份一个全新钱包地址,并将资产转移至全新地址。

  • 如果助记词导入时发现错误,有没有办法找回?

如果是助记词抄写错误,可以通过助记词词码表,尝试相近单词进行导入;如果助记词缺少遗忘将没有办法导回资产,造成资产丢失。

[助记词词码表]https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt

  • 为什么一些去中心化钱包仍需要进行注册登陆?

衡量一个去中心化钱包最重要的是钱包私钥能否能够备份,用户是否可以切实实时掌握自己的数字资产。需要注册登陆有利用钱包和用户建立联系,提供用户服务水平。

有些钱包采用中心化及HD钱包两种模式,给用户更多选择。

  • 为什么HD钱包中大多不能生成更多的ETH钱包地址?

由于ETH地址下通常会存在多种Token,用户在生成新钱包后,难以实现ETH及Token共同转换,而BTC/BCH采取UTXO结构,用户在生成新地址后可以方便的在转账后将资产转移至新地址中。

  • 为什么在HD钱包中显示资产总量会分散在多个地址中?

由于BTC/BCH采用UTXO结构,用户在发送交易时,一笔交易的发送方可以为多个地址,所以会出现分散在多个地址的情况。而ETH在HD钱包中通常没有多个地址的情况。

由于BCH近期发布了WHC(虫洞协议),可以利用虫洞协议生成Token,会造成类似ETH的Token情况出现,币客钱包为此做出优化,将交易找零部分尽量放在WHC所在地址,避免了用户出现钱包有余额,但是无法转账WHC的情况。

引用
【BIP-32】https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki

【BIP-39】https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki

【BIP-44】https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki

【ethereumbook,wallets】https://github.com/ethereumbook/ethereumbook/blob/develop/wallets.asciidoc

--

--