Github地址:https://github.com/Bytom/bytom
Gitee地址:https://gitee.com/BytomBlockchain/bytom- }* F( W7 i$ ~+ d. J' S
背景知识# @! F$ T- v4 H4 m' B
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub: V: l6 w. `6 B3 j6 s8 B+ ]
预备
代码修改* ?" P! c- ?' M7 G
首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码 。+ w' {$ z+ F- y/ \7 g( z
在 bytom/blockchain/pseudohsm/pseudohsm.go 中的
func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)
添加输出打印 root XPub 对应的 私钥 和 公钥 ^8 l! ^+ @' Y; j
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))9 v9 W" A! p/ a4 D7 |
if err != nil {
return nil, err
}
. Z" a5 p4 L4 @7 w# f/ `# E2 l
fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing
fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing2 b& @/ F2 V% f0 ]4 D
id := uuid.NewRandom()0 V- V7 x5 a1 D$ L
key := &XKey{
ID: id,
KeyType: "bytom_kd",
XPub: xpub,
XPrv: xprv,
Alias: alias,# m& T1 H+ Z0 n$ G1 R9 h0 P) h- l
}* s0 H" t" J7 g P4 r' N' D
file := h.keyStore.JoinPath(keyFileName(key.ID.String()))
if err := h.keyStore.StoreKey(file, key, auth); err != nil {! K# w0 c1 x9 c' i- R
return nil, errors.Wrap(err, "storing keys"): r; U" Y7 i6 _+ k
}2 o% ~; ~! n) @2 F5 X; \: q
return &XPub{XPub: xpub, Alias: alias, File: file}, nil9 }* m* Z! W2 H
}! L- t Z( i& t3 g1 z
工具准备
因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman 。
获取密钥对应助记词, O1 x) Y, o( Y3 e$ Y" n' F* B; A
dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。) ^2 m3 N0 k) y( w( T( C
因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。
对 bytomd 发起 post 请求 /create-key
{* b, h2 ]+ w, z* u$ f
"alias": "create_key_test",3 C: n: |0 F; [* J. t* d
"password": "createkeytest",! W5 H4 B! e' o* |: m6 t
"language": "en"
}
可以看到 响应中 显示了 xpub 和 助记词# X* q( f3 q0 P6 [( R
由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub
步骤
如何通过导入助记词恢复密钥呢?
假设目前 已经有一个 xprv
50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc; E, p5 R C0 C% a6 C" O
对应的 助记词为
pudding, f( x% f* q0 Z: P+ z" Z0 ?, N
room
business
river
pattern
box
snap
merit
unfold; Y2 @9 V. P! B& H+ s! X/ k
speak
hat3 A& C( ?6 @$ {* E
task9 d2 U5 T6 ]" h
发起 post 请求 /create-key
{
"alias": "nnemonic_test",* O. M% e: q$ J# ?, X2 E$ P
"password": "nnemonicnnemonic",
"nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",3 a: R4 q& r& |5 j* x R2 ]. D& f
"language": "en"2 H! T7 ^3 B) i
}. X2 T/ k* B( `! x+ x# X
返回相应:8 n; @0 g& w0 |* n4 c+ G* d8 y
bytomd 输出$ z) l" |3 |1 M. u
可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。
dashaboard 中也能见到我们恢复的 密钥。