Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEO 区块链钱包账号

博客园
99 0 0
钱包账号
  M5 p% \6 w' U4 I# Q0 ]; ^7 B+ Xneo钱包主要包括address,privateKey,publicKey,scriptHash,WIF这几个部分;它们之间存在一定的转化关系:' n6 v6 F0 k& ?" ~; L( [7 f
NEPWIF  Private => Public => ScriptHash  Address* a& A( [9 a8 f4 M0 {8 |3 v  X
不开玩笑,除了 address 可以告诉别人以外,其它的对谁都不要说,address类似一个银行卡号,是别人想给你转账的时候使用的
8 e' S' O: y2 c' p* y9 b创建钱包账号
4 Q7 r! A% w, U" Timport { wallet } from ‘@cityofzion/neon-js’;
0 d0 z/ W4 l4 t' q* z( E/**+ z+ m5 b& E  W+ H/ Q& w, s9 K8 J
* 根据passpase生产一个新的neo账号0 w' t* v! V" l( ^: R
* @param {*} passphase
) @9 x* ?4 i& Z6 e! v  L* @param {*} confirmPassphase $ V% N+ C" F7 A$ G& l$ M; o* q
* @param {*} wif : ^6 ]& k" |- P% ?! g- u
*/+ F! G' u* {, k. E
export function createWalletAccount(passphase: string, confirmPassphase: string, wif?: string): ?WalletAccount {
1 i6 _  a. k6 L  k! B  ^. K& n: Z5 N, Eif (passphase !== confirmPassphase) return null;0 Q/ ?6 `  G( K" K0 s" [
var account = new wallet.Account(wif || wallet.generatePrivateKey());
5 Z. r3 N$ d: E2 N5 c: M& Lconst encryptedWIF = wallet.encrypt(account.WIF, passphase);( }! Q! g- a  c
const result: WalletAccount = {+ y' }; P+ a: W" F1 U1 g4 [- ?
address: account.address,
4 @% i2 b$ |- f/ M2 @* C  qprivateKey: account.privateKey,
; s6 j4 }9 l6 Q; j6 ~+ ^8 }( ApublicKey: account.publicKey,
  ~8 h7 E' j7 ^& t, W# N! \scriptHash: account.scriptHash,
- n* U% K* o% C4 W  cWIF: account.WIF,( h( v9 Y" P, Q# D3 A6 x/ E( L, H
encryptedWIF,! {/ v5 D( n+ L
passphase,0 `: v- C$ w# Q( |2 g& s4 ~
}
0 i  P" r4 I/ f) S& c% dreturn result;
: {3 e% K* O4 _9 A4 v7 t) l}
8 a% u6 |# l/ S/ n* @创建钱包账号单元测试, l& L0 G5 f& W9 c+ B! K
通过jest对创建钱包的方法进行单元测试
) }- x" v9 ]% [3 Y& A) ttest(‘createWalletAccount ‘, () => {
3 i, G; t6 J5 k$ W3 {  |% e: P* ~const passphase = ‘123456’;1 _; k% ~: E% g3 L  m: c
const account = createWalletAccount(passphase, passphase);- r' v; a+ Q# l! p6 v1 Z- s& }
console.log(account);
% {. B7 f, G) Y9 ]( k: M# }expect(account.address !== null).toBe(true);, y* r0 P9 O  U
});
. B2 `  v; M' T. w$ n( A4 X运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。
1 w$ _' A4 G9 K) M# |2 T5 L{
" R+ {, g2 Y7 f1 paddress: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,
' Z  O+ V( ]3 Q1 ]0 ?( |/ GprivateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,* {1 k1 p. B- R. ^/ w
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
; y( o/ s& ^. Q( a; MscriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,$ y' I7 D- o" ?. D7 N
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
* [; N- y3 S4 L5 m- Y1 |encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,
6 z, z4 l5 B$ ~8 Qpassphase: ‘123456’ . D/ I2 T9 r2 U$ S
}* }4 M  `8 q% U: P$ S" p7 A
转化4 |. z* N3 F7 `: b* c# V/ t0 b
正如前面所述的,钱包里的各个数据存在一定的转化关系,至于详细的相互之间转化的原理,先不至讨论,我们可以使用neon-js的相关API来查看是否正确转化。- l' P! J- x4 T1 u* p: C
NEPWIF  Private => Public => ScriptHash  Address( N1 s8 u8 n* e" {5 J
下面先新建一个jtest的单元测试文件Core.spec.js. l0 h, @2 B' E6 r
私钥到公钥的转化
/ q0 H" \+ G5 f- C这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。
/ i; N7 i4 ~. }+ q4 C$ t: ^4 t单元测试代码如下:4 @: f* c) z% N; ~9 N: {8 y
import {wallet} from ‘@cityofzion/neon-js’;
8 M5 u! {4 h) W! u) Z$ b, Y3 Etest(‘private:10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba get PUb_Key’,()=>{
, ?3 {% ]" L7 C7 C$ c" t7 oconst pubKey = wallet.getPublicKeyFromPrivateKey(’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’);$ v4 i3 y* l) w$ W. V2 V0 V% H
expect(pubKey).toBe(’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′);
$ y* d5 a0 F' g2 d- I# `* u});. ^: X4 \  X- Z3 j3 e! I& X- X0 G! ]
使用命令运行单元测试:, I" z+ b# c: ~7 X1 b
npm run test __test__/neo/Core.spec.js
  L1 p2 {/ c& ]运行结果:
