以太坊HD钱包开发 二 —— BIP协议介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bondsui/article/details/85780675

以太坊HD钱包开发 一 —— 钱包概念介绍
https://blog.csdn.net/bondsui/article/details/85780452

以太坊HD钱包开发 二 —— BIP协议介绍
https://blog.csdn.net/bondsui/article/details/85780675

以太坊HD钱包开发 三 —— 代码实现
https://blog.csdn.net/bondsui/article/details/85780940

4、BIP协议

BIP:Bitcoin Improvement Proposals 比特币改进建议

BIP32 通过一个随机种子,提出的为了避免管理一堆私钥的麻烦提出的分层推导方案。HD钱包(Hierarchical Deterministic Wallets)

BIP39 通过定义助记词让种子的备份更友好。

BIP44 BIP32的分层增强了路径定义规范,同时增加了对多币种的支持。

ganache钱包示例,如何备份?

Available Accounts
==================
(0) 0xfef3d415f66464c3b38e10fd5f31edbead7be44b (~100 ETH)
(1) 0xfc26f518d2f7091667dbdd81ee04d1f17d122359 (~100 ETH)
(2) 0x5e7363aa3c0669083a554dde5ed548a8ec90ff12 (~100 ETH)
(3) 0x57060a8a16bff2615769282eb83d1b50891f04a9 (~100 ETH)
(4) 0xc1f109c747e70bbc85371bcb6fbdc8fe23219da9 (~100 ETH)
(5) 0x3d25841411dd7917c123d980f4dd33cad101cc31 (~100 ETH)
(6) 0x9b477be361d60597e24dd7838d29f706396a3fa1 (~100 ETH)
(7) 0x8adffcabe036474de3a6d6f513bfd6df19fbcc1f (~100 ETH)
(8) 0x2394c966264c3794247136637e0dc9924dfad3d7 (~100 ETH)
(9) 0xbf513ae069d7a58eb4d0f8c6e17402dbe2cc1bee (~100 ETH)

Private Keys
==================
(0) 0x7c70eaea87e3d568bfcc8758ef9038b2ec640bc86130742a9a5154c5487bb033
(1) 0x7591240850e02d42f00f967aa836bf80c85a8022549a3a37fdc45efdc07db310
(2) 0xd29e3e156168928940d2f2f15a30821b4513919ec0d46aeb3df6c9eb98039ba3
(3) 0xfeb9ea90fe450517044c3d36d199aa2ee8fb81814fce1e1b9f470ebbe7a4fbb0
(4) 0x34c8c7173a5ef0b723aae65a6819aff5c740a8d73a47f1beba8b6e6a31529cc2
(5) 0xfa1cc9d7fd124bfa67b5efc59ef8563139690a634af1e74434902d604228aec8
(6) 0xb98ec5a0902400cc3248046fd869f6e533ec9e05af63f72ca98d2618c6d92b58
(7) 0x3d18f2267377dbafa797aa2e59382e60bee47368c234b5e14e4c3cab40b2adce
(8) 0xc09ceed4ddb30bffe0626c1c2663fe5acf80e0f1eb9fa8eeed09172b84c00faa
(9) 0xcd2d8a951d2d94c264ba8ad86e23d4751a3ede513131bf19b5c7f566443d8af0

HD &BIP32 提议

BIP

根据一个随机数种子通过推导方式得到n个私钥。存储仅需一个种子就可以推导出私钥

https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki

协议名称:Hierarchical Deterministic Wallets-HD

  • 更好的保护隐私性

  • 多账号备份麻烦,如果钱包100个账号

hd钱包推导过程

image-20181226235743427

BIP39-助记词

https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki

BIP32 避免保存一个用户的多个私钥,可以仅保存一个随机种子,而随机种子为一串16进制数据,进行冷备份不变。

BIP39 :使用助记词通过算法生成种子,这样用户只需要记住12个单词即可(12-24个)

随机种子

b052ba6a0f2212a003c6b59739ddfff1ee54031041a30a341ab7f26c7319807ca12233e1cc0f8948573e9a83f4e3bd89313627de852f41f719b481af69bb0adb

助记词

disorder timber among submit tell early claw certain sadness embark neck salad

回顾 我们已经用过的,启动ganache-cli命令

ganache-cli -m 'disorder timber among submit tell early claw certain sadness embark neck salad' 

回顾 小狐狸导入账户

导入成功

image-20181227034143356

助记词流程:

  1. 生成一个128位随机数
  2. 对随机数做的校验4位
  3. 随机数+校验码=132位数
  4. 按每11位做切分,得到array[12]
  5. 助记词表中查询
  6. 得到12个单词为助记词
  7. 通过助记词+salt(mnemonic+可选密码)
  8. 进行HMAC-512哈希
  9. 得到512bit的随机种子

