钱包顾名思义是存放$$$。但在虚拟货币世界有点不同,个人账户资讯(像是我有多少钱)是储存在区块链上,实际存在钱包中的是个人账户对应的 key。有了这把 key 我就能够在虚拟货币世界证实个人身份、就能够更改我账户的状态(像是送钱给别人)。这样来讲,虚拟货币钱包其实是管理和储存 key 的工具。这把 key 就是个人私钥,而账户是从个人公钥衍伸出来。git
-Ledger 虚拟货币钱包-github
BIP 全名是 Bitcoin Improvement Proposals,是提出 Bitcoin 的新功能或改进措施的文件。可由任何人提出,通过审核后公布在 bitcoin/bips 上。BIP 和 Bitcoin 的关系,就像是 RFC 之于 Internet。算法
而其中的 BIP32, BIP39, BIP44 共同定义了目前被普遍使用的 HD Wallet,包含其设计动机和理念、实做方式、实例等。npm
-BIP32 定义的 HD Wallet-浏览器
rose rocket invest real refuse margin festival danger anger border idle brown
安全
m / purpose' / coin_type' / account' / change / address_index
架构
其中的 purporse'
固定是 44'
,表明使用 BIP44。而 coin_type'
用来表示不一样币种,例如 Bitcoin 就是 0'
,Ethereum 是 60'
。ide
Ethereum 的钱包目前均采用以上 Bitcoin HD Wallet 的架构,并订 coin_type'
为 60'
,能够在 ethereum/EIPs/issues 中看到相关的讨论。举例来讲,在一个 Ethereum HD Wallet 中,第一个账户(这里的账户指 BIP44 中定义的 account'
)的第一组 keypair,其路径会是 m/44'/60'/0'/0/0
。工具
使用的 JavaScript 套件包含:区块链
npm install bip39 ethereumjs-wallet ethereumjs-util --save
var bip39 = require('bip39') var hdkey = require('ethereumjs-wallet/hdkey') var util = require('ethereumjs-util')
var mnemonic = bip39.generateMnemonic()
取得的 mnemonic code 会像:
rose rocket invest real refuse margin festival danger anger border idle brown
先将 mnemonic code 转成 binary 的 seed。
var seed = bip39.mnemonicToSeed(mnemonic)
使用 seed 产生 HD Wallet。若是要说更明确,就是产生 Master Key 并记录起来。
var hdWallet = hdkey.fromMasterSeed(seed)
产生 Wallet 中第一个账户的第一组 keypair。能够从 Master Key,根据其路径 m/44'/60'/0'/0/0
推导出来。
var key1 = hdWallet.derivePath("m/44'/60'/0'/0/0")
使用 keypair 中的公钥产生 address。
var address1 = util.pubToAddress(key1._hdkey._publicKey, true)
取得的 Address:
685ce4cbdd5c19b64ca008cb85b83947e5318efa
Ethereum 很贴心,为了不你们打错 address(致使把钱送错人),Ethereum 让 Address 变得比较难打?!总之通常会用 EIP55: Mixed-case checksum address encoding 再进行编码。许多钱包也支援用户输入没通过编码的 Address,那就会跳过 checksum 机制,建议仍是使用编码过的 Address。
address1 = util.toChecksumAddress(address1.toString('hex'))
最后取得的 Address 会像:
0x685ce4CbDd5c19b64CA008cB85b83947e5318EFA
输入 mnemonic code
-产生 Address、公钥、私钥,结果和我取得的 Address -
把 mnemonic code 记录下来好好保存,就会是一个冷钱包(指不连网路的钱包,因此安全不少)。可使用产生出来的 address 收 Ether 或任何 REC20 Token。要送钱的话,能够汇入到任一个支援 Ethereum HD Wallet 的钱包。经常使用的 Ethereum HD wallet 像,在浏览器使用的 MyEtherWallet、MetaMask 和在手机使用的 imToken 等。
-MetaMask-
相信你们都了解了,有 mnemonic code 就能够产生 HD Wallet 中全部的 keys。有了 keys 就能够任意送钱包中的 Ether 或 Token 给别人。因此 mnemonic code 很重要!!!那这么重要的东西保存在浏览器不会很危险吗?我便研究下我经常使用的 MetaMask 浏览器钱包。MetaMask 将加密后的 mnemonic code 存在浏览器的 Local Storage(一块只存在 Local 且不会过时的资料区块)。加密使用用户另外输入的密码,再汇入时会要求用户设定密码(如上图),而每一次从新开启钱包都会要求输入密码。解密算法有 Open Source,也有线上 Live Demo。
-MetaMask Local Storage-
感谢 Jiyi 大大提供密码学专业知识,虽然详细的数学计算本篇没有提到,但让我有底气的完成这篇文章。
做者: 安德森_Anderson
本文首发于简书,EthFans 经做者受权后转载。