Github地址:https://github.com/Bytom/bytom, l. K+ M& t* W8 L' _$ C: }1 }
Gitee地址:https://gitee.com/BytomBlockchain/bytom
背景知识
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub$ k- ^; t+ R/ p8 u% W# F. F# B
预备
代码修改5 m: {- a" S0 N+ J5 b% l" ^
首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码 。
在 bytom/blockchain/pseudohsm/pseudohsm.go 中的4 Y J; P) [7 y2 L+ a) E
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) {7 b& `. d& n& u3 y7 F5 i+ M" i% j
// Generate a Bip32 HD wallet for the mnemonic and a user supplied password- ?4 g' r. \) {2 B
seed := mnem.NewSeed(mnemonic, "")% g/ d. W4 \; a% M! A9 L3 |. w
xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))6 E4 d6 N9 Q, X4 o% c4 }
if err != nil {5 ^ S' c; I) H
return nil, err8 d- t4 E5 H. M9 |' w4 a' w; b: ~
}
fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing- m( P+ o; p8 X4 Q9 M) m
fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing/ f- D) E; U& a7 f. J/ q z
id := uuid.NewRandom()
key := &XKey{' b* i% R' P% G
ID: id,0 Y& M: d9 ^* ~9 W X f
KeyType: "bytom_kd",
XPub: xpub,
XPrv: xprv,
Alias: alias,
}$ O6 G! U3 M# B
file := h.keyStore.JoinPath(keyFileName(key.ID.String()))$ R0 s2 |" K, y! O& M' t
if err := h.keyStore.StoreKey(file, key, auth); err != nil {9 }5 s7 ~9 {4 m7 d* M
return nil, errors.Wrap(err, "storing keys")
}
return &XPub{XPub: xpub, Alias: alias, File: file}, nil% l2 q7 @/ `6 H; m0 n5 {( i! e
}
工具准备
因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman 。) D& z1 g4 ~/ S- {: w5 O
获取密钥对应助记词, z% w U) _1 n* Y1 c2 V8 |6 c
dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。
因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。
对 bytomd 发起 post 请求 /create-key& n- E+ o2 k0 @# |9 [( R
{* [& E) q1 p- ~) l0 H, ], I$ B
"alias": "create_key_test",1 Z- j5 y4 ^: p" c/ {- Y+ k& x
"password": "createkeytest",
"language": "en"
}
可以看到 响应中 显示了 xpub 和 助记词/ E& x: N; k/ i+ h2 g5 F6 N# w1 a
由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub2 x" N0 w5 Q+ g4 p) [: j6 E: j
步骤2 X2 L5 K' D; G4 H
如何通过导入助记词恢复密钥呢?$ V5 s! Z# T6 p( V5 w
假设目前 已经有一个 xprv
50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc7 q& P" j, x8 [! L! R3 q; M
对应的 助记词为- b/ u# q3 ?8 ?$ n) }
pudding
room
business
river
pattern
box& }+ M% w1 Q& `
snap
merit- t0 d9 d1 g1 Z5 Z; p
unfold
speak3 a% Z' X5 [- U# Y6 W' @
hat
task
发起 post 请求 /create-key
{
"alias": "nnemonic_test",
"password": "nnemonicnnemonic",4 u7 J) H$ \- F1 v. f7 @
"nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",
"language": "en"1 j9 @, @! ~& |/ @1 _* ~+ V q
}) Q8 t) T- ~, d0 X3 H2 C% p$ Y
返回相应:6 q9 B3 m Y+ V' ?/ y4 }+ }
bytomd 输出+ O- U& G7 z/ O5 U
; t0 n% p2 v8 _1 w9 C# @4 n, F( m
可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。
dashaboard 中也能见到我们恢复的 密钥。