Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEO 区块链钱包账号

博客园
139 0 0
钱包账号3 M- z$ r( V# k
neo钱包主要包括address,privateKey,publicKey,scriptHash,WIF这几个部分;它们之间存在一定的转化关系:
5 J$ {$ `6 w/ i8 w: E" gNEPWIF  Private => Public => ScriptHash  Address
  {1 H7 c0 E* r4 o0 v# ^+ Z  i不开玩笑,除了 address 可以告诉别人以外,其它的对谁都不要说,address类似一个银行卡号,是别人想给你转账的时候使用的
, N4 ?- j; Q! t# f创建钱包账号
( M5 B2 S/ Z  ~/ Z3 t  M& \* bimport { wallet } from ‘@cityofzion/neon-js’;  ~& U( @0 u8 J4 [
/**
+ C- M$ T/ \0 Z/ {/ {+ f+ T* 根据passpase生产一个新的neo账号
* U) n3 k  P! [% z6 N/ [7 g" h* @param {*} passphase 9 i5 x% _, e3 ?8 C" f, ]% P$ f
* @param {*} confirmPassphase
( y5 p4 }3 e8 P: n6 |$ I& X( w7 |* @param {*} wif 3 {5 K7 b: _2 N. S9 l& H
*/; L. a; R" q- m2 m' j9 c1 S
export function createWalletAccount(passphase: string, confirmPassphase: string, wif?: string): ?WalletAccount {
$ x) Z5 g. `2 y/ E5 _9 Oif (passphase !== confirmPassphase) return null;
* O: A. c+ ?9 v" c4 ^var account = new wallet.Account(wif || wallet.generatePrivateKey());
1 F6 Y3 n  G1 Y! L1 p( Iconst encryptedWIF = wallet.encrypt(account.WIF, passphase);
: b1 U. x5 Y, Nconst result: WalletAccount = {1 n8 k- `2 ^, r# t
address: account.address,. i$ O0 ^! o1 e) P5 Y1 T
privateKey: account.privateKey,
+ D  z# V. |6 G5 x6 npublicKey: account.publicKey,
: |" k; u! g) x4 H3 Y2 P* y6 EscriptHash: account.scriptHash,
( O4 _8 G; v4 c# k1 sWIF: account.WIF,  H) p9 T0 u$ Z) I# r
encryptedWIF,
  m9 d0 S2 q' [. h  Dpassphase,
! h; i: m, ?& y; N7 }, O/ a}- a0 f5 Z" x6 X
return result;, L* _# N, J; ?9 m, s: V
}; p  V0 y  ~( T1 ^8 i0 C
创建钱包账号单元测试
4 T/ \& @5 z7 z# m: I. J0 }通过jest对创建钱包的方法进行单元测试8 E  ?3 I7 ?! `' U- n$ x) r9 c
test(‘createWalletAccount ‘, () => {
, F2 X: ?( s+ I8 ~const passphase = ‘123456’;
9 Y# t& v+ o) B7 `8 b! Econst account = createWalletAccount(passphase, passphase);$ y  ]8 a8 n' `5 q- K
console.log(account);
) ^, ~6 z" x8 R- ^" Qexpect(account.address !== null).toBe(true);9 j/ a  n7 z) v# ^) N
});
9 r7 _- h+ v) w2 U7 ~运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。
2 Z& t+ i) U  U: h4 v& q{
0 v  }4 l, M5 b, L& i( M. Daddress: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,  H5 ?  V/ i1 I- G. K
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,  b8 l1 K0 Z( O: s# v
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
5 ~& c9 R/ {9 X8 w5 d5 I# d) XscriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,
( }4 r& l# R- Z+ f+ D" P2 _2 m! K* gWIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
* n2 B5 U( j3 c3 Y; L6 TencryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,
( C" z: E2 P& `0 p8 \passphase: ‘123456’
# k& ]# h9 H* z; [}
% B5 {& U3 g& a7 N! Z, A  s1 S转化* ^9 l5 i8 Z) I* w
正如前面所述的,钱包里的各个数据存在一定的转化关系,至于详细的相互之间转化的原理,先不至讨论,我们可以使用neon-js的相关API来查看是否正确转化。6 k$ Q- Z2 C3 `; H# X: g  s
NEPWIF  Private => Public => ScriptHash  Address
6 _& \) N" E4 d+ d下面先新建一个jtest的单元测试文件Core.spec.js1 B( |1 S; L: [, q7 y4 D3 i2 }, W
私钥到公钥的转化- v2 d( T: S+ F0 i* w2 Z- `
这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。# G2 K' q8 k3 ~8 ?; j5 M% \
单元测试代码如下:
8 |; X9 N7 w* w! p$ N5 T0 N- Himport {wallet} from ‘@cityofzion/neon-js’;
5 o# T( Q2 g* s/ o8 Q) Qtest(‘private:10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba get PUb_Key’,()=>{+ Q* U" ^2 ^- |( P5 \
const pubKey = wallet.getPublicKeyFromPrivateKey(’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’);
5 j9 M  }3 \4 h% C& vexpect(pubKey).toBe(’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′);
. x% A- k; W0 k2 H9 j* {5 X3 k* N});, K% S* U3 U4 C, n0 X
使用命令运行单元测试:5 z! P" V1 T/ W! i* V/ j! T( n6 U8 U
npm run test __test__/neo/Core.spec.js$ o* B+ x/ F7 A0 H5 A5 x( @
运行结果:  u4 W# d: \# J

6 l* Y% ]5 d, _/ b8 A* W3 a所有转化
' C- E+ v+ y+ y完整的转化关系如下:
- ]+ N6 k2 M  j9 p3 uimport {wallet} from ‘@cityofzion/neon-js’;+ ]2 w0 C8 f, @! h
const walletAccount = { & U8 U( b4 D% C4 r; b
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,
) E5 o) G: ^1 i- t# f5 HprivateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,, D' P% \/ A6 B
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
; j6 \( n' _. V- `scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,5 {& ~* ~7 R- r: G
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,% G: C" H* w- y1 D- i# o+ Q2 R
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,
& T8 V6 d9 a& p$ _3 `, Npassphase: ‘123456’ * N, a2 F! m) [6 M; J
};4 V( c9 H' c, u% p3 ], \: B6 B0 q( u
// WIF  privateKey
0 ?  U! t5 i; P5 h" u' mtest(‘WIF  privateKey’,()=>{6 h$ Y! @0 C5 T0 N
const wif = wallet.getWIFFromPrivateKey(walletAccount.privateKey);
' s& K. u" ~9 T( Y) {. H. z& e' i5 J5 gexpect(wif).toBe(walletAccount.WIF);
1 I' e" g- J, A. K6 tconst privateKey = wallet.getPrivateKeyFromWIF(walletAccount.WIF);
! S6 j6 P' s4 X: D) g' h3 u: u0 c% F1 Jexpect(privateKey).toBe(walletAccount.privateKey);
$ s4 O6 ?9 w+ X$ S});
' y9 u1 G. i9 l2 D: M! e  Y// privateKey => publicKey; p2 r. ?% v  A' _
test(`privateKey => publicKey:${walletAccount.privateKey}`,()=>{( z0 u3 Y( Z3 o: i# T0 H7 _
const pubKey = wallet.getPublicKeyFromPrivateKey(walletAccount.privateKey);; W& s: f: k0 ^$ j# Y) C" H
expect(pubKey).toBe(walletAccount.publicKey);5 V, _3 B+ B$ Q
});
+ g7 Y3 S6 A9 D/ q$ Q/ E* c// publicKey => ScriptHash! P2 J7 i0 G6 r! P* V9 W
test(`publicKey => ScriptHash:${walletAccount.publicKey}`,()=>{. {/ b: O+ h% z' j9 W; a& H5 O
const scriptHash = wallet.getScriptHashFromPublicKey(walletAccount.publicKey);+ Q$ V% r1 u* M/ ^4 G
expect(scriptHash).toBe(walletAccount.scriptHash);! J5 I8 Z# Z5 V+ q2 o4 E
});  H7 H3 }, f) e3 @2 o
// scriptHash  address8 {% X" z* Y+ t9 P% L/ q% }  f$ h  q
test(‘scriptHash  address’,()=>{
) q' r- E- O; `) e. Bconst address = wallet.getAddressFromScriptHash(walletAccount.scriptHash);3 U5 X& h4 N  C7 p1 P
expect(address).toBe(walletAccount.address);6 }; K1 K; C. v3 S  D1 p3 n; L
const scriptHash = wallet.getScriptHashFromAddress(walletAccount.address);, F; g- C  }" ~4 L! e: j1 l
expect(scriptHash).toBe(walletAccount.scriptHash);5 j& j2 b9 s5 N* W) [$ q+ M; m
});
. w; d# ]) t: G$ B总结2 x! a$ i! R0 [$ a; j6 m
如上,主要说明了neo账号的创建,以及讲述账号各个字段之间的转化关系,本篇使用的api为neon-js,这是coz在github社区开源的neo钱包api,它包含了钱包开发的所有的api,我认为它是学习钱包的很好的材料,当然neo-gui,neo-cli本身也是开源的,完全可以使用它们的源码来学习,只是相较于C#,对于开发跨平台应用,我更喜欢基于electron的方案。
& q. j) A% A# @1 z为了学习开发neo钱包,我搭建了一个electron的boilerplate,作为快速启动的基础,这样其他同样想用此方案的朋友就不用再一次去搭建环境了。此boilerplate具体集成了以下技术方案:electron,React,dva,flow,antd;后面会抽时间把文中提到的jest也集成进去以便可以开箱即用的写单元测试。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10