Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEO 区块链钱包账号

博客园
98 0 0
钱包账号
% A0 y% B4 m; f3 g* `8 Zneo钱包主要包括address,privateKey,publicKey,scriptHash,WIF这几个部分;它们之间存在一定的转化关系:. V3 R" [! T, g7 l
NEPWIF  Private => Public => ScriptHash  Address1 P4 F% ?7 o1 x" P' n1 `
不开玩笑,除了 address 可以告诉别人以外,其它的对谁都不要说,address类似一个银行卡号,是别人想给你转账的时候使用的
6 `6 P8 T1 t3 ^' R4 G创建钱包账号
. ~  J% f6 Q( R7 Z: limport { wallet } from ‘@cityofzion/neon-js’;
/ g2 P5 d, ~, F0 f+ E7 [7 [8 q4 M- {/**
$ N6 I# L1 c# Q* x2 c* 根据passpase生产一个新的neo账号+ t# b: `) H# d+ L) y
* @param {*} passphase # b% v# H. Z* {$ f
* @param {*} confirmPassphase
6 g: \- E. {2 s2 A4 o* @param {*} wif
, J6 L$ o4 d. {+ g5 g! V. Q5 i*/) g. Z& M. V9 i: k" D/ {( Z
export function createWalletAccount(passphase: string, confirmPassphase: string, wif?: string): ?WalletAccount {6 l% O6 ?* o" t, u, Y0 B5 q/ A
if (passphase !== confirmPassphase) return null;$ K* D/ u5 r7 ]! a9 X' q, O4 R+ P$ S
var account = new wallet.Account(wif || wallet.generatePrivateKey());
) e' D# ^! f& P* }+ B7 Oconst encryptedWIF = wallet.encrypt(account.WIF, passphase);+ k/ M/ p  J# l: U
const result: WalletAccount = {
  b! f" S# t: J  B+ T0 ]address: account.address,, Y: C; Q6 y. A  d) `+ V0 L1 O4 U8 S8 i
privateKey: account.privateKey,$ S9 I6 f5 T+ O4 _5 u# s! U
publicKey: account.publicKey,
( ~; i& c8 K, k! E1 O$ i& EscriptHash: account.scriptHash,; ]6 Q6 R8 A, b1 A& v
WIF: account.WIF,
: p6 \% `7 c& D( C# A5 LencryptedWIF,
  ~/ k+ G' g& F' h7 }  n, {- ipassphase,
! k8 L: W9 X. P$ c$ Q$ P$ `- t}7 S1 x. z3 [+ {# K% y
return result;
: J" N% D. u8 Z$ r; Z}
8 M1 `$ x& R4 l' w. v创建钱包账号单元测试
& y/ w" H+ @- X7 }0 F) f通过jest对创建钱包的方法进行单元测试
6 x9 W, o+ j& S% P6 M# j) Wtest(‘createWalletAccount ‘, () => {
+ O9 @! N# v0 H) h( Econst passphase = ‘123456’;! D, z6 H5 y4 m# j& G0 x
const account = createWalletAccount(passphase, passphase);( R- H- W/ q0 R
console.log(account);
9 _( a# ]* A% ~. B" Kexpect(account.address !== null).toBe(true);
# J  P% U5 f* @# F/ b3 F});6 ^+ N; t" T3 Y
运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。7 Y, N$ l9 i$ `* w! E. m
{
$ B6 U' g& G9 }6 _- l( vaddress: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,' X' G7 [5 y/ p9 r4 r
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,
$ U, `. L# Q0 t5 k0 x0 b9 npublicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
- `5 J5 r' ~* y' d9 [scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,
+ L8 O- @: h9 bWIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
% I# q2 C6 B5 P( R8 m$ B# m3 ?encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,0 ]0 X( g8 \1 d+ Q. `
passphase: ‘123456’
! {0 B- M3 h8 G! u9 l9 N* e- Q+ a}: g" [+ e4 \4 ~; g% [- d# R
转化. X: V7 E7 C; k
正如前面所述的,钱包里的各个数据存在一定的转化关系,至于详细的相互之间转化的原理,先不至讨论,我们可以使用neon-js的相关API来查看是否正确转化。5 H7 {  K2 t- l) E
NEPWIF  Private => Public => ScriptHash  Address8 ]( }% D7 h5 A. K, I7 U' o
下面先新建一个jtest的单元测试文件Core.spec.js. t. J7 ^1 o( q3 f
私钥到公钥的转化) ~/ u% w9 R2 K( y$ f. ~0 d4 B
这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。: r! U/ ~$ _' c. t) l9 s( I2 t: q" R% k
单元测试代码如下:# }- F0 }! ?) s9 j* }
import {wallet} from ‘@cityofzion/neon-js’;
  j# }% A5 [! D6 ?/ ktest(‘private:10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba get PUb_Key’,()=>{
% ]. l, p( }  Y! D, ?) Xconst pubKey = wallet.getPublicKeyFromPrivateKey(’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’);( x$ B" Z; }; B/ U( A  T
expect(pubKey).toBe(’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′);) u8 k$ Y$ I0 }; J' O
});. Y3 G, s3 Y/ f0 ?/ [
使用命令运行单元测试:
" J! F& g* H5 k% S  M4 \/ h( [0 t5 N% Snpm run test __test__/neo/Core.spec.js' R7 L" U  a  l8 k, s* }) Z
运行结果:
5 K6 {2 [5 P1 M) g6 i
; b- n# o8 [7 D3 j所有转化9 P/ {' K+ I2 G9 b; ^2 Y9 B
完整的转化关系如下:
% }$ P4 R( M) l5 D) n7 Zimport {wallet} from ‘@cityofzion/neon-js’;( d+ E: k! p+ ]: ]4 W: |& ^/ B
const walletAccount = { 0 p2 v2 _' z$ {7 j5 _! d7 I, O
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,
( b  O2 r  Z" x) k* @privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,$ s( L. i; p2 ~5 m/ O5 I' c( [
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,- S* ~" z* d6 ?
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,
! G: t% N- @, B- NWIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,5 _# A4 v" O. _: @1 x) J% o7 S+ }; d' C
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,; K7 }# L) d+ H3 W2 v% |
passphase: ‘123456’
0 b# Q& i" O6 p1 I6 o" L};8 _  }0 C$ b5 c! o
// WIF  privateKey
2 ^5 d3 t% v4 d$ ^2 k4 [% Mtest(‘WIF  privateKey’,()=>{
' R# G) q/ p; a7 E, }$ p  n( V5 Y  x, Cconst wif = wallet.getWIFFromPrivateKey(walletAccount.privateKey);% m: e# H4 Q% L. r3 h5 H
expect(wif).toBe(walletAccount.WIF);
) e* P$ ^% r9 S6 S4 ~9 jconst privateKey = wallet.getPrivateKeyFromWIF(walletAccount.WIF);
6 p9 H8 u- f( e: ]" Yexpect(privateKey).toBe(walletAccount.privateKey);
* i) k: J1 Z2 A0 @& I& o});  o+ }. ]( \& K" M4 d: L; M
// privateKey => publicKey8 Y. T% r: ~+ K7 o8 ~
test(`privateKey => publicKey:${walletAccount.privateKey}`,()=>{' T' Z8 @& s* [# R
const pubKey = wallet.getPublicKeyFromPrivateKey(walletAccount.privateKey);0 S9 ~% l& k! u' S& W) _, l
expect(pubKey).toBe(walletAccount.publicKey);" c' d* u2 p+ A
});7 F5 M' w$ V9 L$ @- b7 [2 b; n
// publicKey => ScriptHash$ p( f* }) ^7 s7 g
test(`publicKey => ScriptHash:${walletAccount.publicKey}`,()=>{
0 a' ?3 O- u/ M) Cconst scriptHash = wallet.getScriptHashFromPublicKey(walletAccount.publicKey);
/ D8 u' j1 v  I7 Oexpect(scriptHash).toBe(walletAccount.scriptHash);# y" a0 P- ^1 b0 Y2 Y: p9 V
});2 D. g* ?: N- y" z& u* I
// scriptHash  address
4 A* B6 `7 x, h, K; ftest(‘scriptHash  address’,()=>{
! u7 ^' j& G. H3 f: p% D) i% |const address = wallet.getAddressFromScriptHash(walletAccount.scriptHash);0 T3 m7 F* `; [' n# q( |" t
expect(address).toBe(walletAccount.address);
- B0 Q2 k; V8 {. Tconst scriptHash = wallet.getScriptHashFromAddress(walletAccount.address);
; G7 T4 y8 S9 F8 b6 [) n( uexpect(scriptHash).toBe(walletAccount.scriptHash);1 L: C" K. W; S" |# v
});  r6 [7 R4 _- L- I" g" p
总结
5 ^4 M. O3 V+ C+ e如上,主要说明了neo账号的创建,以及讲述账号各个字段之间的转化关系,本篇使用的api为neon-js,这是coz在github社区开源的neo钱包api,它包含了钱包开发的所有的api,我认为它是学习钱包的很好的材料,当然neo-gui,neo-cli本身也是开源的,完全可以使用它们的源码来学习,只是相较于C#,对于开发跨平台应用,我更喜欢基于electron的方案。, x# f1 F% d! z: J
为了学习开发neo钱包,我搭建了一个electron的boilerplate,作为快速启动的基础,这样其他同样想用此方案的朋友就不用再一次去搭建环境了。此boilerplate具体集成了以下技术方案:electron,React,dva,flow,antd;后面会抽时间把文中提到的jest也集成进去以便可以开箱即用的写单元测试。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10