Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

用香烟做的云
135 0 0
比原项目仓库:2 W6 S" H' {+ P
Github地址:https://github.com/Bytom/bytom/ D' w: Q; \' P' q5 q
Gitee地址:https://gitee.com/BytomBlockchain/bytom1 T4 m' ^8 I4 L+ Q" f. N& Z" Q
背景知识! w) o1 M# v% M/ y9 t; w
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub" Q8 M, T. Q  v8 O; @
  • 代码见 bytom/crypto/ed25519/chainkd
  • 文档见 https://chain.com/docs/1.2/protocol/specifications/chainkd`3 {: z: t; o# z3 w' g* _1 a

    . w- W$ W  k6 @. U0 h3 s预备
    4 P' ~2 W2 h6 K/ B0 \! _* j代码修改1 `$ z, X, |% i# b5 N7 r, U: _* v
    首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码+ D: S* s5 g) H; `; P4 T
    在 bytom/blockchain/pseudohsm/pseudohsm.go 中的5 s) `; t* v+ @% l3 l1 D
    func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)3 m: [+ @/ T% N4 E8 O
    添加输出打印 root XPub 对应的 私钥 和 公钥
    * C# E5 C5 Z# |) W9 A2 {+ j5 g( cfunc (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error) {3 ~  r' Z( i6 e( S. Y
        // Generate a Bip32 HD wallet for the mnemonic and a user supplied password' A3 t- M! k: |; r1 r, u5 J& ~
        seed := mnem.NewSeed(mnemonic, "")
    : C" q7 X. L5 r3 Z& h3 q    xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))& N8 I+ E8 p+ S" ]' t7 I3 C
        if err != nil {
    1 Q* s! X6 R4 k3 E        return nil, err
    8 \& u: K, F6 A" T    }
    : E: ^; G+ T: f& ]* ~) w        
    # [: f* L' e7 K/ M9 n5 r    fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing
    0 s, B. V+ u, N+ n. e4 V$ l+ [; [    fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing- d; q6 p) q! y( o1 o( ~! ]9 U: B
        id := uuid.NewRandom()' y1 Z( ~+ N+ U' m, b. @
        key := &XKey{
    9 e. _. ?! x3 {% |8 T( x        ID:      id,+ n0 r' J- u" ]5 o
            KeyType: "bytom_kd",9 }5 w, k4 U, i( c" [2 @
            XPub:    xpub,% K' T0 g' ^8 g+ d( k
            XPrv:    xprv,
    3 K' C0 n6 h. `" t5 u- b0 x# J        Alias:   alias,
    % H! E  P( @+ L6 T    }& {  d7 ]( i* F! b6 x
        file := h.keyStore.JoinPath(keyFileName(key.ID.String()))
    . j* g3 B* `5 L; p    if err := h.keyStore.StoreKey(file, key, auth); err != nil {7 I; u, t6 k5 P
            return nil, errors.Wrap(err, "storing keys")6 n/ U4 P, Z6 P1 d6 Z" J
        }$ M, b0 Y; v: m$ ~) _8 B  R" }
        return &XPub{XPub: xpub, Alias: alias, File: file}, nil
    6 _) y2 E/ ]5 f) E) v/ ~# O}$ K0 F2 ^: z7 o" B' K. `( y  Y* }
    工具准备0 T/ U( U' z( n+ j' P% J- S% T
    因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman% E5 t2 J5 ?) A% o( Q- S
    获取密钥对应助记词. C) i$ Y9 U1 |* z/ j# c  F# e
    dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。: p$ {1 ^5 Y6 W/ M
    因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。
    % k2 X: e3 ^- V7 {5 D, ~5 J对 bytomd 发起 post 请求 /create-key
    " P0 ~( ^8 a! [, c{8 I% ?4 r( v/ ~* R
      "alias": "create_key_test",5 D7 q3 O, r! G# M
      "password": "createkeytest",
    6 \) ~0 g! G, `5 Y, t  "language": "en"1 ^0 u$ n1 e0 Y; ~4 {5 J2 Z( z
    }
    / C+ v7 g7 I, r) g; o- Q* Q& S" e( b1 n8 U+ P- y/ z/ u# M6 u/ {5 @2 C: W
    可以看到 响应中 显示了 xpub 和 助记词  S, P8 D+ c' y
    由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub
    ( N8 g  Q  ]* T/ p+ N% I( m) l! {3 S& S% a
    步骤7 s+ W& G6 x5 ?
    如何通过导入助记词恢复密钥呢?
      P7 n3 G$ k3 W+ [- {假设目前 已经有一个 xprv! Q$ `4 h# n( n) A
    50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc% t, M  w/ j4 J" Y  M
    对应的 助记词为  {! _" S+ M- z7 D: U
    pudding
    % ]+ I1 _! n$ @/ G" ^. q. q' V4 lroom- n5 Y+ u' T  J- l
    business$ T' L$ a2 `3 u+ }8 G
    river
    ( p) p. V3 p* X4 m0 Bpattern3 C, I3 Z! h5 x( m
    box' N" I  l$ j2 C" u2 V
    snap
    4 H, ~8 G! @% d: k  Wmerit
    3 B4 @* e$ o" k' w8 x* O7 Junfold
    5 P" ^8 `# k) t1 T; f: J- vspeak, r" P& \7 h( p3 J
    hat
    0 b1 u( {+ l3 Xtask2 U; ]; o4 @% @. h! b9 ]( J
    发起 post 请求 /create-key: G) w: g# H: H* R, ~: \9 m
    {
    " A$ p# F, ^* }  e# P  "alias": "nnemonic_test",5 a2 ~% @, C0 p/ l
      "password": "nnemonicnnemonic"," x/ j8 P* x! u  H
      "nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",' P4 o# c' [) G& `4 F2 {9 n- O  f
      "language": "en"
    . H% L( a6 i6 |/ @}* p/ v/ ^& X# r8 b2 @
    返回相应:
    3 g, i; i4 x: |! d; F) {3 }6 `( ]0 [: W" I! e
    bytomd 输出; u% h& Y/ b: x* a
    $ s$ z" G6 n- H  |# a7 C. K$ [
    可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。2 u" c$ a0 s# b: E  K1 G
    dashaboard 中也能见到我们恢复的 密钥。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      2