Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

DAGX钱包详解

一夜雨十年灯潞
92 0 0
钱包结构
4 ~6 ?1 v) s  z/ V顾名思义,钱包是用来保存钱的。但在数字货币的世界中,钱包里面并没有“钱”。钱包账户里有多少“钱”都是记录在区块链上的,钱包里只是存储了账户对应的私钥,账户是从私钥相应的公钥衍生出来的。只要有了私钥,你就可以在数字货币世界里证明你的身份,发送区块链上属于你的资产。因此,钱包实际上是管理和存储私钥的工具。# \8 `4 e' C. _+ c1 K  [
Dagx钱包结构与Bitcoin类似,Bitcoin对管理和存储私钥以及通过私钥生成地址制定了一系列标准(BIP, Bitcoin Improvement Proposals),主要包括:2 e9 f, n% K7 W
· BIP32:定义了HD钱包(Hierarchical Deterministic Wallet),允许从单一种子产生一树状结构储存多组私钥和公钥,可以方便的备份、转移以及分层权限控制等。HD钱包包含以树状结构衍生的密钥,使得父密钥可以衍生一系列子密钥,每个子密钥又可以衍生出一系列孙密钥,以此类推,无限衍生。下图展示了HD钱包的树状结构:! L9 e+ \. j% w% I2 v; o! D) m
2 j& n2 F% Z! H8 T8 q( j) O: c& d
BIP39:将种子用方便记忆和书写的单词表示,一般由12个单词组成,称为助记词或助记码。由一系列单词生成种子是个标准化的方法,这样易于在钱包中转移、导出和导入。比如shrimp make call path pink draw gym song select brother social base,其相应的私钥为7 }' J6 N$ J' A* V
xprv9s21ZrQH143K4HQ8sBPNNkXHNuVYfivR96gtpJzMWCJVF5hdYjzT5nVQu6GfHAQLPstQtFp9GTWADUcKgzaV5EyL5JxT2rxkyg51ReGTVg8。" _1 G5 g& o, L4 x* X% z
BIP43:为HD钱包路径引入purpose字段,路径记作m / purpose’ / *,比如m / 0’ / *表示BIP32的默认账户。1 j& _0 H1 T- s- p' R
BIP44:定义HD钱包路径字段,赋予树状结构中的各层特殊的意义,从而支持多币种、多账户,路径定义为:
) d7 a0 \  e" g% N( s2 fm / purpose' / coin_type' / account' / change / address_index
& H4 f& ^, k% h& K0 M/ P4 j# T其中,purpose’固定是44’,代表使用BIP44;coin_type’用来表示不同币种,例如Bitcoin就是0’,Bitcoin Testnet是1’,Ethereum是60’;account’表示账户编码;change用来表示该地址是否为找零地址;address_index为地址编号。" {) }) F3 E9 d) Q! |0 e3 {  E
BIP45:定义多签名HD钱包路径字段,从而支持多签名地址,路径定义为:
4 ^. \$ O5 M. P# ?' E) um / purpose' / cosigner_index / change / address_index  @6 P2 x: R) f  U# Q2 ]$ e
其中,purpose固定是45’,代表使用BIP45;cosigner_index表示多签名用户编号;其余字段与BIP44相同。
9 F0 ~8 h) Y0 t8 WDagx钱包采用的是符合BIP44标准的HD钱包,其采用的路径结构为:4 e4 u0 [4 I' M  S) S. H
m / 44’ / 0’ / account’ / change / address_index, `  G( g9 a( W, R7 C. V

. H+ Y+ @& u# p3 R# `; w8 P+ n2 a; B/ Q此外,除了使用account来标识账户外,还使用了该账户公钥的哈希值对账户进行唯一表示,表示方法为:& x6 v, m/ z4 b4 V3 _9 F, y; M# Y
var wallet = crypto.createHash(“sha256”).update(xPubKey, “utf8”).digest(“base64”);: D- b) ~) V; O+ m( T' i% T6 \
Dagx中还有一类特殊的地址,即设备地址,其采用的路径结构为:
& {7 v' m) }0 Z0 Wm / 1’ / *5 a" O/ i& I4 Z* [* L
Dagx钱包使用了bitcore-lib和bitcore-mnemonic两个库进行钱包管理,简单的使用方法如下:
9 M/ V2 U) ]' W' z* ~ var Mnemonic = require('bitcore-mnemonic');/ ^/ ?* Z  q8 C' `
    var Bitcore = require('bitcore-lib');
' L1 D, `1 |$ d8 _0 @. B// 生成助记词
8 M  |8 r# S( T% F% ^+ C* ?* w 1 g' L# ?4 t) h0 y" P
// 'fee decorate step culture autumn game social very lemon drum embrace much'
$ V# p; C% b) U5 g0 ~- @8 [ 
5 i% K) c! X( }' ?" fvar mnemonic = new Mnemonic(); % f) U6 D: y4 M4 V  h
 
