Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

用香烟做的云
98 0 0
比原项目仓库:
4 s7 t. [0 ~& @% `6 H& d" q! dGithub地址:https://github.com/Bytom/bytom
/ r; R5 B) P+ pGitee地址:https://gitee.com/BytomBlockchain/bytom- }* F( W7 i$ ~+ d. J' S
背景知识# @! F$ T- v4 H4 m' B
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub: V: l6 w. `6 B3 j6 s8 B+ ]
  • 代码见 bytom/crypto/ed25519/chainkd
  • 文档见 https://chain.com/docs/1.2/protocol/specifications/chainkd`* |) r' }3 t; k9 _& i: B0 `# e. \
    % i% L) M5 y! f# f/ C' \: L
    预备
    , o6 Z& \4 h6 u( b. l4 o. U8 s代码修改* ?" P! c- ?' M7 G
    首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码+ w' {$ z+ F- y/ \7 g( z
    在 bytom/blockchain/pseudohsm/pseudohsm.go 中的
    ) b5 d( \$ m' w2 m9 H$ m) efunc (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)
    % y. L3 F. J4 \+ L7 u" s- _添加输出打印 root XPub 对应的 私钥 和 公钥  ^8 l! ^+ @' Y; j
    func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error) {
    8 S% l9 c" A9 ?" M' n, g' n- K    // Generate a Bip32 HD wallet for the mnemonic and a user supplied password
    ( q8 H; W. c, E. k+ h  Y7 w6 N2 L    seed := mnem.NewSeed(mnemonic, "")
    ' m8 D: q9 D: B4 ]* |7 x: B    xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))9 v9 W" A! p/ a4 D7 |
        if err != nil {
    0 g- {; y! }+ R! p/ C        return nil, err
    4 c- \2 m" U; R    }
    9 i! f& h9 I+ S% S        . Z" a5 p4 L4 @7 w# f/ `# E2 l
        fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing
    6 p/ q& q2 u) g7 x    fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing2 b& @/ F2 V% f0 ]4 D
        id := uuid.NewRandom()0 V- V7 x5 a1 D$ L
        key := &XKey{
    8 E/ Q" o; x8 Z+ U$ I        ID:      id,
    ( W% R0 Y6 x. S( n& Q7 x        KeyType: "bytom_kd",
    , c: S% d4 r+ C7 m/ O2 P        XPub:    xpub,
    3 a- b, d8 b+ S9 L# F        XPrv:    xprv,
    ( Q7 f. q9 F: k3 G3 z) K( a        Alias:   alias,# m& T1 H+ Z0 n$ G1 R9 h0 P) h- l
        }* s0 H" t" J7 g  P4 r' N' D
        file := h.keyStore.JoinPath(keyFileName(key.ID.String()))
    ) t" m( ^/ u) T2 r8 Q* O$ q  R    if err := h.keyStore.StoreKey(file, key, auth); err != nil {! K# w0 c1 x9 c' i- R
            return nil, errors.Wrap(err, "storing keys"): r; U" Y7 i6 _+ k
        }2 o% ~; ~! n) @2 F5 X; \: q
        return &XPub{XPub: xpub, Alias: alias, File: file}, nil9 }* m* Z! W2 H
    }! L- t  Z( i& t3 g1 z
    工具准备
    ( z0 t1 B2 ^6 a2 l8 i因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman
    # l! w, ]: N" ?$ Z9 o3 z获取密钥对应助记词, O1 x) Y, o( Y3 e$ Y" n' F* B; A
    dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。) ^2 m3 N0 k) y( w( T( C
    因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。
    : c1 i. K& l4 x3 [% U# v对 bytomd 发起 post 请求 /create-key
    1 i, F( q& n( i  \% X! _2 O{* b, h2 ]+ w, z* u$ f
      "alias": "create_key_test",3 C: n: |0 F; [* J. t* d
      "password": "createkeytest",! W5 H4 B! e' o* |: m6 t
      "language": "en"
    6 S1 g- |. X% i# W/ A}
    ; _9 f" X/ ]  e" U8 G. t6 }4 S3 l
    9 |+ A0 R7 {' g- c0 ~+ g可以看到 响应中 显示了 xpub 和 助记词# X* q( f3 q0 P6 [( R
    由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub
    ; c* S7 N5 W7 U8 ~5 `
    & u6 ~$ e- Z) M  P& P% M, g步骤
    : ^! ?: x* Y+ t* |6 T3 w- {1 m如何通过导入助记词恢复密钥呢?
    8 A* ?5 e* T, Q( m0 t/ G假设目前 已经有一个 xprv
    2 U+ q6 D2 V& i3 a50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc; E, p5 R  C0 C% a6 C" O
    对应的 助记词为
    & O7 b% n* _) ypudding, f( x% f* q0 Z: P+ z" Z0 ?, N
    room
    % @, H: j/ i1 H, Q3 d& s' t6 ebusiness
    ( L) M/ s9 l( a/ a, F: q: M3 Lriver
    : H' \$ Z2 l, Y9 Y# R' I, kpattern
    ! \# @9 D# |! _  `box
    ( Z& \1 }" @4 R+ I6 tsnap
    % ]8 O2 L( N9 u  `; }' nmerit
    2 _6 p" m) G. E6 d% T; Z# munfold; Y2 @9 V. P! B& H+ s! X/ k
    speak
    ) _4 S8 s  t7 u- k  ]; q% _hat3 A& C( ?6 @$ {* E
    task9 d2 U5 T6 ]" h
    发起 post 请求 /create-key
    6 B! A9 K0 Z$ Z5 R9 l{
    , i7 }1 t1 O+ Y! B- u  "alias": "nnemonic_test",* O. M% e: q$ J# ?, X2 E$ P
      "password": "nnemonicnnemonic",
    0 D  R6 S% e; i" H5 E  Z  "nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",3 a: R4 q& r& |5 j* x  R2 ]. D& f
      "language": "en"2 H! T7 ^3 B) i
    }. X2 T/ k* B( `! x+ x# X
    返回相应:8 n; @0 g& w0 |* n4 c+ G* d8 y

    & Y5 I* U! ?: ]" q+ e. ]* c% ibytomd 输出$ z) l" |3 |1 M. u

    ( m2 ^3 \* b$ K+ ]( B可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。
    $ c5 F0 W; X6 k1 m6 @dashaboard 中也能见到我们恢复的 密钥。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      2