Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

用香烟做的云
81 0 0
比原项目仓库:% \# `# v+ ^; N# J" [, J# j
Github地址:https://github.com/Bytom/bytom, l. K+ M& t* W8 L' _$ C: }1 }
Gitee地址:https://gitee.com/BytomBlockchain/bytom
" ^0 a* b7 T  Z背景知识
" }# {! G* B6 i- s3 e5 |8 p) @Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub$ k- ^; t+ R/ p8 u% W# F. F# B
  • 代码见 bytom/crypto/ed25519/chainkd
  • 文档见 https://chain.com/docs/1.2/protocol/specifications/chainkd`
    7 J+ v; X2 a3 i2 }
    , U& Y" U" ~0 K
    预备
    + Y6 j  t/ W- q1 q/ c. v" L代码修改5 m: {- a" S0 N+ J5 b% l" ^
    首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码
    0 z* e+ W6 m7 Y+ |0 W在 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)
    9 y$ Z' ], u5 K添加输出打印 root XPub 对应的 私钥 和 公钥
    5 |0 p% E/ {  gfunc (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: ~
        }
    4 }) Q, A9 U! {: b3 a% l" B        
    & X1 b2 K# w5 f. f/ G, ]    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()
    ! K0 S& y! }) _    key := &XKey{' b* i% R' P% G
            ID:      id,0 Y& M: d9 ^* ~9 W  X  f
            KeyType: "bytom_kd",
    . Y& N1 j  E' Q' U        XPub:    xpub,
    5 Z6 i$ T+ C7 O7 g0 o& f/ Y        XPrv:    xprv,
      S' g6 c- B+ ^) t5 [        Alias:   alias,
    " M) K$ p9 ?# m8 |# p: c; F    }$ 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")
    " o7 G5 C; l3 K/ P1 ], I3 D$ E( s    }
    2 W+ n; k/ V  h2 g    return &XPub{XPub: xpub, Alias: alias, File: file}, nil% l2 q7 @/ `6 H; m0 n5 {( i! e
    }
    / l8 r4 X7 a, U- M3 Y( `% U1 S工具准备
    ) N+ z* d  X; ]/ Q# \因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman) D& z1 g4 ~/ S- {: w5 O
    获取密钥对应助记词, z% w  U) _1 n* Y1 c2 V8 |6 c
    dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。
    . y$ x7 j/ G6 M因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。
    ; y3 ?9 u: `& a2 M% `* p对 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",
    4 L* J& @  i+ ^2 S! ^; \9 A  "language": "en"
    ! q" X& V5 Z" y* p/ ~! u0 w6 }) B. a}
    + B6 v( O" H* d6 N
    / r8 T. n+ P, q/ Q可以看到 响应中 显示了 xpub 和 助记词/ E& x: N; k/ i+ h2 g5 F6 N# w1 a
    由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub2 x" N0 w5 Q+ g4 p) [: j6 E: j

    ' [, w% a7 P( Q0 s2 W. O1 J! Y! [步骤2 X2 L5 K' D; G4 H
    如何通过导入助记词恢复密钥呢?$ V5 s! Z# T6 p( V5 w
    假设目前 已经有一个 xprv
    . ~* `5 q9 D$ k/ C" m9 p3 s50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc7 q& P" j, x8 [! L! R3 q; M
    对应的 助记词为- b/ u# q3 ?8 ?$ n) }
    pudding
    . t3 L: c2 }, H" w$ Aroom
    : A. o' J8 H2 g4 Hbusiness
    ' `0 |" n, c! i& D" Q) ~& b8 s# hriver
      m# O1 x9 ~; p9 \! I9 q, Epattern
    + a) \8 Q1 {8 T8 k0 D, E, ]box& }+ M% w1 Q& `
    snap
    # |) Y# _) g6 w, n% m1 lmerit- t0 d9 d1 g1 Z5 Z; p
    unfold
      ~) B% |- T! g' H; g5 _speak3 a% Z' X5 [- U# Y6 W' @
    hat
    1 f8 N4 D2 P5 a1 W9 Q+ atask
    0 M1 m0 w" i! Y% Y* S2 n, D; u发起 post 请求 /create-key
    & h. J$ J- E8 m" U2 M& \3 _{
    7 ~% y# }( X4 h# f6 A; C9 O  "alias": "nnemonic_test",
    2 |( A! a/ l8 Z  P6 T  "password": "nnemonicnnemonic",4 u7 J) H$ \- F1 v. f7 @
      "nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",
    ! e6 V7 B8 a# @( M3 M  "language": "en"1 j9 @, @! ~& |/ @1 _* ~+ V  q
    }) Q8 t) T- ~, d0 X3 H2 C% p$ Y
    返回相应:6 q9 B3 m  Y+ V' ?/ y4 }+ }

    6 }: S0 t# K2 i& e: H3 Vbytomd 输出+ O- U& G7 z/ O5 U
    ; t0 n% p2 v8 _1 w9 C# @4 n, F( m
    可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。
    ' j: Z# T% [/ U1 zdashaboard 中也能见到我们恢复的 密钥。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      2