Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytomd 助记词恢复密钥体验指南

用香烟做的云
79 0 0
比原项目仓库:
/ a9 }3 Y* ]" G- t; `Github地址:https://github.com/Bytom/bytom% ^* p6 m# |2 X) H+ I1 x
Gitee地址:https://gitee.com/BytomBlockchain/bytom
* L7 W0 M" d3 Y! g( F8 r背景知识0 s; M1 w% q! C' A, F, D) d
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub2 ~1 ^; B5 g% Y: g; p
  • 代码见 bytom/crypto/ed25519/chainkd
  • 文档见 https://chain.com/docs/1.2/protocol/specifications/chainkd`
    0 G3 _6 s+ ~- W

    6 I0 l7 n* b" S  j5 H预备- I( T+ U9 x/ W/ z- _& b- y: f
    代码修改
    ! S+ j* ]/ [. @1 g首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码; Y- f+ L* P+ L, n
    在 bytom/blockchain/pseudohsm/pseudohsm.go 中的; u( H8 H3 P6 V) ?8 c
    func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)
    7 C+ j0 c3 a) m& S) }' v添加输出打印 root XPub 对应的 私钥 和 公钥$ A4 U5 t) P5 D% c$ B9 O, B
    func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error) {
    $ O' p7 q2 \8 |, L! N1 g+ s    // Generate a Bip32 HD wallet for the mnemonic and a user supplied password
    $ y- _2 G- ^2 r9 e' k# c, V  u    seed := mnem.NewSeed(mnemonic, ""): Q2 P# B& B$ a1 n5 v; I; ~
        xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))+ X: y- F$ L0 F. A0 E9 j5 B
        if err != nil {4 R& ~1 B# l8 H. n0 v; `; _
            return nil, err
    6 W0 E  v' C' x) ~: K5 d    }
    5 G7 l7 ]/ m: ~! t        2 h% W* N( \. W9 u; ]0 N) o( [
        fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing
    5 p) {, T2 T# z9 O8 [) z- }) m5 n" y    fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing
    ; B" u  |: Z+ C- z" l    id := uuid.NewRandom()% {& F8 R3 C# t) ^: y' d# i$ x
        key := &XKey{: j6 Y/ ^5 O' [  D" v3 E, k/ a
            ID:      id,
    $ n# L$ C. ]0 r+ D( T7 L        KeyType: "bytom_kd",/ x# X5 A) S; e6 F0 K6 ~8 j
            XPub:    xpub,$ y5 Y, ?! T: b8 S2 s
            XPrv:    xprv,. |7 X! H/ g) g/ G
            Alias:   alias,
    5 x5 y, Z" L1 s4 c, M0 k    }
    ' Z2 x; ?. G0 W- B    file := h.keyStore.JoinPath(keyFileName(key.ID.String()))
    & x* G- J& @1 T4 c1 A& {    if err := h.keyStore.StoreKey(file, key, auth); err != nil {
    ! Z: o# m& N  s, A; }        return nil, errors.Wrap(err, "storing keys")5 d2 w8 b' e3 E' ^7 g2 I; P
        }
    9 o, v2 v4 L! e5 Z    return &XPub{XPub: xpub, Alias: alias, File: file}, nil
    ; ^' X; ]. `0 {0 [4 Z}/ u/ D3 T, X& D8 a
    工具准备
    ; s! Y: r# f- D  B1 v% `因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman. n8 A  i5 w' e3 i
    获取密钥对应助记词& ]. e0 {1 p" h
    dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。  a: v) R& u) m* l& n6 S) V: d6 \
    因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。* x' S% o  B- F! e/ h" G
    对 bytomd 发起 post 请求 /create-key
    6 r& ]# W" h6 b) `{" I/ c- y' t1 n- y( P4 s
      "alias": "create_key_test",
    % z% F) b1 s: z6 ^9 X! u4 q' ~) {  "password": "createkeytest",
    & I4 N* Q) l" z; q0 Y- |. k5 w  "language": "en"
    8 [' u6 Q; i$ z* x1 A$ }}& |/ d" m. a" P+ x

    ; r: z0 O# k; @& D+ g- G/ D) f& x: a2 d可以看到 响应中 显示了 xpub 和 助记词; E# O) D" d5 A0 E# V
    由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub
    1 e$ J+ A* C% v0 v) T8 W. H+ J6 }3 O7 K/ O+ q% x4 m( a1 ?. R
    步骤' }6 L1 t1 ~2 K3 T% c, `5 [
    如何通过导入助记词恢复密钥呢?! N( u+ k3 x' @( `" P
    假设目前 已经有一个 xprv
    3 F  I4 n+ |9 \' a/ {, \50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc
    , y9 M. \) u8 d; s. U3 a% I对应的 助记词为
    / j. s: f2 L8 d. D2 d5 P" d+ U# i: vpudding
    1 G: k( T: Z6 n, Broom4 J. A) ~3 {0 o* |9 U
    business
    + Y2 @& {8 H$ T8 Hriver
    $ z: C. ?; M! _4 W2 Kpattern
    & {' O2 l5 G) a% @$ }8 o1 nbox9 A6 b  a/ r0 X/ `3 q2 g* L
    snap
    1 |- u5 Z8 r, `" B, v5 D: y( G5 Omerit+ {8 B& \$ }3 t" u8 d
    unfold6 }3 D7 x1 M6 I4 ~; G5 U1 K
    speak& R* P& b5 Y7 R, E+ B
    hat
    $ K6 D' F& z* d- |5 C# ltask
    ; \* J. G4 w5 P  C4 s" P# x% [' D  l发起 post 请求 /create-key
    / H4 b' r: E8 X{
    , ~8 `. B" p3 D" h+ B) Y! d4 x& e  "alias": "nnemonic_test",
    ! _* l" C/ w4 I' K5 h" u  "password": "nnemonicnnemonic",
    / q; @# y* E' a* F5 @5 O$ a  "nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",* F4 l- a0 j8 w3 Q9 o$ W
      "language": "en"
    6 m  n" U7 Q8 S4 l8 i}) n& m& E' I7 R5 n2 @- }! z
    返回相应:
    . G. K0 N  j$ v7 y4 @* X' d2 s, P; Z) N1 S1 C
    bytomd 输出
    / ]& |/ n6 {" y( h% A  P0 ?( v) Q) O8 }/ c
    可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。
    % q( R& g5 o) N" s1 y+ ?  Ddashaboard 中也能见到我们恢复的 密钥。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    用香烟做的云 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      2