Github地址:https://github.com/Bytom/bytom/ D' w: Q; \' P' q5 q
Gitee地址:https://gitee.com/BytomBlockchain/bytom1 T4 m' ^8 I4 L+ Q" f. N& Z" Q
背景知识! w) o1 M# v% M/ y9 t; w
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub" Q8 M, T. Q v8 O; @
预备
代码修改1 `$ z, X, |% i# b5 N7 r, U: _* v
首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码 。+ D: S* s5 g) H; `; P4 T
在 bytom/blockchain/pseudohsm/pseudohsm.go 中的5 s) `; t* v+ @% l3 l1 D
func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)3 m: [+ @/ T% N4 E8 O
添加输出打印 root XPub 对应的 私钥 和 公钥
func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error) {3 ~ r' Z( i6 e( S. Y
// Generate a Bip32 HD wallet for the mnemonic and a user supplied password' A3 t- M! k: |; r1 r, u5 J& ~
seed := mnem.NewSeed(mnemonic, "")
xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))& N8 I+ E8 p+ S" ]' t7 I3 C
if err != nil {
return nil, err
}
fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing
fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing- d; q6 p) q! y( o1 o( ~! ]9 U: B
id := uuid.NewRandom()' y1 Z( ~+ N+ U' m, b. @
key := &XKey{
ID: id,+ n0 r' J- u" ]5 o
KeyType: "bytom_kd",9 }5 w, k4 U, i( c" [2 @
XPub: xpub,% K' T0 g' ^8 g+ d( k
XPrv: xprv,
Alias: alias,
}& { d7 ]( i* F! b6 x
file := h.keyStore.JoinPath(keyFileName(key.ID.String()))
if err := h.keyStore.StoreKey(file, key, auth); err != nil {7 I; u, t6 k5 P
return nil, errors.Wrap(err, "storing keys")6 n/ U4 P, Z6 P1 d6 Z" J
}$ M, b0 Y; v: m$ ~) _8 B R" }
return &XPub{XPub: xpub, Alias: alias, File: file}, nil
}$ K0 F2 ^: z7 o" B' K. `( y Y* }
工具准备0 T/ U( U' z( n+ j' P% J- S% T
因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman 。% E5 t2 J5 ?) A% o( Q- S
获取密钥对应助记词. C) i$ Y9 U1 |* z/ j# c F# e
dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。: p$ {1 ^5 Y6 W/ M
因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。
对 bytomd 发起 post 请求 /create-key
{8 I% ?4 r( v/ ~* R
"alias": "create_key_test",5 D7 q3 O, r! G# M
"password": "createkeytest",
"language": "en"1 ^0 u$ n1 e0 Y; ~4 {5 J2 Z( z
}
1 n8 U+ P- y/ z/ u# M6 u/ {5 @2 C: W
可以看到 响应中 显示了 xpub 和 助记词 S, P8 D+ c' y
由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub
% I( m) l! {3 S& S% a
步骤7 s+ W& G6 x5 ?
如何通过导入助记词恢复密钥呢?
假设目前 已经有一个 xprv! Q$ `4 h# n( n) A
50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc% t, M w/ j4 J" Y M
对应的 助记词为 {! _" S+ M- z7 D: U
pudding
room- n5 Y+ u' T J- l
business$ T' L$ a2 `3 u+ }8 G
river
pattern3 C, I3 Z! h5 x( m
box' N" I l$ j2 C" u2 V
snap
merit
unfold
speak, r" P& \7 h( p3 J
hat
task2 U; ]; o4 @% @. h! b9 ]( J
发起 post 请求 /create-key: G) w: g# H: H* R, ~: \9 m
{
"alias": "nnemonic_test",5 a2 ~% @, C0 p/ l
"password": "nnemonicnnemonic"," x/ j8 P* x! u H
"nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",' P4 o# c' [) G& `4 F2 {9 n- O f
"language": "en"
}* p/ v/ ^& X# r8 b2 @
返回相应:
3 }6 `( ]0 [: W" I! e
bytomd 输出; u% h& Y/ b: x* a
$ s$ z" G6 n- H |# a7 C. K$ [
可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。2 u" c$ a0 s# b: E K1 G
dashaboard 中也能见到我们恢复的 密钥。