以太坊bip39助记词
1. 什么是HD钱包
简介
HD Wallets:全称Hierarchical Deterministic Wallets,中文名称分层确定性钱包,是目前广泛使用的虚拟货币钱包标准。下面我就来给大家讲讲HD Wallets的工作机制以及开发原理。
BIPS
BIPs 全名Bitcoin Improvement Proposals,是提出 Bitcoin 的新功能或改进措施的文件。详情可见: https://github.com/bitcoin/bips
BIP32, BIP39, BIP44 共同定义了目前被广泛使用的 HD Wallets,包含其理念、设计动机、实现方式、实例等。定义Hierarchical Deterministic Wallets。通过种子来生成主私钥,然后派生海量的子私钥和地址。
BIP39:Mnemonic code for generating deterministic keys
将 seed 用方便记忆和书写的单词表示。一般由 12 个单词组成,称为 mnemonic code,中文称为助记词。
符合BIP39标准的助记词可以是 3个、6个、9个、12个、15个、18个、21个和24个单词。它们所对应的强度分别是:2048(3次方) 、2048(6次方) ... 2048(24次方) ,一般采用12个单词,强度为:2048(12次方)
BIP32
HD Wallets从一个 seed 生成一个树状结构储存多组 keypairs(私钥和公钥),进而根据树状结构具体结点上的keypair生成具体的钱包(如BTC钱包、ETH钱包)。
分层是指一个seed可以生成一个有层级关系的树状结构储存多组keypairs,子节点是由父节点根据一定的算法派生出来的。 例如,一个大公司可以为一级部门生成不同的私钥,一级部门可以再为自己的二级部门生成不同的私钥。由于二级部门的私钥是由所属的一级部门的私钥派生的,每个一级部门可以拥有管理自己二级部门私钥的权限,即可以花里面的币。也可以只给会计人员某个层级的公钥,让他可以看到这个部门的收支记录,但不能花里面的钱,使得财务管理更方便了。
BIP44:Multi-Account Hierarchy for Deterministic Wallets
基于 BIP32 的系统,赋予树状结构中的各层特殊的意义。让同一个 seed 可以支持多币种、多帐户等。
各层定义如下:
其中的 purporse' 固定是 44',代表使用 BIP44。而 coin_type' 用来表示不同币种,例如Bitcoin就是 0',Ethereum是60'。
例如:
m/44'/0'/0'/0/0代表一个BTC钱包path
m/44'/60'/0'/0/0代表一个ETH钱包path
生成HD Wallets钱包的过程简单来说以下4步就可以搞定:
HD Wallets钱包的优势有哪些?
1)方便备份;
2)在不同的应用间使用;
3)可同时管理多个钱包;
4)可同时管理多种币;
5)支持分层的权限控制;
6)可实现私钥离线存放,更安全。
2. 一文看懂钱包助记词和根私钥的关系
在最近的《区块链核心成员》的课程答疑中,讲师讲的最多的还是加密货币的密码机制。其中有好几个问题是关于私钥和助记词的。比如:
简单地说,私钥就是一个256位的随机数。这个随机数的产生是钱包功能之一。也就是说,钱包内置了密码级别的随机数产生器,保证产生的随机数是没有规律可循的,也就是说不易破解的。注意钱包是在用户终端运行的,产生的私钥就保存在用户终端,不会也不应该上传给钱包公司。这一点非常重要。大家尽量要使用开源的,被公开考验过的钱包软件,保证安全。
进一步说,现在的绝大多数钱包都是确定性钱包,它首先产生一个根私钥,而后根据这个根私钥可以产生无数的派生私钥,我们的钱包地址就是这些派生私钥所对应的公钥经过运算得到的地址。算法是固定的,因此地址也就是固定的。那么,这里,最重要的就是根私钥了。因为有了根私钥,根据固定的算法,就可以求出派生私钥,一切都可以简单地计算出来。
这里注意,根私钥不一定要是256位的。可以是128位,或196位或其他位数,只要强度足够大(一般要求至少128位)就行,而由其计算出来的派生私钥则一定是256位的。
根私钥与助记词是一一对应的关系。也就是说一个根私钥就对应一组助记词,一组助记词也对应一个根私钥。两者可以简单运算出来。
根私钥与助记词之间的对应关系可以查看 BIP39 (BIP的意思是比特币的改进建议,BIP39是正式发布的第39号建议)。BIP39是一部字典,这个字典有各种语言版本,我们最感兴趣的就是中文版了。当然还有英文,韩文,德文,法文,日文等等。这个字典什么样呢?很简单,每本字典都是一个模子,都包含2048个常用字(比如中文版)或单词(比如英文版),不多不少,就是2048个。每个字都有一个编号,从0到2047,就这么多。其他啥也没有。
那么这个字典表示什么呢?就是表示一个对应关系,也就是说通过字可以查编号,或者通过编号可以查到字。
好了,学过计算机或者了解2进制的朋友,当然知道2048(0~2047)意味着什么,很简单,就是2的11次方,也就是说11位2进制数可以表示0到2047。其实这就是助记词和根私钥的关系。
也就是说每一个字表示一个11位2进制数,或者说一个11位2进制数通过查字典就知道它表示哪个字。举个例子来说,我们产生了一个128位的根私钥,这样从头开始,每11位11位地分开,这样我们就有了11个11位二进制码,还剩下7位,咋办?好办。把最后7位也凑成11位就行了,差4位就补上。这4位正好可以为128为做校验来保证正确性。整个过程是这样:
那助记词回推私钥也就简单了,这样:
更多细节可以参看我的文章:
数字货币入门 之 钱包原理及钱包安全
3. 一个助记词为什么可以生成多少个以太地址
很多个。一个助记词可以生成多个以太岩弯地址。是因为以太坊采用的是备枣谨基于BIP39标准的助记词生成方案。这种方案使用了一仿基种称为“确定性钱包”的技术,即通过一个种子(由助记词生成)来生成多个密钥对,每个密钥对对应一个以太地址。
4. btc ETH钱包助记词组合多少亿
BIP39词库里面一共有2048个单词,如果我们从中选择24个单词作为助记词的话。那么把这2048个单词进行排列组合,那么可以通过公式2048!/(2048-24)!得到。但是这个数量级竟然是10的79次方。10的79次方是一个什么概念呢?
。
宇宙中原子的数量大概就在10的78次方到10的82次方之间。也就是说随机从BIP39词库里面的2048个单词中选择24个进行排列组合,得到的答案的量级和宇宙的原子数量是差不多的等级。
我们要想从这2048个单词中蒙到一个比特币钱包助记词的概率大概是677000000亿除以1*10的78次方,得到的结果是6.77e的-70次方。这是一个非常非常非常小的数字。因此要想从2048个单词里蒙中1个比特币钱包的概率已经是非常非常低了,更不要说蒙到了中本聪的钱包。
当然也不排除运气的成分,万一你一下就中了中本聪钱包的助记词。那么你确实能够瞬间财富自由,而且更重要的是,你还可以骗大家说你就是中本聪。所以,只要你有毅力,有魄力,那么大可以尝试一下。毕竟有一句话说得非常好:梦想还是要有的,万一见鬼了呢。
5. 【概念】私钥、助记词和keystore到底是什么关系
使用了很久的钱包,用得有点诚惶诚恐,钱包除了用于转账外,都不怎么敢动它,怕误操作搞不好就空了,所以大部分都在交易所,不敢提。这也间接印证了李笑来老师的一句话:
在申请钱包时,当然看过不少资料,老老实实地记下了私钥、助记词,备份了keystore,还放在两个U盘里备份。但对私钥、助记词和keystore是一知半解的,也不知道他们到底什么关系。如果不是要了解EOS映射,我可能一直不会动钱包,也不会去了解它们。
下面就一个个来好好学习一下这些概念。
私钥是由64位十六进制的字符组成,每个私钥是随机生成的,随机生成这样的字符串有2的256次方种可能,这个数字已经超过了宇宙中原子的个数,用“暴力破解”的方式逐一遍历可能的私钥,幻想能碰到一个有效的且有币的私钥,可以说是不可能,就算是量子计算机也没用。
一个钱包只有一个私钥且不能修改。
在导入钱包中,输入私钥并设置一个密码(不用输入原密码),就能进入钱包并拥有这个钱包的掌控权,就可以把钱包中的代币转移走。
由于私钥64位,长得太难看,没有可读性,而私钥的备份在电脑上复制起来容易,手抄下来就比较麻烦,但私钥保存在联网的电脑上不安全,有被其他人看到的风险,于是有了助记词工具。
助记词是明文私钥的另一种表现形式,最早是由BIP39提案提出,其目的是为了帮助用户记忆复杂的私钥 (64位的哈希值)。助记词一般由12、15、18、21个单词构成,这些单词都取自一个固定词库, 其生成顺序也是按照一定算法而来,所以用户没必要担心随便输入12个单词就会生成一个地址。助记词是未经加密的私钥, 没有任何安全性可言,任何人得到了你的助记词,可以不费吹灰之力的夺走你的资产。所以在用户在备份助记词之后,一定要注意三点:
助记词一般会在你创建新钱包的时候出现一次,后面就再也不会出现了,所以创建新钱包时一定要把助记词抄下来,想办法备份。最好不要用屏幕截图或保存在电脑里,因为只要泄露,获取了你的助记词就等于获取了私钥,你的钱包就成了别人的钱包。
简而言之:助记词等于私钥,绝对不能泄露。
keystore常见于以太坊钱包,是你独有的、用于签署交易的以太坊私钥的加密文件。keystore是一串Json格式的字符串,可以用任何以太坊钱包打开它。keystore必须配合你的钱包密码来使用,备份了keystore同时别忘了备份钱包的密码。
用户可以使用备份的助记词,重新导入imToken之类的钱包工具,用新的密码生成一个新的Keystore,可以用这种方法来修改钱包密码。
助记词=密钥=keystore+密码 !保管好私钥或者助记词不被泄露,或是保存好keystore+记住密码,你才真正拥有了虚拟资产。
再来一个比较形象的比喻。
概念清楚之后,瞬间感觉轻松多了。再也不用担心因为不明白而担心操作失误的问题。最重要的是将私钥、助记词和keystore备份好,尽量离线备份多份,这样才能保证账号的安全。
1、 科普 | 什么是以太坊私钥储存(Keystore)文件?
2、 如何妥善备份你的以太坊钱包?
3、 币圈名词:地址、密码、私钥、助记词,你真的分清楚了吗
4、 「地址、密码、私钥、助记词、Keystore 」那些事
6. 【HD-新钱包】BIP39生成助记词
通过九个步骤即可生成钱包助记词和种子:
> 步骤 1~6 生成助记词
> 步骤 7~9 把前六步生成的助记词转化为 BIP32 种子
(步骤看下图:)
在上面的例子中,我们选取了长度为128位的熵,来生成了有12个单词的助记码。在实际的应用中,熵的长度越长,校验码的长度和助记词的长度也会相应的增长。下图展示了熵数据的大小和助记词的长度之间的关系:
步骤一.随机序列的长度为【128,160,192,224,256】。(熵一定是32的倍数,so熵是16进制数的序列)
步骤二.校验和的长度为【4,5,6,7,8】。(熵/32=校验和)
步骤三+步骤四:随机序列一定是11的倍数,平均划分为不同的11位倍数。
步骤五:与2048个单词的预定义字典作对应。
步骤六:生成助记词的数量:(熵+校验和)/11=助记词的数量。
参考内容:
1、本文部分内容摘自《精通比特币》第一版中译本,特此说明并致谢。
7. BIP39:助记词
BIP39是SEED的生成算法.如果你用过比特币钱包应用,很可能它会为你生成一个助记符。这样的助记符可以用来替代私钥,并且可以被用于生成私钥。用“有意义的”助记词代替无意义的数字,也就是“密语种子”,密语种子更加便于记忆和抄录,它可以转化成适用于BIP32的“数字种子”。构造Script.ScriptType.P2PKH类型的钥匙串KeyChainGroup
DeterministicSeed 第三个参数是密码,默认为空,试着自己加了密码也ok,总之不影响随机熵的创建。从SecureRandom创建随机熵
对string集合进行加盐操作,salt随机,用PBKDF2SHA512加密算法加密.
PBKDF2SHA512 助记词+盐进行2048次sha256每次产生的seed都是不同的!
https://iancoleman.io/bip39/?#english 翻墙查看,把 mnemonic code 记录下来好好保存,就会是一个冷钱包(指不连网路的钱包,所以安全很多)。可以使用产生出来的 address 收送钱。
8. 关于钱包助记词
昨天发生了用户在eostea注册账号后私钥被盗的事件,原因据说是eostea为用户提供了助记词功能,用户可以自己选择助记词,如果用户不输入助记词,就会生成一个默认的私钥。这样的私钥谁都算得出来,用户的账号当然就很容易被控制了。
如果这事属实,说明eostea干的活太不专业了:助记词不该由用户输入。实际上,钱包提供助记词功能是有一套标准的,那就是比特币的BIP39。让用户输入助记词,很容易产生碰撞,就是说不同的账号使用同样的私钥,这是必须避免的。解决的方法是,助记词必须来自一个标准的2048个单词的词库( https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt ),给用户提供的12个助记词(也可以是24个)是系统用强随机函数生成,以保证每个账户取得的助记词都不相同。当用户导入助记词时,钱包要检查用户输入的12个单词是否来自2048词库,不是则拒绝生成私钥。
对于人类来说,记住那一长串私钥太难了,记助记词相对简单些,很多人喜欢用助记词。从 助记词 到 种子 再到 最终的私钥 也是有一套标准的,那就是BIP44(HD钱包)。简单点说,BIP44的关键是私钥的推导路径(derived path),不同币种按照不同的路径生成自己的私钥,BIP44规定比特币的路径是m/44'/0'/0'/0,以太币是m/44'/60'/0'/0,EOS是m/44'/194'/0'/0。只要钱包遵守BIP44,那么相同的助记词在不同的钱包APP里会算出相同的私钥,保证了钱包的兼容性。而且如果用户有多个币种的话,记住一套助记词就可以了,钱包随时随地能为用户生成相应的私钥。
GREATWALLET钱包严格遵循BIP44、BIP39标准为用户生成助记词,记住一套助记词,省去记多个币种私钥的麻烦,非常方便实用。欢迎使用GREATWALLET钱包,访问 http://greatwallet.io 或者 https://greatwallet.io .目前它对手机浏览器支持得还不够好,请使用桌面浏览器。
关于GREATWALLET钱包, 这里 有一篇简单的介绍。
(文中如有错误请同行指正)