Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEO 区块链钱包账号

博客园
138 0 0
钱包账号9 w2 I6 e8 X1 ^0 ~3 i
neo钱包主要包括address,privateKey,publicKey,scriptHash,WIF这几个部分;它们之间存在一定的转化关系:: h/ _' D' o1 M5 c/ J3 Q
NEPWIF  Private => Public => ScriptHash  Address
3 f! v- _' r# I0 c) ^: u2 ]不开玩笑,除了 address 可以告诉别人以外,其它的对谁都不要说,address类似一个银行卡号,是别人想给你转账的时候使用的
1 |, D. V; x: X7 K9 U创建钱包账号
. i9 s2 V7 q! S) Q' V2 Jimport { wallet } from ‘@cityofzion/neon-js’;8 s# M% j+ O; V
/**
) F7 _9 u1 q  Y7 R5 c* 根据passpase生产一个新的neo账号* u; ?  V3 r# y" _7 i) x5 K
* @param {*} passphase / B9 o' c8 S/ c3 O+ H2 Z
* @param {*} confirmPassphase + \  ?- C) K0 ?: r+ l$ V5 }* {
* @param {*} wif
+ W/ H" J' L; `  o: h*/
6 q5 M: r3 }7 q3 |, _export function createWalletAccount(passphase: string, confirmPassphase: string, wif?: string): ?WalletAccount {  d* ~$ I$ }+ O& K$ B" a+ r2 T
if (passphase !== confirmPassphase) return null;  Q# j* }# U' @1 O9 w- C, \
var account = new wallet.Account(wif || wallet.generatePrivateKey());% ~6 w5 F4 r  ?. p& x1 S. y
const encryptedWIF = wallet.encrypt(account.WIF, passphase);/ E! |8 f! S! ^! s1 j# q( P
const result: WalletAccount = {
" E/ m( w' Y; ?address: account.address,
) p( s  |7 a  q* pprivateKey: account.privateKey,
, |9 u, k, R; _3 o/ NpublicKey: account.publicKey,# y8 z: S+ x) @! M
scriptHash: account.scriptHash,+ Y0 ?/ V' i8 g- t6 [& }/ [( k
WIF: account.WIF,
/ G+ ?, ?+ Z$ Q* hencryptedWIF,8 E9 |% `0 t$ G( M) b# p0 N# z
passphase,
4 c2 I" e! x( C% z: h/ Q}
( f( X% c9 w% r/ ^/ Treturn result;
% d- T& @7 \4 [3 N. W5 a, P) |! t9 ^}: D; P! I1 Y5 H6 {! W
创建钱包账号单元测试+ Y  t4 |; B1 J$ l  v# I+ V
通过jest对创建钱包的方法进行单元测试" w9 |8 J, N! s* n
test(‘createWalletAccount ‘, () => {
6 \8 \+ R0 I5 u$ {. aconst passphase = ‘123456’;/ \! e1 z0 }; i( `6 O, O1 H
const account = createWalletAccount(passphase, passphase);
" k8 q+ j9 l  {console.log(account);, B  R# ]( `( D1 Y
expect(account.address !== null).toBe(true);
0 l" h" J9 F6 L2 l});, W+ N4 W8 z. O" I2 H- t0 \4 P
运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。
: s1 a, i" L1 b# ?3 y{ * g, X9 R9 T0 ]/ C/ {* J
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,5 N5 E' `) [2 j1 D5 z+ Y: \
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,
) x$ A0 c( H8 [1 Z  epublicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,1 ~7 }2 W& q& f5 o6 M! z- w
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,6 d/ h" Z1 A  F% m( X5 q
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
+ F( c% I( k6 ~  j5 `  hencryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,
2 m; f7 |  W0 t% d- @7 g+ W- ~2 y9 \( opassphase: ‘123456’
! Y7 I3 h. t  t( Q}
5 |. L: d$ S, P# u5 ?7 y转化+ G2 J- _. p. O' X9 k
正如前面所述的,钱包里的各个数据存在一定的转化关系,至于详细的相互之间转化的原理,先不至讨论,我们可以使用neon-js的相关API来查看是否正确转化。
3 Z0 C( U) C/ m3 o$ U* b- F! DNEPWIF  Private => Public => ScriptHash  Address
5 e) j* K& [1 f& R6 z% l下面先新建一个jtest的单元测试文件Core.spec.js; L. `& o! ~% L
私钥到公钥的转化, P5 k! P$ q# s! A
这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。
1 ?- x8 Y( }/ B$ L+ f. A  ]9 e单元测试代码如下:" ]- A- e( L! e! _8 n
import {wallet} from ‘@cityofzion/neon-js’;
3 r. E# r; |$ x: \2 W6 C2 ltest(‘private:10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba get PUb_Key’,()=>{7 m! C; a7 d0 x; I8 [5 U' m  V
const pubKey = wallet.getPublicKeyFromPrivateKey(’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’);8 X, i+ E3 j6 @, {  l8 K
expect(pubKey).toBe(’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′);
: q6 i* v; e, \$ X2 `});
) Q/ F4 d/ Z/ R; |* E0 z2 _5 }# F使用命令运行单元测试:5 D+ E9 u/ O4 ^' u
npm run test __test__/neo/Core.spec.js$ X' {# V4 y/ G
运行结果:) ^" I' t% V) h0 q% I

# \# V5 J( I' B9 I% G" c1 `5 m所有转化
8 d( R& }% @# O7 V( h完整的转化关系如下:, H2 D$ P) ]; v( ]7 P$ x" ]2 l
import {wallet} from ‘@cityofzion/neon-js’;
2 C2 [0 \9 `  l& c. ~5 h2 J; n' kconst walletAccount = { 1 t3 _9 m3 C3 W
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,
4 k: ~* W( d! G( m& o6 U6 G- tprivateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,
  z; n2 `; C, E4 j. y& N' apublicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
$ ?! d1 R( R) a' N) z8 VscriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,% X- l( X3 @) s, J2 i5 Y' o
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
/ F+ `% y& l5 hencryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,+ r% B8 H7 ?8 o& j! V8 a' l' b
passphase: ‘123456’
+ L& e. D- Z4 W- ~6 u};
0 i7 u" g- U6 n// WIF  privateKey' W' D! a+ x# b" j! i/ U
test(‘WIF  privateKey’,()=>{
  ?0 E" M6 u2 w" o, e6 o' Wconst wif = wallet.getWIFFromPrivateKey(walletAccount.privateKey);
' z' u/ |# a. P' uexpect(wif).toBe(walletAccount.WIF);2 w4 p7 \4 E1 ^) q0 ]; ]
const privateKey = wallet.getPrivateKeyFromWIF(walletAccount.WIF);
3 o! G3 A* K/ {3 c  w4 p& T5 Nexpect(privateKey).toBe(walletAccount.privateKey);3 S9 k, d( Y1 ]+ s- F' a/ Y, c
});
4 k& |& L; f  y( }/ `// privateKey => publicKey# A# P" p. o/ W4 ]
test(`privateKey => publicKey:${walletAccount.privateKey}`,()=>{
: P$ M3 N' ]; I: Y! ?# M4 ^& qconst pubKey = wallet.getPublicKeyFromPrivateKey(walletAccount.privateKey);: k3 ^& h( a: {/ Q, e
expect(pubKey).toBe(walletAccount.publicKey);' d8 r0 y' [$ z" {1 ]" Q$ ~/ `" ]
});
- |. I6 X: B% I3 K, G, \// publicKey => ScriptHash- }& D1 I6 L5 E- c
test(`publicKey => ScriptHash:${walletAccount.publicKey}`,()=>{
! r6 Y8 a; O! ^* K7 vconst scriptHash = wallet.getScriptHashFromPublicKey(walletAccount.publicKey);
& C# y5 s! o. m( `6 u: Fexpect(scriptHash).toBe(walletAccount.scriptHash);" u0 `# N& S  [7 p2 E3 X, }( T
});4 X8 K. l) _$ {
// scriptHash  address
5 h  P$ j  ^/ @: {$ A4 l3 Vtest(‘scriptHash  address’,()=>{
+ ]  Y, q) j7 mconst address = wallet.getAddressFromScriptHash(walletAccount.scriptHash);' V4 i6 E) P3 Q8 A' M& G- N: C* @4 d% \
expect(address).toBe(walletAccount.address);
; \+ l& q5 ~. D* M% ]& sconst scriptHash = wallet.getScriptHashFromAddress(walletAccount.address);/ j; {$ N7 F/ F2 D' w
expect(scriptHash).toBe(walletAccount.scriptHash);' m6 w4 p) p% a4 L# c3 u1 Z
});
5 I) z4 ~: Y' d总结
/ M/ h' ~6 @" p7 y如上,主要说明了neo账号的创建,以及讲述账号各个字段之间的转化关系,本篇使用的api为neon-js,这是coz在github社区开源的neo钱包api,它包含了钱包开发的所有的api,我认为它是学习钱包的很好的材料,当然neo-gui,neo-cli本身也是开源的,完全可以使用它们的源码来学习,只是相较于C#,对于开发跨平台应用,我更喜欢基于electron的方案。
6 Z% W+ _4 F7 _7 b! Z2 c为了学习开发neo钱包,我搭建了一个electron的boilerplate,作为快速启动的基础,这样其他同样想用此方案的朋友就不用再一次去搭建环境了。此boilerplate具体集成了以下技术方案:electron,React,dva,flow,antd;后面会抽时间把文中提到的jest也集成进去以便可以开箱即用的写单元测试。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10