5 d! O6 n, k; l( H/ i5 m( {// 生成HD钱包私钥
9 U% A" i7 ^. f3 }% s2 I 
4 |* k* h8 Y4 r. f( s$ s9 m1 C1 x//
! G+ b/ I3 {8 |0 Z, Q9 i, h8 q# t 
( w4 t7 V+ ?( H+ j7 ?+ t0 }var xPrivKey = mnemonic.toHDPrivateKey(); & q% x, b7 I: D  S6 i7 `
 * Y$ g5 [* r6 K5 D6 q7 `! w
// 生成HD钱包公钥,account=0# g$ D) x5 i6 I
 4 g$ ]( u1 G; t0 {! j
//
& m" l% A, h! l) T 
0 Q6 f6 R% s( `7 ]7 svar xPubKey = Bitcore.HDPublicKey(xPrivKey.derive("m/44'/0'/0'"));
. M! m% l; J% p, j+ a% e 
$ [/ A7 s5 b- Q1 T* n4 O! N( l' Q// 生成设备私钥,用于产生设备地址, V- ?/ B# |5 h+ J
 
* d' j. S+ e3 k9 k. Y, g" S5 c& X//
/ L- E: V3 m) w" _# D  I) l" O 
' H: @) R9 [4 T0 qvar devicePrivKey = xPrivKey.derive("m/1'");
& G& i; c4 |3 y# m; [1 X
3 X* r: l9 U$ K2 o6 m5 F地址生成
/ k' M8 I  b# ?5 yDagx中包括三类地址:# g) m/ [$ c; ]& x4 x8 n
· 普通地址
1 W7 |) L  c& z0 R( v/ P* ~/ y· 共享地址  k/ z' X- e! c9 s
· 设备地址. T; n  O" x/ l" j. S: P
其中,普通地址和共享地址都是通过地址定义脚本生成的,二者的区别类似于Bitcoin中的P2PKH地址和P2SH地址,具体细节可参考《Dagx原理解析(三)地址、脚本及合约》;设备地址是采用设备公钥生成的,地址格式和校验规则与普通地址相同,只是前缀添加了0。
. x9 P- u7 L( M, |+ a* N4 ]给定需要生成地址的对象,Dagx生成地址时采用的是ripemd160哈希,并给地址加上校验,使用的是Dagxcore/object_hash.js中的函数getChash160()函数。
# ~8 M! u0 X# W/ b7 w具体来说,设备地址生成方法:% Y: A4 {& j$ q$ x2 w+ ?
var ecdsa = require('secp256k1'); // 椭圆曲线非对称加密; \2 ?/ g/ h9 z5 k
 
8 m8 i4 y' Y( U6 P' B& P* \// 获取设备公钥  q! b$ I5 b$ t
 ! q' p; d$ q: r$ r+ |: y+ e& B
var pubkey = ecdsa.publicKeyCreate(devicePrivKey.privateKey.bn.toBuffer({size:32}), true).toString('base64');4 q7 B) `8 W& C) d9 z& t
 
% Z# \: J/ H9 {; }$ R5 E// 生成设备地址* z% q$ d7 |+ ?* b
 
# f/ S1 v  w7 ^8 lvar objectHash = require('Dagxcore/object_hash.js');
, h5 B& [! D/ p0 [9 B7 I4 } 
. h0 Z" D8 u7 n) f0 lvar device_address = '0' + objectHash.getChash160(pubkey);/ o9 z& p$ d) K
普通地址生成方法:5 e6 P7 u1 Q7 D% ^1 T# h9 L+ L
// change=0 address_index=0,生成公钥4 R6 T& ^, `, c# q  v
 
4 t. d8 D- }3 K& X0 a% E+ @var pubkey = xPubKey.derive('m/0/0').publicKey.toBuffer().toString('base64');' z; l* v8 {0 i% }" x( X) J
 
! a) ]& P7 E4 ?( [; o// 设定地址定义脚本,为单签名2 _4 o$ S* V4 U; H: Q
 , j3 g9 c1 m0 r0 [
var arrDefinition = ["sig", {"pubkey": pubkey}];6 N" l( H$ J% X6 j
 ) l8 {! Z1 D9 X
// 生成地址7 A  e; S5 B2 W
 & F; Y' I% K" h" k3 r' Z
var address = objectHash.getChash160(arrDefinition);* M  P* Z: n+ b+ ]0 Y0 |3 J
共享地址的生成方法与普通地址基本一致,唯一的差别在于地址定义脚本要更加复杂一些。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

一夜雨十年灯潞 初中生
  • 粉丝

    0

  • 关注

    7

  • 主题

    11