Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEO 区块链钱包账号

博客园
95 0 0
钱包账号
/ ^* e+ U; C& Q$ ]8 j. B/ mneo钱包主要包括address,privateKey,publicKey,scriptHash,WIF这几个部分;它们之间存在一定的转化关系:& q, L$ v! {  L
NEPWIF  Private => Public => ScriptHash  Address7 b3 K, w1 s$ g" k: c9 H
不开玩笑,除了 address 可以告诉别人以外,其它的对谁都不要说,address类似一个银行卡号,是别人想给你转账的时候使用的+ L, I: W0 ^+ K0 L
创建钱包账号  G6 ^3 V  C) t2 \, _2 x$ o" f
import { wallet } from ‘@cityofzion/neon-js’;* g- L/ e' J0 M  ?4 F
/**
0 }. W4 e( [  F( \  K% Y7 L2 W* 根据passpase生产一个新的neo账号& ^8 O" ~! f: d
* @param {*} passphase
# A% g) N( y/ n6 W" j; z* @param {*} confirmPassphase
$ f5 {# [; O' D* @param {*} wif 8 A4 d& Y4 {! M) g1 x* p
*/4 \, B/ |6 B% v8 s8 l2 d& Y
export function createWalletAccount(passphase: string, confirmPassphase: string, wif?: string): ?WalletAccount {
' v6 ~! P' s( y$ y$ g% Bif (passphase !== confirmPassphase) return null;* ]# J, U% N+ e& ?: M) j
var account = new wallet.Account(wif || wallet.generatePrivateKey());7 j8 ]) J* {# v9 H' V
const encryptedWIF = wallet.encrypt(account.WIF, passphase);
) o9 X5 `4 X8 I. o. Zconst result: WalletAccount = {- J# \- W* G+ t' I9 z+ i
address: account.address,, I* ?' a; t; N' I) B4 j
privateKey: account.privateKey,
3 ~. [+ A7 x* m1 d5 `publicKey: account.publicKey,
' P" v0 q* k! j4 uscriptHash: account.scriptHash,
. y! s% N' h0 c0 ]+ ZWIF: account.WIF,
. ^/ S7 l- _( E1 e1 O- v; @/ XencryptedWIF,7 Q9 e% L& _5 y4 `
passphase,/ q' r+ D* T/ u; F
}2 V# j! @6 P: Q
return result;
: y6 |: E# I6 q6 u}# N7 K; m+ S% K. i3 g
创建钱包账号单元测试
2 x& b  L" ~+ h% J' c通过jest对创建钱包的方法进行单元测试
& O: s( E9 f! k2 ^$ R# O: gtest(‘createWalletAccount ‘, () => {
% O% f6 S/ }  S' Y, _const passphase = ‘123456’;
# \9 }( ^* q- B$ T. ^2 Pconst account = createWalletAccount(passphase, passphase);
/ f; R- R( Q" K/ lconsole.log(account);7 S8 c% u& p0 e4 f- v* |/ U3 b
expect(account.address !== null).toBe(true);2 k1 |4 T" l7 {/ o: o- I# z8 A7 H" d
});- ~# ?8 l& ?( i" l# R
运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。
( Q  A1 t9 h; z& E{ # ?$ m" g. o+ H; i
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’," C; b$ }7 r5 g/ T
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,
4 a3 n% C- `' dpublicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,$ [. q  ?& H+ c  Y& v& y
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,& J% R. b" Q6 ~, y
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,0 c% o8 e, m1 o5 A7 f5 i  l+ @
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,% w3 @% n! H9 \/ R
passphase: ‘123456’ 2 W5 ~/ a" N& h6 _- Y# {; F
}
! O+ k  Q( e. ?# B: g9 T4 k转化6 D/ o6 V  j& a1 d
正如前面所述的,钱包里的各个数据存在一定的转化关系,至于详细的相互之间转化的原理,先不至讨论,我们可以使用neon-js的相关API来查看是否正确转化。
* l8 ^- x/ Z1 Z  ~( \) {( I" GNEPWIF  Private => Public => ScriptHash  Address& K7 |" l" W$ z
下面先新建一个jtest的单元测试文件Core.spec.js8 J3 U1 V- S# v2 b
私钥到公钥的转化
& h& n$ P9 z- q/ s; D这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。
: W" r! n* U6 [: y/ }# o单元测试代码如下:
8 Y, M& |4 b+ a4 timport {wallet} from ‘@cityofzion/neon-js’;
& y# {6 g# v* E+ X) {+ g" K0 ctest(‘private:10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba get PUb_Key’,()=>{
8 Q# k% }7 Z& n$ M* Gconst pubKey = wallet.getPublicKeyFromPrivateKey(’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’);( A: P9 w+ c, P
expect(pubKey).toBe(’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′);) p1 c" ^9 |/ W$ ~
});
# U# j/ D  c& Y& O使用命令运行单元测试:
: U% w, a2 C# w% [) ^9 x" {' Mnpm run test __test__/neo/Core.spec.js
2 P0 ~9 q* F* X4 b运行结果:
% o* c: y7 l$ {! h( K7 }% L- a  E# v- }% a# R
所有转化/ \; U9 d0 X% z- u6 a* i
完整的转化关系如下:
- w  m% Z% M# m% l$ t7 cimport {wallet} from ‘@cityofzion/neon-js’;. z" n' q1 a7 i& e8 b: q& o6 G7 ]* B
const walletAccount = {
8 M1 L& C' d3 B* u$ Z# saddress: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,& ~# u9 A6 ?6 o
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’," T: v. V$ X/ O& q  r6 q
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
) y* z; Y6 T! C8 S; y" `! [5 escriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,
8 p# X: F, T; \WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,  x5 o! K+ |# ?% s- f: L9 i2 w
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,
' k0 Z) Q1 c; u. J8 m: U) s# upassphase: ‘123456’ 8 Y5 U% n3 }3 v4 |6 n, O
};! `- n! G% i1 o- t" L7 U  P. z+ q
// WIF  privateKey5 k9 W6 t. l+ z( I2 ~
test(‘WIF  privateKey’,()=>{+ ~; K4 V8 K# i% g6 H
const wif = wallet.getWIFFromPrivateKey(walletAccount.privateKey);) x8 T2 [& A) s# x- X* @
expect(wif).toBe(walletAccount.WIF);( u! m! j' N; e; I' b  y
const privateKey = wallet.getPrivateKeyFromWIF(walletAccount.WIF);
0 W: x" \: L* S  c7 A- S6 `9 _expect(privateKey).toBe(walletAccount.privateKey);
. {5 P) D1 [: v% M7 T( P5 M});
" X5 Y) P9 T* T! D// privateKey => publicKey
4 M8 d8 V$ i8 |; S0 m7 g: C; qtest(`privateKey => publicKey:${walletAccount.privateKey}`,()=>{
- B$ i# A& e* p7 n, D( S! lconst pubKey = wallet.getPublicKeyFromPrivateKey(walletAccount.privateKey);
% l; q; h' b8 t, l5 {( ^6 bexpect(pubKey).toBe(walletAccount.publicKey);
8 ~4 S: [3 T! e/ s% B/ W, e( e});
8 T$ X3 A4 u$ b8 x# C2 u# `// publicKey => ScriptHash, s0 N$ |9 v2 C* G- i+ w
test(`publicKey => ScriptHash:${walletAccount.publicKey}`,()=>{, k4 l: l3 D7 o
const scriptHash = wallet.getScriptHashFromPublicKey(walletAccount.publicKey);
$ [7 J6 h  l2 C" S9 ~' I7 Rexpect(scriptHash).toBe(walletAccount.scriptHash);
: I! p7 |; l. E2 [9 E});. M3 |& z) }8 q1 b* r
// scriptHash  address
. v3 r- e- h0 s7 ?test(‘scriptHash  address’,()=>{/ u' V0 K. r3 F6 k' j
const address = wallet.getAddressFromScriptHash(walletAccount.scriptHash);7 M: _+ m' t# r) n/ ?& C4 s# L. ?% S
expect(address).toBe(walletAccount.address);% Y. ?7 {, b+ ^* o" ?  T$ ~
const scriptHash = wallet.getScriptHashFromAddress(walletAccount.address);& C. X# p: e! v0 Y/ v, L! x8 F
expect(scriptHash).toBe(walletAccount.scriptHash);( L7 K+ n0 J- U
});/ z' M: X' l9 c8 [% }0 y' G5 G
总结
* d8 j7 C3 K+ N* S$ [) ^$ \4 I如上,主要说明了neo账号的创建,以及讲述账号各个字段之间的转化关系,本篇使用的api为neon-js,这是coz在github社区开源的neo钱包api,它包含了钱包开发的所有的api,我认为它是学习钱包的很好的材料,当然neo-gui,neo-cli本身也是开源的,完全可以使用它们的源码来学习,只是相较于C#,对于开发跨平台应用,我更喜欢基于electron的方案。
1 k4 h$ U3 T# c2 N) b为了学习开发neo钱包,我搭建了一个electron的boilerplate,作为快速启动的基础,这样其他同样想用此方案的朋友就不用再一次去搭建环境了。此boilerplate具体集成了以下技术方案:electron,React,dva,flow,antd;后面会抽时间把文中提到的jest也集成进去以便可以开箱即用的写单元测试。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10