Github地址:https://github.com/Bytom/bytom
Gitee地址:https://gitee.com/BytomBlockchain/bytom3 ^3 o- ^' a: J3 J/ r2 p
背景知识* R L6 S) x$ ~1 A
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub
预备
代码修改
首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码 。
在 bytom/blockchain/pseudohsm/pseudohsm.go 中的. z- S6 M4 F& B
func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)7 W; o' I0 S) n; N1 L; `9 G
添加输出打印 root XPub 对应的 私钥 和 公钥 R" [6 F3 m8 [: l% B0 Y& k& F8 M
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' ^* G/ K$ B8 J, W( |- w
seed := mnem.NewSeed(mnemonic, ""), y( d9 z8 x# E$ F6 Q5 z `5 |( Z
xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))
if err != nil {
return nil, err W$ q0 K9 U7 M) ]8 H8 V) p8 k# Z
}
fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing$ I p+ O h( }# M# E2 ]) ~9 B! R
fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing
id := uuid.NewRandom()
key := &XKey{
ID: id,) u2 f6 A# F- A2 X0 o) E
KeyType: "bytom_kd",0 M/ x1 w! j1 I* b$ e$ g$ f1 o
XPub: xpub,
XPrv: xprv,
Alias: alias,' D2 A v# ^5 f' Z+ w
}
file := h.keyStore.JoinPath(keyFileName(key.ID.String()))* \' X' @$ ~+ s( B
if err := h.keyStore.StoreKey(file, key, auth); err != nil {; O( x2 o' P( h
return nil, errors.Wrap(err, "storing keys")
}
return &XPub{XPub: xpub, Alias: alias, File: file}, nil# V1 o2 [; l3 w' Y( T4 F
}
工具准备
因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman 。% j- I5 k8 I6 q7 i% a5 P( x7 q
获取密钥对应助记词
dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。
因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。% W2 E- V, \ |( p+ K: O
对 bytomd 发起 post 请求 /create-key
{. Z; v$ D- J$ x7 q( Z
"alias": "create_key_test",5 o+ ?( W% q" Z1 G7 D- ]
"password": "createkeytest",
"language": "en"
}% j- @1 c' Y* g7 Y
可以看到 响应中 显示了 xpub 和 助记词
由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub) H6 g& d& s1 J3 {
, h, b$ G$ w: m) T& B
步骤; q, F8 @9 M3 `! |. V4 X
如何通过导入助记词恢复密钥呢?
假设目前 已经有一个 xprv- R4 ] Q, o' d0 V( n" ~9 {
50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc
对应的 助记词为 r' }0 h; F4 h$ o; n! }# H
pudding
room
business
river3 W6 d' f/ ]0 O, T1 ~9 B& }
pattern5 l7 n/ E7 L/ f' ?. i
box! R2 D2 e' g x6 b
snap* |3 c# M, X. Q$ F
merit# e& I: @1 Z; |0 [1 T F
unfold9 J4 r$ ?4 N& X; O
speak6 \6 T1 R6 d# X
hat
task
发起 post 请求 /create-key( |/ H6 |' C7 h% Y9 [
{% D$ D8 j/ d! }; H' ]+ w
"alias": "nnemonic_test", C% g2 U8 m0 L' V$ D
"password": "nnemonicnnemonic",
"nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",
"language": "en"
}4 Z% ?- C3 y6 B3 t
返回相应:
bytomd 输出4 l7 j3 M$ x& z; F b3 d- O
可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。, Z( ?2 g4 }/ S4 L$ s" M3 Q
dashaboard 中也能见到我们恢复的 密钥。