Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

用香烟做的云
133 0 0
比原项目仓库:) ], {1 N3 U8 q( i! Q
Github地址:https://github.com/Bytom/bytom
: L8 v" q8 ]' C$ ^/ x% |) Q1 QGitee地址:https://gitee.com/BytomBlockchain/bytom8 |' b2 Y7 f' t( X' a+ \9 {
背景知识
5 X" m0 ^6 j2 P3 tBytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub8 v5 [+ |7 A* ?
  • 代码见 bytom/crypto/ed25519/chainkd
  • 文档见 https://chain.com/docs/1.2/protocol/specifications/chainkd`3 @6 n" r, C) X$ v
    5 H2 F; X( b4 h3 E  F0 c6 d$ o
    预备( B( h# D' W) ^" k# h/ f) x% l
    代码修改
    7 o( x$ X2 Q" b5 z" L( p首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码$ [3 ~# _* g& a' ~  z
    在 bytom/blockchain/pseudohsm/pseudohsm.go 中的$ G( \# s- P9 ^7 w2 Y! O
    func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)3 Q; o& P$ }* p" v( C7 X
    添加输出打印 root XPub 对应的 私钥 和 公钥; O# t9 ^. v7 O- p
    func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error) {$ ?' O$ U% [7 @1 E6 _' u
        // Generate a Bip32 HD wallet for the mnemonic and a user supplied password$ h) q) g% Z6 f; |: g1 N2 v
        seed := mnem.NewSeed(mnemonic, "")
    7 Z3 [' f' |3 U! N$ T) J    xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))9 B! I4 X9 x" x
        if err != nil {9 U  p5 U) S: `" |
            return nil, err7 A, D+ [, R! r* V
        }
    8 D4 B! n/ ?0 j& ]- e" F. G        2 {& D# {* |3 ?% ~1 K, T% c
        fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing. o( b+ ?' e/ ]& U$ P& B
        fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing$ ~3 `0 ]$ F+ Q' }1 x: ?% P
        id := uuid.NewRandom()6 r: n* A6 y8 z" q1 V  U
        key := &XKey{+ S- u& c% L0 s
            ID:      id,, E# [* o  w& \
            KeyType: "bytom_kd",
    % B, }4 k5 c* e1 ^4 c: i5 Z/ p" Z8 J) M        XPub:    xpub,. k# @2 B; h- Z" }$ M* A  G
            XPrv:    xprv,
    1 v, Y4 h+ J% C" A5 Y) [7 i' }; G2 a        Alias:   alias,
      v2 h1 j' \" K' N  g    }1 g% }! J9 I- t" @! j7 Y2 \9 @9 m8 B
        file := h.keyStore.JoinPath(keyFileName(key.ID.String()))
    1 P& R5 N# q/ B    if err := h.keyStore.StoreKey(file, key, auth); err != nil {
    ! U4 f2 f% k* O        return nil, errors.Wrap(err, "storing keys")6 c3 S* O8 J9 @9 ~* C+ r* q+ @
        }
    6 I/ Y; T- ^" y$ @    return &XPub{XPub: xpub, Alias: alias, File: file}, nil5 E5 z) K( y4 M% F% Q% S' }, ?
    }& p1 e+ N' s/ V
    工具准备3 z* j7 c4 B/ ^* i6 k
    因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman
    & o& ]$ d! ]8 h, `0 h7 z获取密钥对应助记词
    ( X0 Z+ [- U/ Jdashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。# Q9 Y) \0 p  E; N  G# Z; a# E
    因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。0 g  I, E% m" B& Q) Q, u  B7 N) j1 P
    对 bytomd 发起 post 请求 /create-key$ {! N" @, Q* R
    {
    5 {  O/ f- ?) H9 e+ Z3 l, W3 a- F  "alias": "create_key_test",9 }: I" A$ T5 O# l
      "password": "createkeytest",
    , N7 W+ t& b3 |5 Y3 p2 r  "language": "en"
    2 Y5 E/ ^: e8 R8 x$ {}. b( a; J' W# A( F' |  J% A3 C
    / [# q5 w/ K$ D% ~3 x" @: P
    可以看到 响应中 显示了 xpub 和 助记词
    # m- f7 U0 n. X5 \由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub
    2 j4 m$ ~3 r6 u6 h) Z$ j8 k8 {) D6 ?
    4 c' K. e2 S# A; U- G* u, o步骤1 u4 P6 M" M& d) m
    如何通过导入助记词恢复密钥呢?
    . ]8 v; |! `# g+ T7 L假设目前 已经有一个 xprv% S5 o! l# J! {6 `* {& a, ~
    50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc
    6 W5 l# v7 |- v对应的 助记词为
    # j: n: ~) H' l5 s% k2 m) M  Wpudding+ l$ M8 J& a4 n
    room
    ; L6 j1 B4 O8 w7 z5 D' ~, Y) ibusiness
      a; F4 i' O$ H1 B0 O; ^- o! V  @' Criver5 E% _  i; W4 N; I4 m0 P6 d
    pattern
    7 E; W; v: B+ \: Nbox  \5 {  f, {5 h) @! X4 b0 C% t+ t% r' W
    snap
    2 r) N' \/ v( d" s! E9 amerit
    " j/ P+ {! d0 S7 Z8 ^+ q( M8 @# bunfold" ^% E1 A6 X+ ]% o/ }9 W2 A, d# F
    speak
    4 V: W9 W8 D' W2 m' v5 \' rhat
    % c$ I& Z4 s5 A6 [task
    4 ~8 Y8 N1 p2 y- t+ w. u发起 post 请求 /create-key
    3 F" Q, t) k( C" j6 h{
    7 ~3 m/ O5 N1 X. x( R% X# h8 {, k  "alias": "nnemonic_test",
    6 t) q6 y# P% q+ D. C1 }, F  "password": "nnemonicnnemonic",) P" B! o! y6 g' f% t* d+ B
      "nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",# v% h6 t) \% M0 p- t4 \: d
      "language": "en"( ~+ A0 n0 ]3 W. A' K+ N3 w- h
    }- K* p. G9 P7 H
    返回相应:
    # ?% g7 `" M+ F) _+ c; A8 U% P9 G5 @+ f
    bytomd 输出
    ; r9 _. y, k% s2 B9 k1 n# O3 X$ T8 x- \  @# J$ d. _) _7 ?( Y' [
    可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。
    . g  ~& S0 Q2 |$ q7 Kdashaboard 中也能见到我们恢复的 密钥。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      2