NEO 区块链钱包账号
博客园
发表于 2022-11-30 20:08:36
97
0
0
neo钱包主要包括address,privateKey,publicKey,scriptHash,WIF这几个部分;它们之间存在一定的转化关系:
NEPWIF Private => Public => ScriptHash Address
不开玩笑,除了 address 可以告诉别人以外,其它的对谁都不要说,address类似一个银行卡号,是别人想给你转账的时候使用的 I" w, [* Z" u. S
创建钱包账号
import { 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
* @param {*} confirmPassphase
* @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);
const result: WalletAccount = {7 M! x1 \. b+ c/ ^: u
address: account.address,
privateKey: 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,
WIF: account.WIF,
encryptedWIF,, {- k8 T& t6 c* |# ^
passphase,
}
return result;9 g7 B& V% B# i. A8 G
}
创建钱包账号单元测试$ I; p' n9 M' X9 ~( k& z
通过jest对创建钱包的方法进行单元测试
test(‘createWalletAccount ‘, () => {8 H: y1 H7 _: L
const passphase = ‘123456’;
const 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
});
运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。
{
address: ‘AUMgtJsw3kBrcA7poBYNaonZTGMNoqZNLy’,
privateKey: ’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’,
publicKey: ’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′,/ A5 |: }$ s4 @- m7 |
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,3 w! |& O7 U9 D; ~, e7 m
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,8 C- T. q+ x9 K- s. [
passphase: ‘123456’
}
转化
正如前面所述的,钱包里的各个数据存在一定的转化关系,至于详细的相互之间转化的原理,先不至讨论,我们可以使用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
私钥到公钥的转化
这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。2 Q7 l* x _4 B1 J! p
单元测试代码如下:
import {wallet} from ‘@cityofzion/neon-js’;6 E; M2 y4 S. U
test(‘private:10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba get PUb_Key’,()=>{
const pubKey = wallet.getPublicKeyFromPrivateKey(’10bb026b4015c481f0b5142aa5de36de40a99fc8c26e956011a3f820f7708fba’);* {7 `! B) P* \+ o; ]
expect(pubKey).toBe(’03af2ad8725c4926632d6816f5502d8f749dec369afadfe0bb5ac697fe22a0ef77′);
});
使用命令运行单元测试:
npm 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: }
所有转化
完整的转化关系如下:
import {wallet} from ‘@cityofzion/neon-js’;! U1 X, w' }' g& p$ @
const walletAccount = {
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’,
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’,()=>{
const wif = wallet.getWIFFromPrivateKey(walletAccount.privateKey);
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}`,()=>{
const pubKey = wallet.getPublicKeyFromPrivateKey(walletAccount.privateKey);* b- G6 ~' K% h1 [/ x8 y
expect(pubKey).toBe(walletAccount.publicKey);& C4 N, y1 @+ U! f# u3 ~- \
});
// publicKey => ScriptHash! r. \& y ]- m0 H4 O6 D) _
test(`publicKey => ScriptHash:${walletAccount.publicKey}`,()=>{
const 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
});
// 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);
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也集成进去以便可以开箱即用的写单元测试。
成为第一个吐槽的人