Github地址:https://github.com/Bytom/bytom. d. B: V1 L( z: G4 o4 Y; b
Gitee地址:https://gitee.com/BytomBlockchain/bytom6 v4 _9 T* P/ e9 j
背景知识
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub' ?0 m( q' ~# d7 h3 D
预备4 Z/ G% J& a. J
代码修改7 M% y" Q$ ]& W- {: n; Q0 l
首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码 。5 y, C0 y/ c4 |( J9 n( ^- O5 T
在 bytom/blockchain/pseudohsm/pseudohsm.go 中的
func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)( X# Z' F+ Z4 V3 B1 t
添加输出打印 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))
if err != nil {
return nil, err' C/ P% _5 d0 r5 e8 c0 H& C
}6 u" k3 i1 O$ K
fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing8 R1 h( [) O& E$ \$ H. j/ D u
fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing4 r& x- s3 I( V& ?
id := uuid.NewRandom()0 a* [4 Y+ p9 z2 W8 h, }
key := &XKey{2 y9 b, ^" E! c
ID: id,
KeyType: "bytom_kd",
XPub: xpub,
XPrv: xprv,
Alias: alias,
}
file := h.keyStore.JoinPath(keyFileName(key.ID.String()))8 U7 P7 r7 b/ L% Z/ i
if err := h.keyStore.StoreKey(file, key, auth); err != nil {6 m7 @1 p) V2 {, z7 [! _. y
return nil, errors.Wrap(err, "storing keys")- \- O5 d6 Y, W. T! H8 i8 o4 k$ j, n% t
}! w4 V* F5 w5 [
return &XPub{XPub: xpub, Alias: alias, File: file}, nil
}
工具准备* k7 x0 x; `) f/ ~7 J9 b: d
因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman 。
获取密钥对应助记词
dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。. L1 D I3 }) l& X) e
因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。
对 bytomd 发起 post 请求 /create-key( S2 b0 }4 [5 O! \
{( A( {9 J# v# n
"alias": "create_key_test",
"password": "createkeytest",
"language": "en"$ I- r& f8 j4 q. N. y; \& }
}4 r" ?! b H. y% h% }4 ~
可以看到 响应中 显示了 xpub 和 助记词
由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub Q# i- e) F5 _. A N
步骤
如何通过导入助记词恢复密钥呢?( d& q' j2 d! A! p/ O
假设目前 已经有一个 xprv
50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc, M2 P' S% @7 E# t Z0 H
对应的 助记词为
pudding
room
business' d3 ~; X. w- ?6 d4 y3 z) m0 L6 U9 N
river
pattern
box2 K& k6 f! u: @
snap# t3 @, m3 ]. m% [
merit U* S& G2 |& U, q6 ]7 x! c
unfold/ ?! J2 {: M1 ]3 K0 v' h
speak6 H8 a6 n# K9 p$ K
hat; p& F8 {# Z- d7 t7 d
task
发起 post 请求 /create-key$ v- _- w7 R( k) s( O. j1 s
{
"alias": "nnemonic_test",; J7 b) c! u. A, ]
"password": "nnemonicnnemonic",. z0 u/ P) O; C" @
"nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",
"language": "en"1 y" N$ s2 h( K; z4 h
}
返回相应:( m% m) |' h; q" D# { J2 I
, b! U" R6 d# s4 `" g" _ `; [% w
bytomd 输出$ o$ K; p' U1 {
0 T1 K, }0 j& x
可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。
dashaboard 中也能见到我们恢复的 密钥。