Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

用香烟做的云
82 0 0
比原项目仓库:, e8 U( R3 i% r' v0 w! \
Github地址:https://github.com/Bytom/bytom
! t% H/ Y  ?4 ?, E9 {, nGitee地址:https://gitee.com/BytomBlockchain/bytom# @, p; W; h8 x- n" x
背景知识& S( P& _% H+ T7 K, x" E# M- H1 h
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub
- ^6 Z! X0 W- P+ f8 w) g: d/ f
  • 代码见 bytom/crypto/ed25519/chainkd
  • 文档见 https://chain.com/docs/1.2/protocol/specifications/chainkd`
    " w8 V" S, U" m+ Z$ H4 V

    1 Q5 I; l5 x; w9 r预备
    - r; @% Y* a2 r- ^0 C: I6 J1 J$ Z代码修改) P1 e7 x# w! ~; u7 Z3 a/ O- v( T. w
    首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码
    2 `0 `3 n, i, p5 [在 bytom/blockchain/pseudohsm/pseudohsm.go 中的/ k  K# r$ O/ l. V3 o3 {3 g
    func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)
    ' D+ v7 A6 c9 J3 J/ G添加输出打印 root XPub 对应的 私钥 和 公钥
      L  ^4 E/ R" Tfunc (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error) {- O7 y( Y2 a! A( d% @0 v3 ~5 h4 C' x
        // Generate a Bip32 HD wallet for the mnemonic and a user supplied password
    ' T1 r$ S5 c" X3 V/ S    seed := mnem.NewSeed(mnemonic, "")
    % e- I' C* P: X+ K/ `: ]0 t, \    xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))5 T( S0 K: d- O) x' i2 l# Q
        if err != nil {
    ) x1 Q1 z5 I! h7 j# }# E1 r        return nil, err/ e3 K9 v0 Z- N: U% u
        }
      F/ p& k# I% m        * q4 t$ P% d1 x! H# K% M
        fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing
    - R* a/ k5 Q! B    fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing
    & \! u8 L. X$ v9 |+ |3 `5 Z    id := uuid.NewRandom()' `& Y+ A/ @$ Q! \$ a- K
        key := &XKey{- }. l# ]9 P  a2 x5 k5 D( G8 ]
            ID:      id,
      X) e0 r% d: e# _6 s8 o3 _        KeyType: "bytom_kd",' E9 i- a8 C0 r9 {- U
            XPub:    xpub,
    2 t- X& B  \2 T. c% t+ o! y        XPrv:    xprv,
    1 L9 n& V+ Y3 N/ O+ U$ P; g( P        Alias:   alias,& i6 A$ Z6 j5 ?1 b9 F: c- }
        }4 \5 L  {! e" b3 e; z+ c
        file := h.keyStore.JoinPath(keyFileName(key.ID.String()))
    , w' n+ f3 l: o3 p7 I    if err := h.keyStore.StoreKey(file, key, auth); err != nil {$ G1 Y% J' P0 l
            return nil, errors.Wrap(err, "storing keys")
    9 z5 E. ~, v2 g7 w    }5 D/ H; O. z: P2 m  \& {6 U
        return &XPub{XPub: xpub, Alias: alias, File: file}, nil3 _/ P* q1 {1 s0 i
    }/ g. \0 w1 Y4 l
    工具准备: l' [7 u/ e! h' c# {: P; g) D
    因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman
    # X  x! n+ r+ ]: |& p获取密钥对应助记词, @3 [1 V  m! J/ A( i# L9 N
    dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。
    ; v! \" z- C, }因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。% C# `3 k/ X& ^* r
    对 bytomd 发起 post 请求 /create-key2 @  y: N" u2 A# n3 r8 H$ _0 O
    {& y6 K, _% q% `" S
      "alias": "create_key_test",: M8 W( O; m. M2 Y' m: O. c
      "password": "createkeytest",6 D: s. Z( h( C
      "language": "en"
    ! E. u5 ]3 A% m* x}
    7 V7 M/ P8 R$ R7 |/ h4 W6 L; v& l9 d2 l/ q' G
    可以看到 响应中 显示了 xpub 和 助记词# d; r1 F* I' b- n5 k0 z5 k
    由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub
    % a1 d0 h+ p% U, S
    ) `8 b2 s  a* o/ V% F/ W) J& Y( H' _步骤
    6 k& C3 f8 U" e# a1 e, f如何通过导入助记词恢复密钥呢?
    * e1 ?- ?& g9 Z9 ]) F, |% p假设目前 已经有一个 xprv0 C+ L; Q6 X/ f8 X
    50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc2 T& a( }& f% a. O+ E4 g
    对应的 助记词为" K4 e6 e) `9 g: @
    pudding
    $ U8 @& a8 Z& k7 {4 `room
    * p: ?5 C& c. dbusiness
    6 y0 E! ?5 U2 }* M9 X& b6 x1 {river8 c9 [# N! g5 j; H1 X" Q5 O
    pattern- S; W" Q" a$ ?, i" @- `1 |1 J- U8 ]
    box
    * U2 v3 v  p, k/ X" _snap
    ! y& M# H3 `. F; X# F, tmerit
    & M! l& c0 F! Hunfold
    " s+ n$ b! ~" l% _6 W* }7 `, j: @speak3 v7 n$ C# ~& c
    hat
    * M% K2 `! n. u2 u1 Ztask
    . z4 o+ a/ A, D4 M发起 post 请求 /create-key/ \. }/ A; f1 K
    {" J( c0 p6 C* |. S( F
      "alias": "nnemonic_test",
    9 Q1 h# F& A2 u/ m- j0 v  "password": "nnemonicnnemonic",0 i! |7 b4 N2 D1 v
      "nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",
    3 l6 @8 H9 U3 U. i9 B$ r* B  "language": "en"
    4 L1 m/ {4 @7 ^. \- T5 p* q- a% z}
    8 F5 _! B( K, q5 ~( h3 `返回相应:
    ; f; Z0 y  y9 p& G7 ]( ^# [/ a/ E* M+ k! F% a# {' [) l
    bytomd 输出
    $ h9 }+ X6 ]" E7 X
    7 h( W5 g% i. U+ k  Q  D可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。
    ' ^4 Q" }, m/ U/ T$ _dashaboard 中也能见到我们恢复的 密钥。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      2