Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

用香烟做的云
88 0 0
比原项目仓库:
1 @- f$ R  j+ B% K4 Z6 ~Github地址:https://github.com/Bytom/bytom
4 a# x, K: N0 H5 QGitee地址:https://gitee.com/BytomBlockchain/bytom, T. K* ]4 o, u/ I8 l
背景知识9 \. ^: _& E- i' f
Bytom 使用的 密钥类型为基于 ed25519 的 chainkd.XPub
, j7 r( \& I# [
  • 代码见 bytom/crypto/ed25519/chainkd
  • 文档见 https://chain.com/docs/1.2/protocol/specifications/chainkd`6 R2 b' p- U% L- b
    . C: g4 E6 o' O# n) t
    预备9 Z1 U4 b6 V! u& O* G
    代码修改
    " k: N% j' D8 P# c0 v* |& k首先适当修改代码,添加一些打印输出,使得我们更好的进行验证。 如果只是想看 xpub ,而不关心 xprv(对于验证导入导出助记词功能来说已经够了)的话可以跳过这一步,不必修改源码/ c( G5 Q, |1 q! ~7 r
    在 bytom/blockchain/pseudohsm/pseudohsm.go 中的! L/ \' D0 v* H% _
    func (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error)
    5 X+ P: {# D( }5 R& B7 A, m添加输出打印 root XPub 对应的 私钥 和 公钥
    & `7 q1 H& R. |8 vfunc (h *HSM) createKeyFromMnemonic(alias string, auth string, mnemonic string) (*XPub, error) {
    6 B# X3 M/ n8 h7 B4 j/ h. N    // Generate a Bip32 HD wallet for the mnemonic and a user supplied password3 A0 G" ?2 Z/ E3 b+ K6 x) N7 f
        seed := mnem.NewSeed(mnemonic, "")
    , l: ?# h) P9 C    xprv, xpub, err := chainkd.NewXKeys(bytes.NewBuffer(seed))& o& I$ z+ L. i/ W: D
        if err != nil {
    - l) `$ C& t% K        return nil, err# K, X, G% r0 }9 a( j* S! [0 ~
        }# }, F  _; v7 ?5 I; s% y* c: q, p
            7 i" g9 s" f+ v. F
        fmt.Println(hex.EncodeToString(xprv[:])) // Add info printing6 R2 u# M7 |" }1 L
        fmt.Println(hex.EncodeToString(xpub[:])) // Add info printing
    0 \9 x8 i6 k; [+ G    id := uuid.NewRandom()
    " F9 I' q: D+ k2 R5 s, m/ f    key := &XKey{% u0 {2 R, D( ~7 s! V6 p1 {9 b
            ID:      id,8 b* d) v0 j5 C9 D/ F9 `$ p. L$ S
            KeyType: "bytom_kd",4 R' o( [/ G, R+ U6 E
            XPub:    xpub,
    , j3 B9 C7 i$ G+ G9 x% Q4 p1 D        XPrv:    xprv,  M5 `, }3 R' Q: v
            Alias:   alias,
    7 S; N/ c" z( T5 T0 v+ q5 t    }' A1 @1 O# p/ U6 v2 ?( s3 c8 K0 j6 G' l
        file := h.keyStore.JoinPath(keyFileName(key.ID.String()))/ r' ~9 n+ Z' c, v+ V/ Q2 l
        if err := h.keyStore.StoreKey(file, key, auth); err != nil {  ]# w( E% V# u: J; [
            return nil, errors.Wrap(err, "storing keys")" e- a9 A$ V/ K/ m4 g# f4 w
        }5 g6 c+ C  t2 F3 |; d% P
        return &XPub{XPub: xpub, Alias: alias, File: file}, nil* z0 @; e; z* x: T7 Y) j' j! }. |
    }
    " T( z( j- G9 I, q- I7 B, M工具准备
    4 I8 T+ S; J- Z0 ]5 M* d( @- P因为 bytomd 目前 dashboard 钱包图形界面还没有助记词相关功能,我们需要准备工具使用 POST 请求来使用。比如 curl 或者 postman
    % _0 i! m3 k% k$ W/ Z获取密钥对应助记词1 v! J0 r8 e/ }" x0 ~! o
    dashboard 目前还没有 从 密钥导出助记词的功能,现有只是在创建密钥时有助记词相应输出信息。可以修改源码在查看密钥时 打印对应助记词。6 M' m$ _' i( b* z
    因为只是测试,这里为了方便,直接查看在创建密钥时返回的助记词。+ |; a: O* x" M" l' N0 e: Q
    对 bytomd 发起 post 请求 /create-key
    3 ?7 f0 M" G5 z0 d{
    3 J1 F( _+ G; A9 x8 Z3 L  "alias": "create_key_test",7 K2 s' U5 ~* W- R5 R) H4 l2 C( B
      "password": "createkeytest",- t& ~5 d7 I6 [
      "language": "en"
    ; ]" O( j7 c1 X5 v% Y/ b" h}4 ?) E5 Q) i1 u9 t
    + c+ A( y0 v! x- F0 y0 M
    可以看到 响应中 显示了 xpub 和 助记词
    # W, ?) Q, U1 m1 ~% I由于修改了源码,添加了打印信息,bytomd 命令行也打印出了相印的 xprv 和 xpub8 _" M7 y- B/ z2 S$ a! x  R

    / e8 x# S+ v% _" ?* a- F( d) a步骤  g, G1 {0 @$ k; m/ g% T! J
    如何通过导入助记词恢复密钥呢?8 a3 M8 Q% d, y, h3 o2 e: Q
    假设目前 已经有一个 xprv
    ; k/ \% j' W; Q50db5bfe21b08462972eadbce08ec92d078a45fa7a280d175a823f9e457faf447d1f501b69f895b830138fabc6f91e2b3b3c8df26642a34be4af27886b9134dc
    & W8 }  V4 x# D0 m! K对应的 助记词为& i# ]* m- Z7 s# e/ ~+ a6 o
    pudding3 a% a- n3 m# F. w5 Z7 I
    room
    4 ~4 t' Y. X" Y; W3 m2 ybusiness7 l0 S+ o0 C5 x5 ~/ Q/ z/ R
    river
    & m) f  ~9 f( N1 V& z! T/ [/ vpattern
    ' B" W' t& O% U# l* B8 C' |9 }/ }box
    0 a0 `$ t# |# r  esnap
      O3 N$ q- j" B  W+ xmerit% C( j/ a+ {: m; k
    unfold0 z- Z* `, H( V: d' ^4 U" r
    speak
    3 h, A1 Q* F% m) _; W( Y. mhat- f4 ~9 @) m2 o/ A- q- O4 ?
    task
    9 N# Z: y" O, N1 ~% N) {2 }6 [& ^发起 post 请求 /create-key
    7 d5 `0 I! J; D  _8 e6 W) ^{
    0 Y5 z" y( o- t6 b4 f  "alias": "nnemonic_test",1 X% w& n# A& ]8 }$ K: R
      "password": "nnemonicnnemonic",
    . ?$ a; a6 r8 Q6 h7 J9 `  "nnemonic": "pudding room business river pattern box snap merit unfold speak hat task",
    ; ~6 a3 l2 e' k  "language": "en"
    + ?5 C# n- n; p/ A! p}# p+ e# j6 p2 C0 e5 s
    返回相应:
    ) B6 p! d3 O5 a5 t7 _7 d" I% v6 }: X) M6 [$ M- x
    bytomd 输出
    % n) L9 Y: A8 p0 D
    & U/ B: q5 V# }1 z7 T$ N* y可以看到,恢复出来的 xprv 和 我们本来的 xprv 一致,验证成功。
    : F; Y/ q/ i7 t2 y7 X& A  z) ~$ n+ sdashaboard 中也能见到我们恢复的 密钥。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      2