资讯专栏INFORMATION COLUMN

web3公测版本教程(二)-基础异步语法,交易,签名交易,ganache-cli

Martin91 / 2538人阅读

摘要:可以解锁,也可以将交易代码写函数内。签名交易同理封装一个异步函数,实际上签名交易分为两个步骤签名一个交易发送这个签名的交易到区块链。

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

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变量,搞之前关闭小狐狸

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23996.html

相关文章

  • web3公测版本教程(三)-不用自己同步以太坊节点,直接发起签名交易

    摘要:最后毅然决然的选择自己同步节点的苦逼之路。三用连接发起智能合约交易要发起交易首先要解决的就是问题一,不可以用。自己同步节点就可以先解锁在签名交易,然后发送交易给其他节点。 一.前言 前文提到目前有一些公司提供公共的以太坊对外服务,就是以你可以调用他的web3接口,之前一直被两个问题困扰,一个是觉得别人的节点不安全,还有初步尝试后发现Infura节点没有开放账户相关的方法。没法使用web...

    The question 评论0 收藏0
  • web3公测版本教程(一)-ETH公有链节点同步

    摘要:将返回进程码查看实时查看日志关闭杀死进程同步节点结论目前来说和都是可以同步成功节点完全可以放在国外,同步速度会很快,使用连接执行脚本就好有特殊需求国内阿里云也可以同步成功。 ETH公有链节点同步 最近区块链公司很多都会搞发糖果活动,一般都能吸引几万粉丝,这就来了一个需求,给人家发糖果。主流的geth,parity,甚至imtoken钱包只能输入地址一笔笔交易,几万笔交易人工根本无法完成...

    flybywind 评论0 收藏0
  • truffle安装以及使用示例

    摘要:安装命令使用命令安装完成后,直接输入即可。函数名函数名用于修改状态变量的函数的调用,可以简写为后面这种。访问内有使用教程。文件夹中没有,取而代之的是,内容是个简单的,功能是修改一个状态变量的值为然后读取它。 Truffle ubuntu下安装truffle truffle安装的依赖环境有:Nodejs,git ,python2.7(ubuntu自带)安装git sudo apt-get...

    RiverLi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<