Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEO 区块链钱包账号

博客园
140 0 0
钱包账号
+ i" w, A" Q6 d* @) aneo钱包主要包括address,privateKey,publicKey,scriptHash,WIF这几个部分;它们之间存在一定的转化关系:
  o9 S6 L4 b9 \: `NEPWIF  Private => Public => ScriptHash  Address8 [- S- T# D. V, B! a/ i
不开玩笑,除了 address 可以告诉别人以外,其它的对谁都不要说,address类似一个银行卡号,是别人想给你转账的时候使用的2 ~8 f$ o! ?2 s- M, Q& u3 t
创建钱包账号# @% J) b; F6 E3 O$ a
import { wallet } from ‘@cityofzion/neon-js’;
; l5 \, d6 ], p" O. T) Q' T/ ?+ r/**8 I2 h8 q' |: U5 K
* 根据passpase生产一个新的neo账号, m/ e2 {0 B7 b# c% g
* @param {*} passphase
5 i8 r# O! ?' t: I* @param {*} confirmPassphase # N* R( c8 L2 o/ i8 Y$ c. a1 n
* @param {*} wif   h. S/ z5 n+ b/ E4 Q& ?" P
*/
- B; V. o4 Y- |9 v* @export function createWalletAccount(passphase: string, confirmPassphase: string, wif?: string): ?WalletAccount {
, y7 t1 G% j' e( S3 c% Eif (passphase !== confirmPassphase) return null;
" d: e+ T9 h; t: u4 v" [$ zvar account = new wallet.Account(wif || wallet.generatePrivateKey());4 j# _1 |& _6 A' k0 w3 a2 ]
const encryptedWIF = wallet.encrypt(account.WIF, passphase);
& i5 G8 \. X- ~& pconst result: WalletAccount = {8 D9 B. B- j# e* G3 S$ s: Q4 ?
address: account.address,
# Y. W0 W' ~% {2 _, aprivateKey: account.privateKey,
7 b& ~2 k% l, N+ VpublicKey: account.publicKey,
+ f3 G& X. [6 s0 F: m* H$ ]scriptHash: account.scriptHash,
+ h: n. u! v* l  O- _WIF: account.WIF,
8 J6 k  p( P4 gencryptedWIF,
6 w3 O8 k8 g* o9 Y  g: q$ d7 mpassphase,! l% H0 n" R* j% U" O
}& b  q4 E; Q- E& w
return result;
2 H# w0 P/ P, I, k- `* A' K}
; x% N* Y3 q' k4 {创建钱包账号单元测试
8 K# u4 p+ o5 p4 M8 E7 @9 _通过jest对创建钱包的方法进行单元测试
) f; n+ f; ]2 g6 A2 Z, Ttest(‘createWalletAccount ‘, () => {! b7 @9 z" s: J3 C4 M# d. i
const passphase = ‘123456’;
5 }' K- c6 ~6 `. X' H% Q; mconst account = createWalletAccount(passphase, passphase);
+ J& u+ E6 s, U, X- T: econsole.log(account);
" Y2 I* C( S' j* ~7 ?. l- o5 q) yexpect(account.address !== null).toBe(true);
# \! l4 J6 w. `: J6 ?& E});
$ X% m0 \6 B2 u0 C4 S, z运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。
" }0 L. u  I% H, ?, a. D{ 7 N9 O" ]! b" G% O
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’," O/ c; e! t& S$ T/ h  q& c
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,1 `, |, q0 S+ u8 J; B: Z
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
3 {6 |( v- [6 b+ [; oscriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,: t" r6 y" r! _% U7 j8 Z" |
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
; ^4 N3 x+ N- o% H# t3 u9 u3 ]encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,
7 u1 P' R# ?) bpassphase: ‘123456’ : V/ }- p1 b$ g7 L7 l% V5 O
}
9 ]% u+ ?" \! E2 ?! G5 P转化
4 s; q" z) Y0 f正如前面所述的,钱包里的各个数据存在一定的转化关系,至于详细的相互之间转化的原理,先不至讨论,我们可以使用neon-js的相关API来查看是否正确转化。
* N0 Q: G& M/ \4 s4 b; r% k# ENEPWIF  Private => Public => ScriptHash  Address
* n* d: A( x6 W& e! H. l下面先新建一个jtest的单元测试文件Core.spec.js6 T3 v9 V/ ]" o* _( A! n
私钥到公钥的转化4 Q6 d) B; a. O5 \
这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。
1 T/ g+ `6 d% P& N单元测试代码如下:
" _) R3 a7 `$ T% F* p) Kimport {wallet} from ‘@cityofzion/neon-js’;
, C6 g$ M2 x, a( B! W3 |# Gtest(‘private:10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba get PUb_Key’,()=>{8 u+ q8 T* h1 J5 \, ?; [, x* E5 C
const pubKey = wallet.getPublicKeyFromPrivateKey(’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’);, h2 E5 z$ x$ v( h) n- e9 A
expect(pubKey).toBe(’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′);
: ?+ D- e  ^9 O, u! ?' S});
+ N! p5 i. h# Y9 ~/ i使用命令运行单元测试:
& a% X/ a5 C+ M' L7 inpm run test __test__/neo/Core.spec.js
6 X; @3 J6 ~* m6 c- n2 q" ~运行结果:, Y5 I0 b- A5 U3 _: n5 A

. }. `8 K' X4 J6 X( A; R所有转化' D1 _# [9 t3 q) x9 ]' ?+ T
完整的转化关系如下:
( h* B" b2 R& d5 v; z( Pimport {wallet} from ‘@cityofzion/neon-js’;$ v- e$ m' [& B9 t
const walletAccount = { 0 K" k& a% s% Y: q8 W, [
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’," o  i3 y% \/ t4 l# o) u
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,5 q. f4 S+ P9 t$ S3 S
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
% U8 O1 |0 X7 l' TscriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,/ E) u* j# G9 P. ~$ K9 |9 P
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,- T  Y4 W2 t( Q3 P! @
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,
8 K* T; {" I5 q3 X, S1 A- Gpassphase: ‘123456’
0 v4 H0 V1 e0 p0 r};
- e# H' i" L, B" b6 `+ A// WIF  privateKey: |) N3 ?! m" T& D9 h* S5 v$ L
test(‘WIF  privateKey’,()=>{) `$ p5 t% [/ v2 [$ C" p% O3 p5 W
const wif = wallet.getWIFFromPrivateKey(walletAccount.privateKey);
/ \  i. O. l$ \8 b& Vexpect(wif).toBe(walletAccount.WIF);9 P+ `( C' ^# G( K) r( N
const privateKey = wallet.getPrivateKeyFromWIF(walletAccount.WIF);
, e9 ^3 o# t+ Y2 Z! n( Eexpect(privateKey).toBe(walletAccount.privateKey);/ v8 M: z- H" t
});
1 e4 o' f6 Q6 U- T// privateKey => publicKey& s( ]; D9 t" K2 u
test(`privateKey => publicKey:${walletAccount.privateKey}`,()=>{
4 B) E' ~. I! \1 ]1 Aconst pubKey = wallet.getPublicKeyFromPrivateKey(walletAccount.privateKey);0 G/ i( s5 _' Y4 M6 g
expect(pubKey).toBe(walletAccount.publicKey);) \% s" D$ ]. d3 z5 h* _
});& t0 [; p7 m/ j- h' A
// publicKey => ScriptHash0 l+ f/ K3 k7 a, J- Z& h
test(`publicKey => ScriptHash:${walletAccount.publicKey}`,()=>{
  i$ b2 o# |# {6 lconst scriptHash = wallet.getScriptHashFromPublicKey(walletAccount.publicKey);% T% ^1 t& h4 ?! B
expect(scriptHash).toBe(walletAccount.scriptHash);1 j9 |2 ^' @# a0 E2 H
});
; E5 Q* T* |2 X1 h* t' Y// scriptHash  address5 r) [6 p- G) t: P3 ~: G
test(‘scriptHash  address’,()=>{* ~% c( ]) O: L3 K7 Q, o, F$ ]( [& \* y
const address = wallet.getAddressFromScriptHash(walletAccount.scriptHash);7 f: ^% @. ?2 h9 ^" g. D9 D
expect(address).toBe(walletAccount.address);4 J, z8 l8 n4 g% L, N$ s
const scriptHash = wallet.getScriptHashFromAddress(walletAccount.address);* T( w$ I, W; \0 J" U
expect(scriptHash).toBe(walletAccount.scriptHash);5 R9 M0 c5 U: }9 S" _& f
});* J# @" f' ?5 H; T2 [
总结" R6 ]2 N4 w+ I: \& r, ^. b
如上,主要说明了neo账号的创建,以及讲述账号各个字段之间的转化关系,本篇使用的api为neon-js,这是coz在github社区开源的neo钱包api,它包含了钱包开发的所有的api,我认为它是学习钱包的很好的材料,当然neo-gui,neo-cli本身也是开源的,完全可以使用它们的源码来学习,只是相较于C#,对于开发跨平台应用,我更喜欢基于electron的方案。8 j7 x; }% j+ k8 v( N- y
为了学习开发neo钱包,我搭建了一个electron的boilerplate,作为快速启动的基础,这样其他同样想用此方案的朋友就不用再一次去搭建环境了。此boilerplate具体集成了以下技术方案:electron,React,dva,flow,antd;后面会抽时间把文中提到的jest也集成进去以便可以开箱即用的写单元测试。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10