淘先锋技术网

首页 1 2 3 4 5 6 7

一.开发环境安装及其搭建

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参数依次为
  1. json对象
    to:(可选)接受方公钥,如果是发布合约可以为空
    data:(可选)调用智能合约需要的数据,也可以是空
    value:(可选)eth数量以wei为单位
    gas:(可选)gas数量最近都是21000,多了浪费少了完不成
    gasPrice:gas价格有gas报价与成功率网站,正式链上可以参考给下
  2. 私钥
  3. 回调将返回有签名信息的对象
使用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变量,搞之前关闭小狐狸