Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

用香烟做的云
76 0 0
比原项目仓库:* k2 @! C- G  n, i
Github地址:https://github.com/Bytom/bytom
3 B6 m) @. \& h* x# n6 d9 H6 ~, PGitee地址:https://gitee.com/BytomBlockchain/bytom1 m, R* H9 X! e. J7 z% }
背景知识
7 v' I6 g- F+ KBytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub
8 I, S$ E% X, Q5 P: u
  • 代码见 bytom/crypto/ed25519/chainkd
  • 文档见 https://chain.com/docs/1.2/protocol/specifications/chainkd`) N2 s, u) J9 M/ k0 @5 P
    6 W8 v6 q* k% W+ a  v
    预备/ \& `* b8 e% X5 A6 W- z4 \
    代码修改
    0 W# p2 k2 S1 v: x" @7 m+ b$ I* X首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码6 F7 `7 V6 D" S4 [
    在 bytom/blockchain/pseudohsm/pseudohsm.go 中的  ~- }+ |3 o% `0 [. s7 v: d. T
    func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)% p, X( G  w. f. M- g
    添加输出打印 root XPub 对应的 私钥 和 公钥! j2 T- z5 U9 l3 `
    func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error) {+ n) K( m) L4 X3 c# a2 q. O( ]1 A
        // Generate a Bip32 HD wallet for the mnemonic and a user supplied password
    & q+ x+ X. _6 {, U    seed := mnem.NewSeed(mnemonic, "")
    8 X+ ^- i- f- F. U    xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))
    4 U9 f; p" p, D4 D8 w% ~7 Y8 O0 s    if err != nil {
    ( Y* k# w: B0 N* U        return nil, err
    ) `: c3 ^" ^$ v$ \    }
      P4 A8 y$ x2 s4 W8 L4 ?        
    - a# M  F+ j8 d1 E9 q1 A! w    fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing$ T4 J! y- O( I
        fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing
    9 d2 r/ |3 [  G  g    id := uuid.NewRandom()
    7 V- b! y4 E4 Z( S    key := &XKey{" N# x9 {' B4 i  g1 x
            ID:      id,
    7 w, S6 ?5 F/ T: K. V4 A        KeyType: "bytom_kd",
    2 m6 h" }6 o# R7 Z) _        XPub:    xpub,
    $ I) _+ l7 @  M4 a+ N1 U        XPrv:    xprv,$ N# k9 J; _0 Z* M, _; s
            Alias:   alias,3 A  D0 v  B  X2 P! f1 a6 B
        }
    1 K  s( T7 B" C' m( j: F; j, f' v    file := h.keyStore.JoinPath(keyFileName(key.ID.String())), g, P. X" D4 M0 s
        if err := h.keyStore.StoreKey(file, key, auth); err != nil {7 n. D: e& `) E$ F5 g; A
            return nil, errors.Wrap(err, "storing keys")) k- Z7 n9 b, [5 d
        }: p/ d. F: k5 G( ^0 g
        return &XPub{XPub: xpub, Alias: alias, File: file}, nil* ?) ^0 n! W0 V2 v
    }. D! d% y; h2 Z# x1 P6 r  Y
    工具准备
    ! [, d; b. L$ i( w3 h因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman# h5 w. a; K/ h' t! k6 t
    获取密钥对应助记词$ T- @& j) K5 v
    dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。: Z: ~7 O  Y! B/ [$ b2 C
    因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。; g6 w$ E; C: W' @) Z5 h; P" a( p
    对 bytomd 发起 post 请求 /create-key
    ( r/ `4 q9 f9 i0 @! v{
    7 I+ o1 h4 J4 K' X- Y  "alias": "create_key_test",1 }* O; H$ C& E) n$ ?
      "password": "createkeytest",
    1 c7 D4 y1 G8 N+ p6 Q# f  "language": "en"% G$ R4 u/ L7 g7 p
    }
    5 l9 U% q( r, v- j7 ^8 e0 A8 f% `8 q! A% {. ~2 N6 K6 \# ?
    可以看到 响应中 显示了 xpub 和 助记词2 U% x( j8 V7 D2 `) I% s' S
    由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub
    . ~. R) F6 U% N' N4 u6 g) F
    . K- }/ S) [5 ~0 i) s步骤% e- Z# T+ V9 P
    如何通过导入助记词恢复密钥呢?
    + @1 Q; s  x# w1 _假设目前 已经有一个 xprv- y& F  ?" |$ ^* e# q; q
    50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc/ P* M+ b; d* s
    对应的 助记词为3 z9 b7 S# @. u! Q# w# g+ M9 n; y
    pudding
    - {& q, p) n5 e6 Zroom7 G2 j* ?2 x9 R" f. z
    business
    0 u( d, n4 |# n. F$ Kriver2 ]6 b3 }6 E4 B9 ]7 u) h
    pattern
    : B0 R! g" C) \7 [  `" j  Xbox* H  T/ ]/ w- X# K6 @$ B! V
    snap
    + D( i1 n, \2 X8 }( ]$ jmerit( z2 _8 t! c  b
    unfold5 t8 E6 _% t. n; ~2 e- X% `* K
    speak
    + k1 j9 M6 R- B+ ahat9 K$ A; t# ^9 R% q4 I3 d$ x
    task# M5 D+ U' V6 R. E* s$ M& D/ S
    发起 post 请求 /create-key# _7 G1 E  [  A& S. t
    {. u) i  C4 P4 A, n8 x- |
      "alias": "nnemonic_test",
    1 C$ G. F; M& T0 f' O* _; s! s  "password": "nnemonicnnemonic",5 ]. [! y$ ^0 ~& }/ t/ Q
      "nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",, q2 A8 }/ a8 z- ?' `8 x' y; n% z
      "language": "en"
    0 v  q* V6 o! @" B}* H& F4 q1 G! i% P9 x$ n
    返回相应:/ F* \6 ]1 `2 ]; X6 c
    ; o3 k2 M' c0 Q, x$ |6 v
    bytomd 输出$ i& K7 g" m& y$ b; T) [/ ^2 I2 R

    6 A4 q( Q* X: |, p  V+ V3 M) j8 L0 A& J7 A可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。
    0 P. W" c& ?5 [dashaboard 中也能见到我们恢复的 密钥。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      2