3 k( v# V# Q: E: L" R" k- z: q2 r# g8 t& i+ \& x8 }
所有转化
7 m. e1 v. B. q5 }) J& I完整的转化关系如下:
. ~3 Y; ^4 Z& z5 D3 |import {wallet} from ‘@cityofzion/neon-js’;
( Z6 n* ]& N4 v3 A. ~, Z: ?const walletAccount = { ; e: E/ k8 A4 ^7 U4 N
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,7 t  ]: x. K4 T8 O- m
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,
! h, N8 B$ s4 E: t) W: ZpublicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
; }2 H3 X0 g- p4 zscriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,
8 f  M7 Y, Y  F: V, h! j8 {+ i) IWIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
; P% L; S' m, F' SencryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,% x/ x/ X- \- y, X
passphase: ‘123456’
$ \; ~" B' V1 G2 m% p9 @};
- r& n8 C& R  q// WIF  privateKey
5 u& ~' R1 j3 W5 ]  f2 j+ Stest(‘WIF  privateKey’,()=>{$ g$ ?, {/ I8 Y
const wif = wallet.getWIFFromPrivateKey(walletAccount.privateKey);, s9 S8 S3 o) {* h
expect(wif).toBe(walletAccount.WIF);) V; d+ b- R: C5 |5 s0 x& e
const privateKey = wallet.getPrivateKeyFromWIF(walletAccount.WIF);
0 v2 v7 v3 r4 w+ B2 _expect(privateKey).toBe(walletAccount.privateKey);! n  Z: [+ U6 @! g& U4 @& C
});. E8 T4 I9 q8 c" N1 w. |+ m
// privateKey => publicKey
( r1 u# b) _& ~, M1 O$ ztest(`privateKey => publicKey:${walletAccount.privateKey}`,()=>{
8 t5 s- i/ P$ {. _# D; y! v& M3 H2 Hconst pubKey = wallet.getPublicKeyFromPrivateKey(walletAccount.privateKey);
* e& b8 h+ l0 x0 ?% ~: Y$ texpect(pubKey).toBe(walletAccount.publicKey);- G  X1 D! V" O$ O* c! c- [# I3 c# Q
});* S7 h  h6 q2 n6 j
// publicKey => ScriptHash
. e* C' c; v* b4 i7 Htest(`publicKey => ScriptHash:${walletAccount.publicKey}`,()=>{
6 ]$ Q1 F' m& o5 pconst scriptHash = wallet.getScriptHashFromPublicKey(walletAccount.publicKey);
3 w2 z/ T. ?5 v6 Bexpect(scriptHash).toBe(walletAccount.scriptHash);" ^6 o# \, z3 I0 a. \( K
});
  u0 m7 B1 n/ d// scriptHash  address; L! r. Z. r0 @/ D' G
test(‘scriptHash  address’,()=>{
. i; L+ h- p* L9 K. u! ?const address = wallet.getAddressFromScriptHash(walletAccount.scriptHash);  h4 {' u8 Y5 r7 }4 d
expect(address).toBe(walletAccount.address);
! n1 p2 f; f2 p  ]- Aconst scriptHash = wallet.getScriptHashFromAddress(walletAccount.address);' C* a! [+ d" z! G: o
expect(scriptHash).toBe(walletAccount.scriptHash);
$ z* W* l8 _% D" \0 U9 k});
! ~( v" g) g- l$ V+ k# i6 K总结
' W/ W6 ~, G3 N: n如上,主要说明了neo账号的创建,以及讲述账号各个字段之间的转化关系,本篇使用的api为neon-js,这是coz在github社区开源的neo钱包api,它包含了钱包开发的所有的api,我认为它是学习钱包的很好的材料,当然neo-gui,neo-cli本身也是开源的,完全可以使用它们的源码来学习,只是相较于C#,对于开发跨平台应用,我更喜欢基于electron的方案。
& [9 O( f: v' h为了学习开发neo钱包,我搭建了一个electron的boilerplate,作为快速启动的基础,这样其他同样想用此方案的朋友就不用再一次去搭建环境了。此boilerplate具体集成了以下技术方案:electron,React,dva,flow,antd;后面会抽时间把文中提到的jest也集成进去以便可以开箱即用的写单元测试。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10