NEO 区块链钱包账号
博客园
发表于 2022-11-30 20:08:36
99
0
0
neo钱包主要包括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类似一个银行卡号,是别人想给你转账的时候使用的
创建钱包账号
import { wallet } from ‘@cityofzion/neon-js’;
/**+ z+ m5 b& E W+ H/ Q& w, s9 K8 J
* 根据passpase生产一个新的neo账号0 w' t* v! V" l( ^: R
* @param {*} passphase
* @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 {
if (passphase !== confirmPassphase) return null;0 Q/ ?6 ` G( K" K0 s" [
var account = new wallet.Account(wif || wallet.generatePrivateKey());
const encryptedWIF = wallet.encrypt(account.WIF, passphase);( }! Q! g- a c
const result: WalletAccount = {+ y' }; P+ a: W" F1 U1 g4 [- ?
address: account.address,
privateKey: account.privateKey,
publicKey: account.publicKey,
scriptHash: account.scriptHash,
WIF: 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 ~
}
return result;
}
创建钱包账号单元测试, l& L0 G5 f& W9 c+ B! K
通过jest对创建钱包的方法进行单元测试
test(‘createWalletAccount ‘, () => {
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);
expect(account.address !== null).toBe(true);, y* r0 P9 O U
});
运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。
{
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,* {1 k1 p. B- R. ^/ w
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,$ y' I7 D- o" ?. D7 N
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,
passphase: ‘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
私钥到公钥的转化
这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。
单元测试代码如下:4 @: f* c) z% N; ~9 N: {8 y
import {wallet} from ‘@cityofzion/neon-js’;
test(‘private:10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba get PUb_Key’,()=>{
const pubKey = wallet.getPublicKeyFromPrivateKey(’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’);$ v4 i3 y* l) w$ W. V2 V0 V% H
expect(pubKey).toBe(’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′);
});. ^: X4 \ X- Z3 j3 e! I& X- X0 G! ]
使用命令运行单元测试:, I" z+ b# c: ~7 X1 b
npm run test __test__/neo/Core.spec.js
运行结果:
: q2 r# g8 t& i+ \& x8 }
所有转化
完整的转化关系如下:
import {wallet} from ‘@cityofzion/neon-js’;
const walletAccount = { ; e: E/ k8 A4 ^7 U4 N
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,7 t ]: x. K4 T8 O- m
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,% x/ x/ X- \- y, X
passphase: ‘123456’
};
// WIF privateKey
test(‘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);
expect(privateKey).toBe(walletAccount.privateKey);! n Z: [+ U6 @! g& U4 @& C
});. E8 T4 I9 q8 c" N1 w. |+ m
// privateKey => publicKey
test(`privateKey => publicKey:${walletAccount.privateKey}`,()=>{
const pubKey = wallet.getPublicKeyFromPrivateKey(walletAccount.privateKey);
expect(pubKey).toBe(walletAccount.publicKey);- G X1 D! V" O$ O* c! c- [# I3 c# Q
});* S7 h h6 q2 n6 j
// publicKey => ScriptHash
test(`publicKey => ScriptHash:${walletAccount.publicKey}`,()=>{
const scriptHash = wallet.getScriptHashFromPublicKey(walletAccount.publicKey);
expect(scriptHash).toBe(walletAccount.scriptHash);" ^6 o# \, z3 I0 a. \( K
});
// scriptHash address; L! r. Z. r0 @/ D' G
test(‘scriptHash address’,()=>{
const address = wallet.getAddressFromScriptHash(walletAccount.scriptHash); h4 {' u8 Y5 r7 }4 d
expect(address).toBe(walletAccount.address);
const scriptHash = wallet.getScriptHashFromAddress(walletAccount.address);' C* a! [+ d" z! G: o
expect(scriptHash).toBe(walletAccount.scriptHash);
});
总结
如上,主要说明了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也集成进去以便可以开箱即用的写单元测试。
成为第一个吐槽的人