最近忙于区块链的项目,没及时更新文章,请各位看官见谅,废话不多说,接着上篇继续,之前讲了股票交易和数字货币交易的对比,可以看出股票交易的过程中我们的资金是存在资金账户中或银行卡中的,而数字货币存在哪呢?钱包,也就是说在虚拟货币交易的各个环节我们都可以把代币存到我们的钱包中,但是如何才能实现一个钱包呢?带着这个问题,我们开始实现一个以太坊钱包。
以下是基于ethers.js,其强大之处可以从官方了解。
创建钱包
首先需在项目中引入ehters.js,其代码如下:
import ethers from 'ethers';
ethersjs 提供了5中创建钱包的方式
1、创建随机地址的钱包
let wallet = ethers.Wallet.createRandom();
console.log("Address: " + wallet.address);
2、通过私钥创建钱包
let privateKey = "0xea27ede8a6591e7bec9a4429d00c84de296b3058b79c55aa0eaa87872168b135";
let wallet = new ethers.Wallet(privateKey);
console.log("Address: " + wallet.address);
3、通过助记词创建钱包
let mnemonic = "develop danger find paper nuclear brave regular answer quote notice funny citizen";
let wallet = ethers.Wallet.fromMnemonic(mnemonic);
console.log("Address: " + wallet.address);
4、通过keystore创建钱包
// keystore 是一个 json
let json = JSON.stringify(keystore);
let password = "123456";
ethers.Wallet.fromEncryptedWallet(json, password).then(function(wallet) {
console.log("Address: " + wallet.address);
});
5、创建脑记忆钱包
let username = "test@163.com";
let password = "123456";
ethers.Wallet.fromBrainWallet(username, password).then(function(wallet) {
console.log("Address: " + wallet.address);
});
钱包的创建是离线的,不需要依赖网络即可创建钱包地址,但如果想获取钱包的相关信息,比如金额、交易记录,又或者想转账的话,就需要让钱包连上以太坊的网络了。
provider类型
在 Provider 创建方法中都有一个参数network,它是一个字符串,代表网络名称,有如下值:
- homestead/mainnet:以太坊主网络
- morden: morden 测试网络(现在已经退役了)
- ropsten/testnet: ropsten 测试网络
- rinkeby:rinkeby 测试网络
- kovan:kovan 测试网络
通过以下两种方式可以和所创建的钱包进行集成(默认主网):
1、创建钱包时使用provider参数
let provider = providers.getDefaultProvider();
let wallet = new ethers.Wallet(privateKey, provider);
2、钱包创建成功后指定网络
let provider = providers.getDefaultProvider();
let wallet = new ethers.Wallet(privateKey);
wallet.provider = provider;
常用方法
1、查询钱包余额
let privateKey = "0xea27ede8a6591e7bec9a4429d00c84de296b3058b79c55aa0eaa87872168b135";
let wallet = new ethers.Wallet(privateKey);
wallet.provider = ethers.providers.getDefaultProvider();
var balancePromise = wallet.getBalance();
balancePromise.then(function(balance) {
console.log(balance);
});
2、查询ETH价格
var provider = new ethers.providers.EtherscanProvider();
provider1.getEtherPrice().then(price => {
console.log(price);
});
3、转账
let privateKey = "0xea27ede8a6591e7bec9a4429d00c84de296b3058b79c55aa0eaa87872168b135";
let wallet = new ethers.Wallet(privateKey);
wallet.provider = ethers.providers.getDefaultProvider();
let amount = ethers.utils.parseEther('1.0');
let address = '0x88a5c2d9919e46f883eb62f7b8dd9d0cc45bc290';
let sendPromise = wallet.send(address, amount);
sendPromise.then(function(transactionHash) {
console.log(transactionHash);
});
至此一个具备转账功能的钱包就实现了,是不是很简单 :)。