Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

用香烟做的云
134 0 0
比原项目仓库:
/ \9 z* j0 i0 MGithub地址:https://github.com/Bytom/bytom
- L; d4 c( y. y& vGitee地址:https://gitee.com/BytomBlockchain/bytom3 ^3 o- ^' a: J3 J/ r2 p
背景知识* R  L6 S) x$ ~1 A
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub
4 r# L  d* |3 i: y1 Z, S" x9 x
  • 代码见 bytom/crypto/ed25519/chainkd
  • 文档见 https://chain.com/docs/1.2/protocol/specifications/chainkd`8 x* l1 X+ {. I; ^9 f0 V2 p( ~6 a
    7 p% }. M" e; X4 \- y  S
    预备
    + Q: r7 W  Q2 ]% Q- ^/ v4 f# j. k代码修改
    ( t' e; k- L; O9 g4 |首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码
    ' a; n- j6 t) q+ L, W在 bytom/blockchain/pseudohsm/pseudohsm.go 中的. z- S6 M4 F& B
    func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)7 W; o' I0 S) n; N1 L; `9 G
    添加输出打印 root XPub 对应的 私钥 和 公钥  R" [6 F3 m8 [: l% B0 Y& k& F8 M
    func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error) {
    3 {7 C% x: i+ G8 j$ G/ w    // Generate a Bip32 HD wallet for the mnemonic and a user supplied password' ^* G/ K$ B8 J, W( |- w
        seed := mnem.NewSeed(mnemonic, ""), y( d9 z8 x# E$ F6 Q5 z  `5 |( Z
        xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))
    * b  {9 g- J9 k    if err != nil {
    ) Q' ?; O6 V4 A+ _        return nil, err  W$ q0 K9 U7 M) ]8 H8 V) p8 k# Z
        }
    7 {& Y/ H, g* L/ c' P        
    6 V% f3 l4 H9 B6 x2 D* j6 w    fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing$ I  p+ O  h( }# M# E2 ]) ~9 B! R
        fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing
    2 s9 q3 P. E: b& {  O9 f1 ?    id := uuid.NewRandom()
    5 B: E/ e( {2 o. T& M- T    key := &XKey{
    ) ~+ b4 s$ \# r7 {- a6 R        ID:      id,) u2 f6 A# F- A2 X0 o) E
            KeyType: "bytom_kd",0 M/ x1 w! j1 I* b$ e$ g$ f1 o
            XPub:    xpub,
    * U: v+ o. i- k$ a/ Y- [! }        XPrv:    xprv,
    , ^# q3 N: `+ b6 t3 B        Alias:   alias,' D2 A  v# ^5 f' Z+ w
        }
    6 I; M% R$ Q# V7 e' c3 w; ^4 N    file := h.keyStore.JoinPath(keyFileName(key.ID.String()))* \' X' @$ ~+ s( B
        if err := h.keyStore.StoreKey(file, key, auth); err != nil {; O( x2 o' P( h
            return nil, errors.Wrap(err, "storing keys")
    - O$ r' n& S' ~9 T* D    }
    6 z9 x# W- [. ^8 H3 m+ f    return &XPub{XPub: xpub, Alias: alias, File: file}, nil# V1 o2 [; l3 w' Y( T4 F
    }
    ; C5 M) u8 D9 m9 m; q7 x; r1 \7 j- m工具准备
    ( q- y1 Z: }; ^8 Q因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman% j- I5 k8 I6 q7 i% a5 P( x7 q
    获取密钥对应助记词
    7 \3 O; v: c( v& [) b; w! Qdashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。
    2 V5 l, k( i& q6 H* d因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。% W2 E- V, \  |( p+ K: O
    对 bytomd 发起 post 请求 /create-key
    # n3 `4 ~! t0 d4 k3 g: D1 \8 @{. Z; v$ D- J$ x7 q( Z
      "alias": "create_key_test",5 o+ ?( W% q" Z1 G7 D- ]
      "password": "createkeytest",
    4 j; r% X$ ]7 E+ b  w8 T  "language": "en"
    & t$ ^3 l, r3 I) Q, d}% j- @1 c' Y* g7 Y

    5 @0 B9 W8 J' g7 p可以看到 响应中 显示了 xpub 和 助记词
    9 W+ J& L4 v  y- _+ `1 B由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub) H6 g& d& s1 J3 {
    , h, b$ G$ w: m) T& B
    步骤; q, F8 @9 M3 `! |. V4 X
    如何通过导入助记词恢复密钥呢?
    & \0 _' h+ r  H- f. R" L6 X; c假设目前 已经有一个 xprv- R4 ]  Q, o' d0 V( n" ~9 {
    50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc
    1 Q' M' c' x+ k8 k对应的 助记词为  r' }0 h; F4 h$ o; n! }# H
    pudding
    ; F; N9 b( M7 z$ O7 q4 froom
    : {4 r* S% q$ p6 L/ Ubusiness
    1 [% x* v" ?: P7 c! F% g9 qriver3 W6 d' f/ ]0 O, T1 ~9 B& }
    pattern5 l7 n/ E7 L/ f' ?. i
    box! R2 D2 e' g  x6 b
    snap* |3 c# M, X. Q$ F
    merit# e& I: @1 Z; |0 [1 T  F
    unfold9 J4 r$ ?4 N& X; O
    speak6 \6 T1 R6 d# X
    hat
    * ~7 u' d6 k* a, m' a+ ^' ntask
    7 \7 t2 \$ K( [: R+ T# ]发起 post 请求 /create-key( |/ H6 |' C7 h% Y9 [
    {% D$ D8 j/ d! }; H' ]+ w
      "alias": "nnemonic_test",  C% g2 U8 m0 L' V$ D
      "password": "nnemonicnnemonic",
    % H" l: L# s+ F/ ^9 s) Z$ K  "nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",
      ^2 T" X& \1 P/ w1 {& Y  "language": "en"
    8 H4 a/ d: f+ X" U: E# A' E}4 Z% ?- C3 y6 B3 t
    返回相应:
    3 H7 s4 J* K+ p: G2 m8 }9 Q) g
    ; u% G* e" {3 R$ cbytomd 输出4 l7 j3 M$ x& z; F  b3 d- O

    & f: y, o1 n* M  U4 d0 F可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。, Z( ?2 g4 }/ S4 L$ s" M3 Q
    dashaboard 中也能见到我们恢复的 密钥。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      2