一.开发环境安装及其搭建
1.安装node 最好v8的可以使用ES6语法
2.安装ganache
ganache介绍:虽说真实发布必须要使用前文说到的三种方法geth,parity,或其它服务商,但是测试开发环境下,有一款本地基于内存的钱包,不需要等待确认交易,根据操作实时出块,及其方便,它就是ganache-cli,纳尼?你没听过它,好吧它的前身就是大名鼎鼎的testrpc,简直不能太好用呀。
安装命令: npm i ganache-cli -g
执行命令: ganache-cli
初始状态说明:创建10个以太坊账户,公钥私钥上下对应,默认每个账户100ETH,http端口为8545。(如果有其它需求可以阅读官方githug: https://github.com/trufflesui...)
二.基本实例
1.创建一个app.js文件,引用web3,设置http接口提供者(没错就是前面ganche-cli开启的接口)
var Web3 = require(‘web3’);
var web3 = new Web3(new Web3.providers.HttpProvider(“https://localhost:8545”));
说明:好多教程会这么写,不能说不对,但有个坑。
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
// set the provider you want from Web3.providers
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
如果电脑开启geth或者metamask,web3.currentProvider和ethereumProvider就将会返回geth和metamask而不是咱们设置的8545,尤其是metamask浏览器打开自动开启。
2.测试基础语法打印区块高度
老版本命令:
console.log(web3.eth.getBlockNumber());
新版本命令:
web3.eth.getBlockNumber().then(console.log);
说明: web3 v1.0大量使用了ES6的语法,不熟悉ES6前端和node后台有必要尽快补习一下,1.0版方法都使用异步,并且实现了promise语法,then常规使用是放入一个函数第一个参数为成功返回值,第二个参数为失败返回值,将console.log作为函数,传入成功的值将直接完成打印。
4.创建一个账户
命令:web3.eth.personal.newAccount(‘!@superpassword').then(console.log);
5.简单交易
先在封装两个异步函数,方便使用也避免进入回调地狱,要优雅写代码
发起交易函数
async function sendTransaction(send,rece,ethNum){
await web3.eth.sendTransaction({
from: send,
to: rece,
value: ethNum
})
.then(function(receipt){
console.log(receipt);
console.log('send:');
findEth(send).then(function(result){
console.log(result);
});
console.log('rec:')
findEth(rece).then(function(result){
console.log(result);
});
});
}
用公钥查询eth数量函数
async function findEth(publicKey){
var ethNum;
await web3.eth.getBalance(publicKey).then(function(res){
ethNum = web3.utils.fromWei(res, 'ether');
});
return ethNum;
}
主程序函数直接执行
async function tList(){
var accountList;
await web3.eth.getAccounts().then((res)=> {
accountList = res;
});
await sendTransaction(accountList[0], accountList[1], 5000000000000000);
console.log(findEth(accountList[0]));
console.log(findEth(accountList[1]));
}
tList();
扩展:由于ganache-cli的自带账号为已经解锁账户,如果自己创建的账户还需要先解锁,然后才可以用这种方法交易,解锁方法如下:
web3.eth.personal.unlockAccount(myPublicKey,'password',600)
.then(function(res){
})
说明:参数依次是:公钥、密码、解锁时间以秒为单位,600秒内不需要解锁,默认为300秒。可以await解锁,也可以将交易代码写then函数内。
6.签名交易
同理:封装一个异步函数,实际上签名交易分为两个步骤1.签名一个交易2.发送这个签名的交易到区块链。
async function signTran(sendPri,rec,num){
web3.eth.accounts.signTransaction({
to: rec,
value: num,
gas: 2000000
}, sendPri)
.then(function(res){
web3.eth.sendSignedTransaction(res.rawTransaction)
.on('receipt', console.log);
});
}
web3.eth.accounts.signTransaction参数依次为
- json对象
to:(可选)接受方公钥,如果是发布合约可以为空
data:(可选)调用智能合约需要的数据,也可以是空
value:(可选)eth数量以wei为单位
gas:(可选)gas数量最近都是21000,多了浪费少了完不成
gasPrice:gas价格有gas报价与成功率网站,正式链上可以参考给下 - 私钥
- 回调将返回有签名信息的对象
使用web3.eth.sendSignedTransaction将交易对象下的16进制编码过的交易码rawTransaction发送
坑点:复制私钥一定要手动在前边加上0x,ganache是没有给你加的
坑点1:用ws回报错
坑点2: 前文所说的要开启person等api的使用
工具地址:
1.web3官网官方文档
2.ganache-cli github地址
常见错误:Contract has not been deployed to detected network
小狐狸(metamask)干扰,小狐狸设置了全局web3变量,搞之前关闭小狐狸