Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEO 区块链钱包账号

博客园
79 0 0
钱包账号
* E% ~# I9 k1 }neo钱包主要包括address,privateKey,publicKey,scriptHash,WIF这几个部分;它们之间存在一定的转化关系:
+ @# v2 \$ ]# |NEPWIF  Private => Public => ScriptHash  Address% ^7 q5 e1 z6 p2 i5 C
不开玩笑,除了 address 可以告诉别人以外,其它的对谁都不要说,address类似一个银行卡号,是别人想给你转账的时候使用的5 e7 \4 \) n" Z" j5 P9 v% a
创建钱包账号
! Q0 z0 f; m( K0 \9 {& V) e' wimport { wallet } from ‘@cityofzion/neon-js’;: }- A& d% b% g$ c) G/ X. ^
/*** w7 Z/ |1 Q" _) `! J& W2 M
* 根据passpase生产一个新的neo账号
3 \4 I- x% K6 a& u* @param {*} passphase
& P" |# i  s- V' a* @param {*} confirmPassphase
+ J6 }& t# C8 [. ~  M5 J% @& ~* @param {*} wif 4 u' H: R' q' R3 C( w/ E4 w$ J5 V& @
*/
9 @' C: I  j2 Z/ J9 Y$ u# }export function createWalletAccount(passphase: string, confirmPassphase: string, wif?: string): ?WalletAccount {/ d+ m, u, W5 g, D0 G; D' E9 P: [
if (passphase !== confirmPassphase) return null;
4 P  v' U2 D$ X2 w3 s  O8 o2 jvar account = new wallet.Account(wif || wallet.generatePrivateKey());
/ j0 @4 \6 m9 w9 ?& t7 M$ ~7 ?const encryptedWIF = wallet.encrypt(account.WIF, passphase);1 S& @6 h  ~6 `7 F1 w2 e
const result: WalletAccount = {6 J; M- Q' @9 m, g
address: account.address,
, B* g# M& p: C. X6 E  J' L3 i9 WprivateKey: account.privateKey,8 f/ @; t3 w5 ~" Y& \6 H
publicKey: account.publicKey,
1 r5 l. U% q6 O. e1 k8 c( {scriptHash: account.scriptHash,
. a7 q0 p' D# ?+ JWIF: account.WIF,
  D. B3 F' c. [$ |' N# }encryptedWIF,
8 a& E1 S  W# [2 epassphase,. ]( r' w6 e! b$ r2 x
}5 B2 z/ Y# n+ O
return result;1 f) z+ ?' F0 |% r
}- v9 M" c. ^' N
创建钱包账号单元测试
: S* ^' j; w; I) q2 W  [: r  ?通过jest对创建钱包的方法进行单元测试5 o# e$ o  ^( q' K. j- c* z
test(‘createWalletAccount ‘, () => {. m) k8 m1 O- M# `- _/ `" q' ~
const passphase = ‘123456’;0 G2 G5 M3 S- c+ ~. Y
const account = createWalletAccount(passphase, passphase);- I7 U: m+ y( b  V) X; a& m" U
console.log(account);
' d1 L, }+ C$ D" kexpect(account.address !== null).toBe(true);
2 |1 Z  y8 |1 g9 D( `1 _+ g& G});% m7 J% M: H, I8 y9 P5 h4 w* T
运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。5 {, J- F  W" ^$ R# |" ]
{ 2 @7 t1 ^9 A6 T) V/ D+ H, o% K
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,
2 Y4 N2 W1 I+ h) g' DprivateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,1 }/ W/ M+ R* }: s4 X
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
+ @+ ~. }2 l% v+ yscriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,
  C9 \, u+ i  w  \% p4 zWIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
