Github地址:https://github.com/Bytom/bytom
Gitee地址:https://gitee.com/BytomBlockchain/bytom
背景知识: G8 Z k. x$ b. M8 W8 Y
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub
预备
代码修改
首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码 。6 u+ ]) S0 r8 ?4 ?; o; ^
在 bytom/blockchain/pseudohsm/pseudohsm.go 中的
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) {
// 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 x, ]7 f3 s2 d
if err != nil {& A, }/ m- ?& C8 r; B9 b
return nil, err' D! h9 K6 s; W4 r1 Y
}
) k5 c+ I. W7 V4 v7 R
fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing
fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing; S6 E% t/ ^8 a/ U" b& j
id := uuid.NewRandom()
key := &XKey{
ID: id,
KeyType: "bytom_kd",
XPub: xpub,$ G) u( B1 `( b
XPrv: xprv,% D8 L1 K5 k; d0 z+ V" e5 U
Alias: alias,& b% a _6 G8 ?1 ~2 o# e) Y
}" J: Y! Z: @. R
file := h.keyStore.JoinPath(keyFileName(key.ID.String()))- o5 p+ j) I: `8 A: V/ Q' e
if err := h.keyStore.StoreKey(file, key, auth); err != nil {& f1 s+ H% V' B6 f* W
return nil, errors.Wrap(err, "storing keys")
}! D% f. C6 @+ Z
return &XPub{XPub: xpub, Alias: alias, File: file}, nil
}/ v' Y" t& B7 @( X+ i8 b& s% U
工具准备
因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman 。! L0 z: N$ y7 @/ }
获取密钥对应助记词
dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。
因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。' n+ B: S% \3 W2 A6 [
对 bytomd 发起 post 请求 /create-key
{! P/ z7 Q3 C4 ]% S" p' d
"alias": "create_key_test",
"password": "createkeytest",
"language": "en"
}+ Z% k( [. c' M4 Y: X2 A
可以看到 响应中 显示了 xpub 和 助记词
由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub
步骤' @& M/ ]2 F0 ?9 d- ]5 Q
如何通过导入助记词恢复密钥呢?2 X+ h8 s: h3 b3 Y0 y2 b) R* v
假设目前 已经有一个 xprv
50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc, p" O/ T# }# R( v! p; ~
对应的 助记词为
pudding
room
business5 C$ i7 Q8 E2 q; u' D
river+ A! J7 A. m% S- V; g
pattern+ M; d# ~6 [- D
box3 A5 [5 o4 Y) r/ d) v+ ?+ `
snap- U5 f4 L' Y0 E9 q1 r% J x7 X8 D. @
merit
unfold" T9 {% P( f! G3 ~" U+ S
speak# Y4 B0 T) \0 A) p! j4 ~0 n
hat6 a# P+ P3 g& O5 ?
task
发起 post 请求 /create-key
{; h' q/ X$ G2 H( a$ o9 c& ~
"alias": "nnemonic_test",
"password": "nnemonicnnemonic",
"nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",( [, ~1 S1 t3 ~; H
"language": "en"
}
返回相应:
5 P% z2 T" W; r4 `
bytomd 输出
, w& X) I$ s) d$ v. e& E x% N: z
可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。 [( I( U0 o3 P* k
dashaboard 中也能见到我们恢复的 密钥。