Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEO 区块链钱包账号

博客园
97 0 0
钱包账号, x; s! j- u, ]8 m& y
neo钱包主要包括address,privateKey,publicKey,scriptHash,WIF这几个部分;它们之间存在一定的转化关系:
1 ~; o& L% @5 ?. L7 jNEPWIF  Private => Public => ScriptHash  Address
- L& E" f2 \7 I7 ]3 Q不开玩笑,除了 address 可以告诉别人以外,其它的对谁都不要说,address类似一个银行卡号,是别人想给你转账的时候使用的  I" w, [* Z" u. S
创建钱包账号
& ^  W+ L. l7 Q' zimport { wallet } from ‘@cityofzion/neon-js’;% k4 m& A; C5 L. q, X
/**9 Q1 J5 a4 Z8 ]5 l
* 根据passpase生产一个新的neo账号1 `# [$ h) u& s. C: D1 ]9 ^& l+ ?
* @param {*} passphase
" V  Y; Q1 w) p7 O; i0 i" G# b* @param {*} confirmPassphase
2 H( |* V& v% v. |! K; f* @param {*} wif ' ?5 Q. _0 Q, N, p+ W# Y
*/) j4 M3 V! d3 V2 T) K* ?
export function createWalletAccount(passphase: string, confirmPassphase: string, wif?: string): ?WalletAccount {- P+ C8 q$ y$ A8 h5 o/ g
if (passphase !== confirmPassphase) return null;- F# h: y" h* H
var account = new wallet.Account(wif || wallet.generatePrivateKey());' y* y3 O8 D" ?4 \  k& d
const encryptedWIF = wallet.encrypt(account.WIF, passphase);
  C! `" q; J  X+ zconst result: WalletAccount = {7 M! x1 \. b+ c/ ^: u
address: account.address,
: `' @! J+ W, A% j$ wprivateKey: account.privateKey,. a# X) W( I% q6 g" b/ Z: p* {
publicKey: account.publicKey,7 k) I  ?9 u+ x5 _* [  o, G( t
scriptHash: account.scriptHash,
6 K7 M* \. E; v( L% vWIF: account.WIF,
  d* h; @$ [6 B9 B8 oencryptedWIF,, {- k8 T& t6 c* |# ^
passphase,
: W  }$ Y/ ?# g  C0 C, K- Z' L' B}
1 n% q# ~3 X# I/ Y2 Preturn result;9 g7 B& V% B# i. A8 G
}
) D- W6 a. j0 W创建钱包账号单元测试$ I; p' n9 M' X9 ~( k& z
通过jest对创建钱包的方法进行单元测试
( y* P* W/ N8 |test(‘createWalletAccount ‘, () => {8 H: y1 H7 _: L
const passphase = ‘123456’;
4 J/ ^4 ^3 r8 D3 b3 d7 W- Zconst account = createWalletAccount(passphase, passphase);4 J8 H, B" a% k/ J* c( C( W
console.log(account);: o% k3 b: i% |) C( n1 I' c6 q3 l
expect(account.address !== null).toBe(true);( {, m; W4 f* C6 \0 l+ S2 k+ d3 W
});
& [- R6 j' J: \3 V* \; i$ V. Z运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。
4 ]( F1 b% w8 c6 D) `. \$ O: ?{
. [/ [! m( o& T: W' B4 d9 kaddress: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,
- I! s5 b; U6 g2 a, z) tprivateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,
# y3 _/ H: D5 a- [publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,/ A5 |: }$ s4 @- m7 |
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,3 w! |& O7 U9 D; ~, e7 m
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
$ i( B" J8 _$ _( G, E6 U1 GencryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,8 C- T. q+ x9 K- s. [
passphase: ‘123456’
  T9 b5 S& V$ x0 I* d0 t$ s9 k}
3 f) m: A1 n9 C$ }! D转化
! _. D% a4 U% W5 A' J4 y; w正如前面所述的,钱包里的各个数据存在一定的转化关系,至于详细的相互之间转化的原理,先不至讨论,我们可以使用neon-js的相关API来查看是否正确转化。9 p: K% u% Q1 V& |* x0 N4 m
NEPWIF  Private => Public => ScriptHash  Address/ c7 E9 |) P# e4 Z
下面先新建一个jtest的单元测试文件Core.spec.js9 a0 v7 R6 V, g+ ?$ o% D
私钥到公钥的转化
4 T0 l: f! F4 Q; C! @: ]6 Z4 G( q这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。2 Q7 l* x  _4 B1 J! p
单元测试代码如下:
  l% ~- P+ ^$ n9 wimport {wallet} from ‘@cityofzion/neon-js’;6 E; M2 y4 S. U
test(‘private:10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba get PUb_Key’,()=>{
/ |- R  R- U  I" o' D3 Y) jconst pubKey = wallet.getPublicKeyFromPrivateKey(’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’);* {7 `! B) P* \+ o; ]
expect(pubKey).toBe(’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′);
5 V4 O* ^1 D8 q5 q4 e+ E});
/ C$ K+ m2 M' O" y# z使用命令运行单元测试:
) q0 h- y7 Z# V1 f9 |4 J) xnpm run test __test__/neo/Core.spec.js! Q( }0 z/ o! L& a, b4 L% q
运行结果:9 P0 D+ g4 k# U6 M% O+ W1 m$ I' I2 K
+ p/ O" ?# A% H  @- H, p: }
所有转化
- V/ q7 X! \8 c' C  ]9 A5 m( F完整的转化关系如下:
" Q1 _7 c% H: {+ M/ J6 s6 m" |import {wallet} from ‘@cityofzion/neon-js’;! U1 X, w' }' g& p$ @
const walletAccount = {
3 n& @0 T5 h: w( C* k" v1 [0 ^address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,# G0 z  l5 y1 @$ ^0 Y: G
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,2 V5 g- I0 `3 W$ |, a" r
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,3 {% c" i% N! L/ _: n
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,
! f9 ?( T$ v' w4 V$ ]5 {WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,$ ~, o9 @& ?" ^: T" l
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,, z! W4 R3 B; U5 _- H3 }/ \: i
passphase: ‘123456’ , f$ U* Z+ Q8 L3 s0 C
};  z  h+ t8 b$ g/ z( U/ |
// WIF  privateKey, Y  x* h3 P, O  Q2 T
test(‘WIF  privateKey’,()=>{
$ D; Z. m$ @. @5 m9 p# c7 Rconst wif = wallet.getWIFFromPrivateKey(walletAccount.privateKey);
, N* y4 f0 B) n2 b8 o$ \expect(wif).toBe(walletAccount.WIF);% `6 [/ y2 C0 b
const privateKey = wallet.getPrivateKeyFromWIF(walletAccount.WIF);& C8 t  h- m0 }  v* @
expect(privateKey).toBe(walletAccount.privateKey);! s" V, ?9 G/ z6 ]7 v4 d3 j' c3 @6 f
});, @. s" O- }* d) b3 l
// privateKey => publicKey& _7 ?5 k9 j$ l, I' w5 x, B
test(`privateKey => publicKey:${walletAccount.privateKey}`,()=>{
- G) v/ H/ {4 ~$ g& cconst pubKey = wallet.getPublicKeyFromPrivateKey(walletAccount.privateKey);* b- G6 ~' K% h1 [/ x8 y
expect(pubKey).toBe(walletAccount.publicKey);& C4 N, y1 @+ U! f# u3 ~- \
});
6 J. O/ E; |  h9 a; D6 O// publicKey => ScriptHash! r. \& y  ]- m0 H4 O6 D) _
test(`publicKey => ScriptHash:${walletAccount.publicKey}`,()=>{
  O. A$ T3 R/ G( R1 ^- F% Fconst scriptHash = wallet.getScriptHashFromPublicKey(walletAccount.publicKey);7 U" N+ N4 M3 @. ^% V: R& v
expect(scriptHash).toBe(walletAccount.scriptHash);3 y% k2 `! M2 Y3 r, E
});
2 O7 k- C- w9 _% q: [3 d3 V, j6 [% \// scriptHash  address( Y* b8 W' _! v+ q1 A6 [
test(‘scriptHash  address’,()=>{8 k, R9 {3 z$ s8 y+ O) [
const address = wallet.getAddressFromScriptHash(walletAccount.scriptHash);% |0 ~3 W4 ?- J) o
expect(address).toBe(walletAccount.address);3 n- Z  S" F2 `6 e
const scriptHash = wallet.getScriptHashFromAddress(walletAccount.address);
! R: x, c7 o9 y; j' zexpect(scriptHash).toBe(walletAccount.scriptHash);
  t- C; F1 L. ~3 y. N: Q# \9 |7 b});
4 @& |- f4 P5 h3 J总结
" K9 }: {6 k' L1 ]( T* m* ~3 t如上,主要说明了neo账号的创建,以及讲述账号各个字段之间的转化关系,本篇使用的api为neon-js,这是coz在github社区开源的neo钱包api,它包含了钱包开发的所有的api,我认为它是学习钱包的很好的材料,当然neo-gui,neo-cli本身也是开源的,完全可以使用它们的源码来学习,只是相较于C#,对于开发跨平台应用,我更喜欢基于electron的方案。
. ]9 Z; R* e$ m为了学习开发neo钱包,我搭建了一个electron的boilerplate,作为快速启动的基础,这样其他同样想用此方案的朋友就不用再一次去搭建环境了。此boilerplate具体集成了以下技术方案:electron,React,dva,flow,antd;后面会抽时间把文中提到的jest也集成进去以便可以开箱即用的写单元测试。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

博客园 初中生
  • 粉丝

    2

  • 关注

    4

  • 主题

    10