1 [! J; F3 {( K1 G9 kencryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,9 \* x; B' i( n3 d# F, p- M
passphase: ‘123456’ : J$ A, [( f% P* o
}+ P4 r) f( t: S% N, q! R' r* L
转化
; q# g: W! l+ O* b正如前面所述的,钱包里的各个数据存在一定的转化关系,至于详细的相互之间转化的原理,先不至讨论,我们可以使用neon-js的相关API来查看是否正确转化。
  n5 N5 U. P: ^1 w& W2 k" ]9 y* }NEPWIF  Private => Public => ScriptHash  Address/ i' Y8 V: [: c7 _, q& F
下面先新建一个jtest的单元测试文件Core.spec.js4 `: Z3 }' b; f
私钥到公钥的转化  o+ L/ U* @1 G# \* |5 X' I
这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。
# t6 |) T5 k5 c单元测试代码如下:
& q) a8 C- W+ [1 ~. Y2 Dimport {wallet} from ‘@cityofzion/neon-js’;# d1 D* x: S+ b
test(‘private:10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba get PUb_Key’,()=>{
# k5 I  S5 \/ N0 v: G8 U$ L* g. m# s1 sconst pubKey = wallet.getPublicKeyFromPrivateKey(’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’);
: A- i: v' t* W1 ]expect(pubKey).toBe(’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′);
3 |- D& w9 ^: s' u0 x});; N5 \2 V" I( v. D. Z
使用命令运行单元测试:
5 P2 m0 x1 I) a# l8 o% G! Mnpm run test __test__/neo/Core.spec.js
# i* V, t( ^4 [7 c" q- X; O运行结果:
7 q& {6 r8 B( A( x( |  K+ @# f- }6 o0 n8 d
所有转化! |, q4 l. h. O( e# S
完整的转化关系如下:: C  v: X. G0 Q+ V# g3 K
import {wallet} from ‘@cityofzion/neon-js’;
# l: y- S' a% K5 n6 ]const walletAccount = {
0 ?; u( G3 M+ e  d+ raddress: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,0 r/ t' ~& p' N& p
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,
' `4 d# J' q* X; rpublicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
0 J2 s' N3 R/ {# Y" oscriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,: p, v1 `: P7 ~# N  I; Q/ D% W. D
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
! t. }7 R: p7 L! qencryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,
; p) Y0 o: ^- I4 [# @6 ppassphase: ‘123456’ - f; X3 U/ W, i
};
) S0 t* o* G- P" s// WIF  privateKey7 i5 T( d; R* }( P) v
test(‘WIF  privateKey’,()=>{
2 }& ^% I. V9 g% Q9 \6 w9 \const wif = wallet.getWIFFromPrivateKey(walletAccount.privateKey);
- V# I/ N0 }& D2 Eexpect(wif).toBe(walletAccount.WIF);9 V6 R# U" @' P( g- z5 ~+ b8 J$ {
const privateKey = wallet.getPrivateKeyFromWIF(walletAccount.WIF);
1 x0 W* {; Y( N$ U- s( a4 Jexpect(privateKey).toBe(walletAccount.privateKey);
: ]- |6 y* G& ^});3 h( L9 x3 A6 @* T" j# Q
// privateKey => publicKey9 T; q# Q7 X" A% P1 L
test(`privateKey => publicKey:${walletAccount.privateKey}`,()=>{( M4 ]4 Q$ L0 L! q. n) k
const pubKey = wallet.getPublicKeyFromPrivateKey(walletAccount.privateKey);. Y( K5 d5 v: j' {: h4 j2 _" O
expect(pubKey).toBe(walletAccount.publicKey);
! Q: Z% p; S. B});) E5 J8 q) h( u( Q3 ?
// publicKey => ScriptHash2 p" g8 j  R7 J  G) ]& M! k2 P
test(`publicKey => ScriptHash:${walletAccount.publicKey}`,()=>{
+ q/ D5 B* m. |4 C4 s3 T" A  g7 Aconst scriptHash = wallet.getScriptHashFromPublicKey(walletAccount.publicKey);
) L2 n/ _" W) Yexpect(scriptHash).toBe(walletAccount.scriptHash);
: }1 T: W  s! v3 h- G/ i& A! t- N/ B});
9 g0 N/ n. i  @9 F# w  `' e// scriptHash  address! u% P0 u4 \8 S) G9 ^
test(‘scriptHash  address’,()=>{
7 F7 Q6 ^& L1 i# _/ z7 g# E: I3 pconst address = wallet.getAddressFromScriptHash(walletAccount.scriptHash);7 D. E( N2 A$ A6 Y4 F
expect(address).toBe(walletAccount.address);
) k9 b; ~5 ^7 k& j% uconst scriptHash = wallet.getScriptHashFromAddress(walletAccount.address);
' x$ f$ y  `$ Z, U8 Pexpect(scriptHash).toBe(walletAccount.scriptHash);
- D; g/ Q# s9 y6 T% _4 M8 }8 I% ?});. `: B6 p) ]% }( H+ q9 {
总结
  N! r1 s7 G; Q3 Z- j6 M4 b; z. w如上,主要说明了neo账号的创建,以及讲述账号各个字段之间的转化关系,本篇使用的api为neon-js,这是coz在github社区开源的neo钱包api,它包含了钱包开发的所有的api,我认为它是学习钱包的很好的材料,当然neo-gui,neo-cli本身也是开源的,完全可以使用它们的源码来学习,只是相较于C#,对于开发跨平台应用,我更喜欢基于electron的方案。
" @! j+ h4 Y2 m. e5 X为了学习开发neo钱包,我搭建了一个electron的boilerplate,作为快速启动的基础,这样其他同样想用此方案的朋友就不用再一次去搭建环境了。此boilerplate具体集成了以下技术方案:electron,React,dva,flow,antd;后面会抽时间把文中提到的jest也集成进去以便可以开箱即用的写单元测试。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10