Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEO 区块链钱包账号

博客园
141 0 0
钱包账号" q* I& v4 j, ?- }7 ?
neo钱包主要包括address,privateKey,publicKey,scriptHash,WIF这几个部分;它们之间存在一定的转化关系:. g) @9 I8 w+ O# Q( k7 ^% C
NEPWIF  Private => Public => ScriptHash  Address- i  k' I# t2 X
不开玩笑,除了 address 可以告诉别人以外,其它的对谁都不要说,address类似一个银行卡号,是别人想给你转账的时候使用的) _" K/ O/ ?7 l+ W- a
创建钱包账号! W5 t" M7 ?, _' N( J+ m
import { wallet } from ‘@cityofzion/neon-js’;
! d, Q5 e  ?. \/**8 }. F- V" U  v' F) {5 q3 F
* 根据passpase生产一个新的neo账号0 H  P4 ^* j! \; P3 y6 L- k3 r
* @param {*} passphase - l  K# H8 w9 _
* @param {*} confirmPassphase 7 k' }; w* Z0 B- o! D
* @param {*} wif 8 \+ Y* K# h0 y
*/: Y6 Z) J' M1 K$ E
export function createWalletAccount(passphase: string, confirmPassphase: string, wif?: string): ?WalletAccount {
( Q" B5 @  L6 L  F! [if (passphase !== confirmPassphase) return null;' }5 r5 \& L1 X) T- }; g0 t
var account = new wallet.Account(wif || wallet.generatePrivateKey());1 v! C! C- Y, V2 p
const encryptedWIF = wallet.encrypt(account.WIF, passphase);
% w2 V7 |7 ]6 x$ S, Wconst result: WalletAccount = {
; i0 H7 L  Q8 `2 [3 G# e; J  R/ Oaddress: account.address,
# q# \, U; \5 vprivateKey: account.privateKey,' K/ x/ T4 S$ u! O% p
publicKey: account.publicKey,+ y1 {! N* I. ?) ~& k
scriptHash: account.scriptHash,
# M' M8 `7 R/ |1 ?9 DWIF: account.WIF,
/ u: c3 y- \% n$ GencryptedWIF,
9 Z) g3 t" K# h2 ?+ rpassphase,
" L7 J* K8 I2 M3 M}7 p0 x5 N1 x+ ~' E! C5 r/ P/ D0 a& L  Z
return result;$ d' ?9 \* p# T' R! G+ U. _
}
1 q+ F5 P8 H+ l3 s5 C创建钱包账号单元测试. t4 l( D1 t! U. X7 n7 A$ _
通过jest对创建钱包的方法进行单元测试: s1 `) x- p. |: d6 ^7 G% H' u
test(‘createWalletAccount ‘, () => {
' f: ~% u: G- d- G+ M8 N7 Z# A3 O' ^5 Hconst passphase = ‘123456’;
% h  z% z2 o8 b3 y% tconst account = createWalletAccount(passphase, passphase);7 J3 p8 A( ~+ H9 l) H; s, @/ W
console.log(account);
( z. {) P# X3 e! K, Z9 J5 W6 \, w4 ]( ?expect(account.address !== null).toBe(true);7 w( M& w7 K) b' N/ D
});/ o5 u" _: x( K# Z# [9 A# p
运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。
2 k/ A! k& l7 H4 D{ . j; r. K# |8 [: O/ W
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,
" l4 Q6 v% S, e. KprivateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,
* [- Y1 a, _( P! H1 K; W3 c8 y, @( ppublicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
6 |, f( t$ R4 T3 u5 p; ]scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,
+ M# b# S! U! `$ aWIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
1 ^+ U' g& }: {% O, r# |+ WencryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,! _# n6 D# Y- p) |9 s5 i
passphase: ‘123456’ 5 L$ P% w, \$ V/ q  k& b
}
9 F( l9 g. }# _& r' M* d1 T% y转化) _7 R% ]' K9 e# U' Q; p4 @7 s
正如前面所述的,钱包里的各个数据存在一定的转化关系,至于详细的相互之间转化的原理,先不至讨论,我们可以使用neon-js的相关API来查看是否正确转化。' e) E, b0 B) t" w* _& D4 R0 a
NEPWIF  Private => Public => ScriptHash  Address8 f. W8 S! \/ z0 m
下面先新建一个jtest的单元测试文件Core.spec.js
$ A6 N  B+ V' k( w3 |8 @3 j9 ?0 I私钥到公钥的转化
% {$ r4 P* m& N/ g- ]5 ]' k这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。
* X% q1 h' R. ]0 D! O+ f单元测试代码如下:2 x- O+ U" I$ [* s' _
import {wallet} from ‘@cityofzion/neon-js’;# l( A. k) T- d) d  L
test(‘private:10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba get PUb_Key’,()=>{
# I0 Y& \5 A' Tconst pubKey = wallet.getPublicKeyFromPrivateKey(’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’);
( u" u5 U& _& R) b$ ~" ^expect(pubKey).toBe(’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′);
$ w0 S2 z0 @  Z5 W$ M, |});
4 l% o4 o+ M0 X4 t; D使用命令运行单元测试:1 G) S9 y3 J" {3 x
npm run test __test__/neo/Core.spec.js
- v* S. W6 g0 ]- x& d0 j/ ]: z  R运行结果:
) R" `  \% [* r" n# A2 V& S+ S+ Q# c  t5 u
所有转化
% b1 a+ d& q" r3 {! ]8 t完整的转化关系如下:
& _6 I. s  K) n, Q. ]0 f4 o# ]& P6 P% Himport {wallet} from ‘@cityofzion/neon-js’;
! M  O* l6 L5 ?2 s2 @const walletAccount = {
" F3 n2 k, |% Paddress: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,
6 x1 P$ v% e1 {# tprivateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,
4 `. }: f. {, tpublicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,( ?1 U) s5 ?4 r% `& }: Z' Z
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,
5 _3 a9 V" j2 B6 X4 ?% [WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,: n* P9 T5 W7 u* `% i
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,! U' `! m0 Y% P
passphase: ‘123456’ ! b( B& I$ V' {( w- o+ }& W
};
5 Z& B# a! X  B" [! Z% `, G// WIF  privateKey
' ~% i" R5 ?5 ]# q( ztest(‘WIF  privateKey’,()=>{5 \4 m% r' ~, U) }7 f
const wif = wallet.getWIFFromPrivateKey(walletAccount.privateKey);4 T0 |7 r; J1 S  D0 ~8 _* a
expect(wif).toBe(walletAccount.WIF);
% d1 ^0 q( I2 ^$ F6 Mconst privateKey = wallet.getPrivateKeyFromWIF(walletAccount.WIF);! K4 R5 J2 ~: i! M7 Q1 J( M3 i" c
expect(privateKey).toBe(walletAccount.privateKey);
$ w0 P4 o! K" e  j9 l});
( @' u* N1 S' x3 P; Y6 X0 n7 S// privateKey => publicKey
8 a3 l! T8 G4 _% wtest(`privateKey => publicKey:${walletAccount.privateKey}`,()=>{
  m. s4 f/ t& Y" iconst pubKey = wallet.getPublicKeyFromPrivateKey(walletAccount.privateKey);
, R" C3 Z% K2 A% ]3 cexpect(pubKey).toBe(walletAccount.publicKey);
; _& n+ Q' W" M  F0 u" i6 n});
/ ~# [* e! D, D1 Q) V1 j// publicKey => ScriptHash( S/ Z9 l  n. c" A0 U6 l" c# ^6 Z. ^
test(`publicKey => ScriptHash:${walletAccount.publicKey}`,()=>{
% B7 E' U/ C- s, Z3 |  b) Lconst scriptHash = wallet.getScriptHashFromPublicKey(walletAccount.publicKey);. y- r9 l0 l+ d" W; O! ]
expect(scriptHash).toBe(walletAccount.scriptHash);
+ {2 d6 n+ X0 N' S: w});! r- Q1 }- U1 K/ l& O
// scriptHash  address
6 ^" K6 f% P6 ^5 x" ctest(‘scriptHash  address’,()=>{
3 p( {0 F% l9 l% m% ^; Cconst address = wallet.getAddressFromScriptHash(walletAccount.scriptHash);  x& S' X) c4 P
expect(address).toBe(walletAccount.address);6 i0 D( G7 I6 k% ^. s$ [! ^
const scriptHash = wallet.getScriptHashFromAddress(walletAccount.address);
5 f, T& U: h; d4 Jexpect(scriptHash).toBe(walletAccount.scriptHash);
4 Z) [( _8 U7 ^});6 [& p: p# W) g' y0 K' C4 M
总结' C+ v* |9 X% D7 J5 w
如上,主要说明了neo账号的创建,以及讲述账号各个字段之间的转化关系,本篇使用的api为neon-js,这是coz在github社区开源的neo钱包api,它包含了钱包开发的所有的api,我认为它是学习钱包的很好的材料,当然neo-gui,neo-cli本身也是开源的,完全可以使用它们的源码来学习,只是相较于C#,对于开发跨平台应用,我更喜欢基于electron的方案。
# }! h" F8 d+ k为了学习开发neo钱包,我搭建了一个electron的boilerplate,作为快速启动的基础,这样其他同样想用此方案的朋友就不用再一次去搭建环境了。此boilerplate具体集成了以下技术方案:electron,React,dva,flow,antd;后面会抽时间把文中提到的jest也集成进去以便可以开箱即用的写单元测试。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10