Github地址:https://github.com/Bytom/bytom
Gitee地址:https://gitee.com/BytomBlockchain/bytom# @, p; W; h8 x- n" x
背景知识& S( P& _% H+ T7 K, x" E# M- H1 h
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub
预备
代码修改) P1 e7 x# w! ~; u7 Z3 a/ O- v( T. w
首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码 。
在 bytom/blockchain/pseudohsm/pseudohsm.go 中的/ k K# r$ O/ l. V3 o3 {3 g
func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)
添加输出打印 root XPub 对应的 私钥 和 公钥
func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error) {- O7 y( Y2 a! A( d% @0 v3 ~5 h4 C' x
// Generate a Bip32 HD wallet for the mnemonic and a user supplied password
seed := mnem.NewSeed(mnemonic, "")
xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))5 T( S0 K: d- O) x' i2 l# Q
if err != nil {
return nil, err/ e3 K9 v0 Z- N: U% u
}
* q4 t$ P% d1 x! H# K% M
fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing
fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing
id := uuid.NewRandom()' `& Y+ A/ @$ Q! \$ a- K
key := &XKey{- }. l# ]9 P a2 x5 k5 D( G8 ]
ID: id,
KeyType: "bytom_kd",' E9 i- a8 C0 r9 {- U
XPub: xpub,
XPrv: xprv,
Alias: alias,& i6 A$ Z6 j5 ?1 b9 F: c- }
}4 \5 L {! e" b3 e; z+ c
file := h.keyStore.JoinPath(keyFileName(key.ID.String()))
if err := h.keyStore.StoreKey(file, key, auth); err != nil {$ G1 Y% J' P0 l
return nil, errors.Wrap(err, "storing keys")
}5 D/ H; O. z: P2 m \& {6 U
return &XPub{XPub: xpub, Alias: alias, File: file}, nil3 _/ P* q1 {1 s0 i
}/ g. \0 w1 Y4 l
工具准备: l' [7 u/ e! h' c# {: P; g) D
因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman 。
获取密钥对应助记词, @3 [1 V m! J/ A( i# L9 N
dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。
因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。% C# `3 k/ X& ^* r
对 bytomd 发起 post 请求 /create-key2 @ y: N" u2 A# n3 r8 H$ _0 O
{& y6 K, _% q% `" S
"alias": "create_key_test",: M8 W( O; m. M2 Y' m: O. c
"password": "createkeytest",6 D: s. Z( h( C
"language": "en"
}
& l9 d2 l/ q' G
可以看到 响应中 显示了 xpub 和 助记词# d; r1 F* I' b- n5 k0 z5 k
由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub
步骤
如何通过导入助记词恢复密钥呢?
假设目前 已经有一个 xprv0 C+ L; Q6 X/ f8 X
50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc2 T& a( }& f% a. O+ E4 g
对应的 助记词为" K4 e6 e) `9 g: @
pudding
room
business
river8 c9 [# N! g5 j; H1 X" Q5 O
pattern- S; W" Q" a$ ?, i" @- `1 |1 J- U8 ]
box
snap
merit
unfold
speak3 v7 n$ C# ~& c
hat
task
发起 post 请求 /create-key/ \. }/ A; f1 K
{" J( c0 p6 C* |. S( F
"alias": "nnemonic_test",
"password": "nnemonicnnemonic",0 i! |7 b4 N2 D1 v
"nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",
"language": "en"
}
返回相应:
/ a/ E* M+ k! F% a# {' [) l
bytomd 输出
可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。
dashaboard 中也能见到我们恢复的 密钥。