NEO 区块链钱包账号
博客园
发表于 2022-11-30 20:08:36
140
0
0
neo钱包主要包括address,privateKey,publicKey,scriptHash,WIF这几个部分;它们之间存在一定的转化关系:
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’;
/**8 I2 h8 q' |: U5 K
* 根据passpase生产一个新的neo账号, m/ e2 {0 B7 b# c% g
* @param {*} passphase
* @param {*} confirmPassphase # N* R( c8 L2 o/ i8 Y$ c. a1 n
* @param {*} wif h. S/ z5 n+ b/ E4 Q& ?" P
*/
export function createWalletAccount(passphase: string, confirmPassphase: string, wif?: string): ?WalletAccount {
if (passphase !== confirmPassphase) return null;
var account = new wallet.Account(wif || wallet.generatePrivateKey());4 j# _1 |& _6 A' k0 w3 a2 ]
const encryptedWIF = wallet.encrypt(account.WIF, passphase);
const result: WalletAccount = {8 D9 B. B- j# e* G3 S$ s: Q4 ?
address: account.address,
privateKey: account.privateKey,
publicKey: account.publicKey,
scriptHash: account.scriptHash,
WIF: account.WIF,
encryptedWIF,
passphase,! l% H0 n" R* j% U" O
}& b q4 E; Q- E& w
return result;
}
创建钱包账号单元测试
通过jest对创建钱包的方法进行单元测试
test(‘createWalletAccount ‘, () => {! b7 @9 z" s: J3 C4 M# d. i
const passphase = ‘123456’;
const account = createWalletAccount(passphase, passphase);
console.log(account);
expect(account.address !== null).toBe(true);
});
运行结果如下所示,就是当前生成的账号信息,可以使用neo-wallet登录一下试试。
{ 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′,
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,: t" r6 y" r! _% U7 j8 Z" |
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,
passphase: ‘123456’ : V/ }- p1 b$ g7 L7 l% V5 O
}
转化
正如前面所述的,钱包里的各个数据存在一定的转化关系,至于详细的相互之间转化的原理,先不至讨论,我们可以使用neon-js的相关API来查看是否正确转化。
NEPWIF Private => Public => ScriptHash Address
下面先新建一个jtest的单元测试文件Core.spec.js6 T3 v9 V/ ]" o* _( A! n
私钥到公钥的转化4 Q6 d) B; a. O5 \
这里使用上面生成的测试账号进行测试,注意因为是测试账号以后我不会再使用,所以暴露出来,如果是你的个人账号,请一定不要暴露WIF以及privateKey。
单元测试代码如下:
import {wallet} from ‘@cityofzion/neon-js’;
test(‘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′);
});
使用命令运行单元测试:
npm run test __test__/neo/Core.spec.js
运行结果:, Y5 I0 b- A5 U3 _: n5 A
所有转化' D1 _# [9 t3 q) x9 ]' ?+ T
完整的转化关系如下:
import {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′,
scriptHash: ‘a8f677c132f2c82d73ff138e817e784c25ab068a’,/ E) u* j# G9 P. ~$ K9 |9 P
WIF: ‘KwnETPM2m8wTAY3qySvDVLf3Vpfg77nvJhxR2Qyi8uMWKoqP1Q3f’,- T Y4 W2 t( Q3 P! @
encryptedWIF: ‘6PYVHykkA1TfyQ2344wftv5e7vRoecV4iVwEVZ62aqCAx3dh3LDrRV19AS’,
passphase: ‘123456’
};
// 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);
expect(wif).toBe(walletAccount.WIF);9 P+ `( C' ^# G( K) r( N
const privateKey = wallet.getPrivateKeyFromWIF(walletAccount.WIF);
expect(privateKey).toBe(walletAccount.privateKey);/ v8 M: z- H" t
});
// privateKey => publicKey& s( ]; D9 t" K2 u
test(`privateKey => publicKey:${walletAccount.privateKey}`,()=>{
const 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}`,()=>{
const scriptHash = wallet.getScriptHashFromPublicKey(walletAccount.publicKey);% T% ^1 t& h4 ?! B
expect(scriptHash).toBe(walletAccount.scriptHash);1 j9 |2 ^' @# a0 E2 H
});
// 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也集成进去以便可以开箱即用的写单元测试。
成为第一个吐槽的人