NEO 区块链钱包账号
博客园
发表于 2022-11-30 20:08:36
96
0
0
neo钱包主要包括address,privateKey,publicKey,scriptHash,WIF这几个部分;它们之间存在一定的转化关系:
NEPWIF Private => Public => ScriptHash Address
不开玩笑,除了 address 可以告诉别人以外,其它的对谁都不要说,address类似一个银行卡号,是别人想给你转账的时候使用的
创建钱包账号
import { wallet } from ‘@cityofzion/neon-js’;
/**
* 根据passpase生产一个新的neo账号5 j0 m! B' @* C- [! X! r
* @param {*} passphase
* @param {*} confirmPassphase
* @param {*} wif 5 j; `0 W; d- V
*/8 `/ b0 {. X I
export function createWalletAccount(passphase: string, confirmPassphase: string, wif?: string): ?WalletAccount {" S' V1 W/ E6 z% ?* O
if (passphase !== confirmPassphase) return null;
var account = new wallet.Account(wif || wallet.generatePrivateKey());, ~0 v$ K3 H0 Z/ }- M4 m/ E5 M* |
const encryptedWIF = wallet.encrypt(account.WIF, passphase);# D. g% e' S4 X
const result: WalletAccount = {' a6 L9 Y) Q; I a
address: account.address,
privateKey: account.privateKey, x0 G6 q6 z6 u, k% b% s4 `! A
publicKey: account.publicKey,
scriptHash: account.scriptHash,3 a& ^8 p% }. y$ k" |3 l
WIF: account.WIF,
encryptedWIF,
passphase,
}
return result;# y, D3 v8 T6 w
}- M( h8 T' I' L, J( k6 H3 J- E
创建钱包账号单元测试$ U! f5 ?: j" Y/ ^7 o) e
通过jest对创建钱包的方法进行单元测试$ L: _; R2 l/ L2 ]2 Z+ D
test(‘createWalletAccount ‘, () => {: c8 Q! I, ~8 N( y, t
const passphase = ‘123456’;
const account = createWalletAccount(passphase, passphase);; |/ r* B/ o0 s$ ?" M
console.log(account);2 p" L1 E" M! j. J. w3 ^4 I
expect(account.address !== null).toBe(true);7 k2 _; u8 i* Z% ?% B5 p {
});
运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。! F5 O8 D. h3 O2 N9 y
{
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’," G( `0 ^2 j3 o! u* ^
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,0 I$ k% B: ^$ q% O7 h( s4 O8 @& h/ i
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,8 z1 b- x! n' [; N" M- |8 J
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,- Q5 s! }( k% J/ E! K
passphase: ‘123456’ ! D; h/ S5 s. L: n" a7 Q8 \5 u% q
}
转化& B; ~8 L4 o9 W8 W/ p
正如前面所述的,钱包里的各个数据存在一定的转化关系,至于详细的相互之间转化的原理,先不至讨论,我们可以使用neon-js的相关API来查看是否正确转化。
NEPWIF Private => Public => ScriptHash Address2 Z. j( o8 b4 a. q
下面先新建一个jtest的单元测试文件Core.spec.js
私钥到公钥的转化
这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。
单元测试代码如下:9 v% G8 w+ v" b( I m" W
import {wallet} from ‘@cityofzion/neon-js’;$ b! q" u" f* q# z2 j
test(‘private:10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba get PUb_Key’,()=>{/ p/ A( ]& f% ? C$ j( v( J& I3 y
const pubKey = wallet.getPublicKeyFromPrivateKey(’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’);
expect(pubKey).toBe(’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′);
});- a/ x* P/ {; z
使用命令运行单元测试:5 L% _5 L$ H$ o' C) N
npm run test __test__/neo/Core.spec.js
运行结果:
4 z9 y5 ?- H7 @4 R+ O
所有转化
完整的转化关系如下:
import {wallet} from ‘@cityofzion/neon-js’;
const walletAccount = {
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,/ D# \9 f' c+ O @( u8 n/ ~8 a! }7 N
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,
passphase: ‘123456’ ( Z: W+ L1 |9 ]1 H
};3 m3 H( i! p; `8 Z% R# b
// WIF privateKey
test(‘WIF privateKey’,()=>{9 Q C/ L/ Y7 h$ F1 b' I
const wif = wallet.getWIFFromPrivateKey(walletAccount.privateKey);
expect(wif).toBe(walletAccount.WIF);
const privateKey = wallet.getPrivateKeyFromWIF(walletAccount.WIF);0 ~/ x+ }5 v2 v2 m& Q1 g$ T
expect(privateKey).toBe(walletAccount.privateKey);
});6 c* M: q3 h! F, s+ a' E: k. z
// privateKey => publicKey/ z) e; g9 \+ ?; M* N6 Z
test(`privateKey => publicKey:${walletAccount.privateKey}`,()=>{; ~, T/ v7 l1 u9 u& F3 D2 Y/ T
const pubKey = wallet.getPublicKeyFromPrivateKey(walletAccount.privateKey);
expect(pubKey).toBe(walletAccount.publicKey);* b" w9 J# X' a
});
// publicKey => ScriptHash
test(`publicKey => ScriptHash:${walletAccount.publicKey}`,()=>{
const scriptHash = wallet.getScriptHashFromPublicKey(walletAccount.publicKey);
expect(scriptHash).toBe(walletAccount.scriptHash);
});
// scriptHash address
test(‘scriptHash address’,()=>{
const address = wallet.getAddressFromScriptHash(walletAccount.scriptHash);; v3 c+ l5 F' o Q+ f/ k
expect(address).toBe(walletAccount.address);
const scriptHash = wallet.getScriptHashFromAddress(walletAccount.address);$ ^1 C& }5 D* n6 f% n2 c: E2 m
expect(scriptHash).toBe(walletAccount.scriptHash);
});
总结3 V, t" D) m( R
如上,主要说明了neo账号的创建,以及讲述账号各个字段之间的转化关系,本篇使用的api为neon-js,这是coz在github社区开源的neo钱包api,它包含了钱包开发的所有的api,我认为它是学习钱包的很好的材料,当然neo-gui,neo-cli本身也是开源的,完全可以使用它们的源码来学习,只是相较于C#,对于开发跨平台应用,我更喜欢基于electron的方案。
为了学习开发neo钱包,我搭建了一个electron的boilerplate,作为快速启动的基础,这样其他同样想用此方案的朋友就不用再一次去搭建环境了。此boilerplate具体集成了以下技术方案:electron,React,dva,flow,antd;后面会抽时间把文中提到的jest也集成进去以便可以开箱即用的写单元测试。
成为第一个吐槽的人