单词表(支持中文

https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md

demo

BIP39协议-js

https://www.npmjs.com/package/bip39 6个函数

npm install --save bip39

demo-01bip39.js

const bip39 = require('bip39')

var wordList = bip39.wordlists.chinese_simplified

// 生成助记词
var mmic = bip39.generateMnemonic(128, ctypto.randomBytes, wordList)
console.log("生成的助记词为:", mmic)

var mmicHex = bip39.mnemonicToSeedHex(mmic)
console.log("生成的助记词为:", mmicHex)

// 通过助记词生成种子
var seed = bip39.mnemonicToSeed(mmic, "your password")
console.log("随机种子:", seed)

var validate = bip39.validateMnemonic(mmic,wordList)
console.log("合法?", validate)
console.log("修改后合法?", bip39.validateMnemonic(mmic + " ",wordList))

// 助记词转换
if (validate) {
    var hex = bip39.mnemonicToEntropy(mmic,wordList);
    console.log("加密后的助记词:", hex)
    mmic = bip39.entropyToMnemonic(hex,wordList)
    console.log("转换后的助记词:", mmic)
}

执行结果

生成的助记词为: 丝 卵 呼 碍 载 快 赖 邦 权 个 督 吾
生成的助记词为: 589044554643555c78b40c7b4aa756f018f03e16d4b2bf5bb1af5a8799b512cec350b129fa60186267478ebcc462cefbb3bba5e7273017465cd15bf3
随机种子: <Buffer bf 87 c9 21 49 8a 06 c6 8b eb 0d 96 87 66 ff a1 cf af 14 49 cb 21 99 2d 83 45 53 da0 21 21 4b f7 17 9c 89 68 a3 6d 4c b0 e2 15 39 20 f1 11 a9 d3 ... >
合法? true
修改后合法? false
加密后的助记词: 589991cf5cd56671383566256039c5f6
转换后的助记词: 丝 卵 呼 碍 载 快 赖 邦 权 个 督 吾

BIP39协议-go-浏览即可

  • bip32 分层确定性钱包 创建账号
  • bip39 助记词 备份账号
  • eth账户导入导出的功能
  • go语言编写,基础回顾

BIP32相关函数

// 生成随机数种子
seed, _ := bip32.NewSeed()

// 生成 masterkey
masterKey, _ := bip32.NewMasterKey(seed)

// 通过masterkey得到privatekey
childIdx = 0;
privateKey, _ := masterKey.NewChildKey(childIdx)
//通过childkey 得到publickKey
publicKey := privateKey.PublicKey()

demo-bip32.go

/*
@Time   :   2018-12-27 01:32
@Author :   suibingyue
@File   :   demo-bip32 分层确定性钱包
*/

package main

import (
	"fmt"
	"github.com/tyler-smith/go-bip32"
)

func main() {
	// 随机种子
	seed, _ := bip32.NewSeed()
	// 生成 masterkey
	masterKey, _ := bip32.NewMasterKey(seed)
	fmt.Println("masterKey:", masterKey)

	accounts0 := genAccountsFromMasterKey(masterKey)
	genAccountsFromMasterKey(accounts0[0])
}

// 根据种子生成账户
func genAccountsFromMasterKey(masterKey *bip32.Key) []*bip32.Key {

	// 存储账户key
	var privKeys []*bip32.Key
	var pubKeys []*bip32.Key

	for i := 0; i < 3; i++ {

		// 得到childkey
		privKey, _ := masterKey.NewChildKey(uint32(i))
		//通过childkey 得到publickKey
		pubKey := privKey.PublicKey()

		privKeys = append(privKeys, privKey)
		pubKeys = append(pubKeys, pubKey)
	}

	fmt.Println("\n Public keys,深度为", pubKeys[0].Depth)
	for index, key := range pubKeys {
		fmt.Printf(" %d %x\n", index, key.Key)
	}

	fmt.Println("\n Private keys 深度为", pubKeys[0].Depth)
	for index, key := range privKeys {
		fmt.Printf(" %d %x\n", index, key.Key)
	}
	return privKeys
}

bip39相关函数

	// 生成随机数
	entropy, _ := bip39.NewEntropy(256)
	// 生成助记词
	mmic, _ := bip39.NewMnemonic(entropy)
	// 根据助记词密码生成种子
	seed := bip39.NewSeed(mmic, "suibingyue")

demo-bip39.go

package main

import (
	"fmt"
	"github.com/tyler-smith/go-bip32"
	"github.com/tyler-smith/go-bip39"
)

func main() {
	// 生成随机数
	entropy, _ := bip39.NewEntropy(256)

	// 生成助记词
	mmic, _ := bip39.NewMnemonic(entropy)
	fmt.Println("生成的助记词 ", mmic)

	//根据助记词密码生成随机种子
	seed := bip39.NewSeed(mmic, "")
	fmt.Printf("生成的 seed %x \n", seed)
	// 根据随机种子生成主key
	masterKey, _ := bip32.NewMasterKey(seed)
	fmt.Printf("生成的 masterKey %x \n", masterKey.Key)

	fmt.Println("===电脑不安全,写进我的日记本里====")

	fmt.Println("导入的助记词 ", mmic)
	seed2 := bip39.NewSeed(mmic, "")
	fmt.Printf("导入的seed %x \n", seed2)

	masterKey2, _ := bip32.NewMasterKey(seed2)
	fmt.Printf("导入的 masterKey %x \n", masterKey2.Key)
}

执行结果


有了masterKey,我们就可以使用BIP32协议,根据mastKey创建HD分层账号

同一个包下,执行失败?

image-20181227045454070

原因分析:go文件编译运行过程 build -> run

image-20181227045730313

解决办法 进入到根目录,执行*go build .go,执行完成后,会生成两个可执行文件,执行即可

或者*go run .go

注意,同一个包下只能有一个main函数

➜  gowork cd src/go6eth钱包 
➜  go6eth钱包 go build *.go
➜  go6eth钱包 ls
demo-bip32             demo-bip39助记词.go
demo-bip32.go          go6eth钱包
➜  go6eth钱包 ./go6eth钱包 

BIP44 规范

为分层确定性钱包定义的一个逻辑层次结构规范,大部分币种,基于BIP32

https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki

Path levels:

m / purpose' / coin_type' / account' / change / address_index

有了HD分层钱包,钱包备份就无需备份多个私钥,只需备份一份随机种子的文件即可。

猜你喜欢

转载自blog.csdn.net/bondsui/article/details/85780675