Github地址:https://github.com/Bytom/bytom% ^* p6 m# |2 X) H+ I1 x
Gitee地址:https://gitee.com/BytomBlockchain/bytom
背景知识0 s; M1 w% q! C' A, F, D) d
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub2 ~1 ^; B5 g% Y: g; p
预备- I( T+ U9 x/ W/ z- _& b- y: f
代码修改
首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码 。; Y- f+ L* P+ L, n
在 bytom/blockchain/pseudohsm/pseudohsm.go 中的; u( H8 H3 P6 V) ?8 c
func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)
添加输出打印 root XPub 对应的 私钥 和 公钥$ A4 U5 t) P5 D% c$ B9 O, B
func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error) {
// Generate a Bip32 HD wallet for the mnemonic and a user supplied password
seed := mnem.NewSeed(mnemonic, ""): Q2 P# B& B$ a1 n5 v; I; ~
xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))+ X: y- F$ L0 F. A0 E9 j5 B
if err != nil {4 R& ~1 B# l8 H. n0 v; `; _
return nil, err
}
2 h% W* N( \. W9 u; ]0 N) o( [
fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing
fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing
id := uuid.NewRandom()% {& F8 R3 C# t) ^: y' d# i$ x
key := &XKey{: j6 Y/ ^5 O' [ D" v3 E, k/ a
ID: id,
KeyType: "bytom_kd",/ x# X5 A) S; e6 F0 K6 ~8 j
XPub: xpub,$ y5 Y, ?! T: b8 S2 s
XPrv: xprv,. |7 X! H/ g) g/ G
Alias: alias,
}
file := h.keyStore.JoinPath(keyFileName(key.ID.String()))
if err := h.keyStore.StoreKey(file, key, auth); err != nil {
return nil, errors.Wrap(err, "storing keys")5 d2 w8 b' e3 E' ^7 g2 I; P
}
return &XPub{XPub: xpub, Alias: alias, File: file}, nil
}/ u/ D3 T, X& D8 a
工具准备
因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman 。. n8 A i5 w' e3 i
获取密钥对应助记词& ]. e0 {1 p" h
dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。 a: v) R& u) m* l& n6 S) V: d6 \
因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。* x' S% o B- F! e/ h" G
对 bytomd 发起 post 请求 /create-key
{" I/ c- y' t1 n- y( P4 s
"alias": "create_key_test",
"password": "createkeytest",
"language": "en"
}& |/ d" m. a" P+ x
可以看到 响应中 显示了 xpub 和 助记词; E# O) D" d5 A0 E# V
由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub
. H+ J6 }3 O7 K/ O+ q% x4 m( a1 ?. R
步骤' }6 L1 t1 ~2 K3 T% c, `5 [
如何通过导入助记词恢复密钥呢?! N( u+ k3 x' @( `" P
假设目前 已经有一个 xprv
50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc
对应的 助记词为
pudding
room4 J. A) ~3 {0 o* |9 U
business
river
pattern
box9 A6 b a/ r0 X/ `3 q2 g* L
snap
merit+ {8 B& \$ }3 t" u8 d
unfold6 }3 D7 x1 M6 I4 ~; G5 U1 K
speak& R* P& b5 Y7 R, E+ B
hat
task
发起 post 请求 /create-key
{
"alias": "nnemonic_test",
"password": "nnemonicnnemonic",
"nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",* F4 l- a0 j8 w3 Q9 o$ W
"language": "en"
}) n& m& E' I7 R5 n2 @- }! z
返回相应:
' d2 s, P; Z) N1 S1 C
bytomd 输出
% A P0 ?( v) Q) O8 }/ c
可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。
dashaboard 中也能见到我们恢复的 密钥。