web3.js基本介绍
web3.js是开发以太坊去中⼼化应⽤(DApp)必备的JavaScript库,提供了⽤于与geth通讯的
JavaScript API,web3.js使⽤了JSON-RPC协议与geth进⾏通信。
JSON-RPC是⼀个⽆状态,轻量级的远程调⽤协议(RPC),允许使⽤http,socket等协议进⾏
通讯,使⽤JSON作为数据格式。
Web3.js可以与所有⽀持JSON-RPC的节点进⾏通信,包括以太坊⽣态中的其他节点,如
Whisper(⼀个集成以太坊的⾮实时性消息系统)和Swarm(⼀个去中⼼化的存储系统)
Web3.js⽆法直接连接到以太坊⽹络, 只能连接到以太坊节点,如:geth
为什么要使⽤web3.js
以太坊只提供JSON-RPC接⼝,Web.js是JavaScript的⼀个封装了以太坊JSON-RPC的API的库。
JSON-RPC API
Web.js API
使⽤原⽣JSON-RPC API调⽤不⽅便,两种⽅式对⽐如下
⽬的:获取当前区块链上的区块数量。
JSON-RPC调⽤⽅式:
启动本地私有链,执⾏效果如下:
web.js调⽤⽅式:
curl -X POST –data
‘{“jsonrpc”:”2.0″,”method”:”eth_blockNumber”,”params”:[],”id”:83}’
http://localhost:8545 -H ‘content-type: application/json’
{“jsonrpc”:”2.0″,”id”:83,”result”:”0x6b”} //<–6 *16 + 11 = 107执⾏结果:
web.js调⽤⽅式:
var number = web3.eth.blockNumber
web3.eth.blockNumber
我们可以看出,使⽤web3.js库更⽅便。
使用Node进行安装
npm install web3
这里经常容易失败,需要折腾一阵子。在项目目录我用的版本是 在项目目录里改一下版本 然后执行npm install会下载对应版本
package.json
{ "dependencies": { "web3": "0.19.0" } }
demo.js
//初始化过程 var Web3 = require('web3'); 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://127.0.0.1:8545")); } var version = web3.version.api; console.log(version); let accounts=web3.eth.accounts[0]; console.log(accounts); var balance = web3.eth.getBalance(accounts); console.log(web3.fromWei(balance.toNumber(), 'ether')); // 1000000000000 var block = web3.eth.blockNumber; console.log(block); //console.log(web3.eth.accounts); //转账 //web3.eth.sendTransaction({from:web3.eth.coinbase,to:web3.eth.accounts[1], value:web3.toWei(0.1, 'ether'),data:"0x1111"}) web3.eth.getTransactionFromBlock(1)
基础API讲解
BigNmber模块
Web3.js的返回值都是bignumber类型,该类型可以存储任意数值。
var BigNumber = require('bignumber.js'); console.log('====相等?====') x = new BigNumber(123.4567); y = new BigNumber(123456.7e-3); z = new BigNumber(x); console.log(x.eq(y)) console.log('====加法====') m = new BigNumber(10101, 2); n = new BigNumber("ABCD", 16); console.log(m.plus(n)) console.log(m.plus(n).toString()) console.log('====减法====') x = new BigNumber(0.5) y = new BigNumber(0.4) console.log(0.5 - 0.4) console.log(x.minus(y).toString()) console.log('====乘法====') x = new BigNumber('2222222222222222222222222222222222') y = new BigNumber('7777777777777777777777777777777777', 16) console.log(x.times(y).toString()) console.log('====除法====') console.log(x.div(y).toString()) console.log(x.div(y).toFixed(6).toString()) console.log('==== x = -123.456====') x = new BigNumber(-123.456) console.log(x) console.log("尾数x.c:",x.c) console.log("指数x.e:",x.e) console.log("符号x.s:",x.s)
执行结果
====相等?==== true ====加法==== BigNumber { s: 1, e: 4, c: [ 44002 ] } 44002 ====减法==== 0.09999999999999998 0.1 ====乘法==== 9.0338666892195811337239599484107936881562199669307755164928940478094297 346e+73 ====除法==== 5.466398580833e-8 0.000000 ==== x = -123.456==== BigNumber { s: -1, e: 2, c: [ 123, 45600000000000 ] } 尾数x.c: [ 123, 45600000000000 ] 指数x.e: 2 符号x.s: -1
单位转换
var Web3 = require('Web3') var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')) console.log('\n将wei转换为ether, Gwei, Mwei') console.log(web3.fromWei('12345567890876433', 'ether')) console.log(web3.fromWei('12345567890876433', 'Gwei')) console.log(web3.fromWei('12345567890876433', 'Mwei')) console.log('\n转换为Wei') console.log(web3.toWei('1', 'ether')) console.log(web3.toWei('1', 'Gwei')) console.log(web3.toWei('1', 'Mwei'))
执行结果
将wei转换为ether, Gwei, Mwei 0.012345567890876433 12345567.890876433 12345567890.876433 转换为Wei 1000000000000000000 1000000000 1000000
转换为⼗六进制
var Web3 = require('Web3') var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')) console.log(web3.toHex('a')) console.log(web3.toHex(1234)) console.log(web3.toHex({name:'Duke'})) //将所有传⼊的数据都当做字符串进⾏处理,然后按照ASCII的16进制返回 //如果内部有单引号,则⾃动转化成双引号,再在外部⽤单引号括起来 console.log(JSON.stringify({name:'Duke'})) console.log(web3.toHex('{"name":"Duke"}')) console.log(web3.toHex(JSON.stringify({name:'Duke'}))) console.log(web3.toHex([1,2,3,4])) console.log(web3.toHex('[1,2,3,4]'))
执⾏结果:
0x61 0x4d2 0x7b226e616d65223a2244756b65227d {"name":"Duke"} 0x7b226e616d65223a2244756b65227d 0x7b226e616d65223a2244756b65227d 0x5b312c322c332c345d 0x5b312c322c332c345d
⼗六进制与ASCII转换
var Web3 = require('Web3') var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')) console.log("先将字符串'xyz'转换为ascii,然后转化为⼗六进制") var str = web3.fromAscii('xyz') console.log(str) console.log("先将⼗六进制转换为ascii,然后转化为字符串") str = web3.toAscii('0x78797a') console.log(str)
执行结果
先将字符串'xyz'转换为ascii,然后转化为⼗六进制 0x78797a 先将⼗六进制转换为ascii,然后转化为字符串 xyz
其他转换
web3.toDecimal() web3.toBigNumber()
检测地址有效性
该⽅法只检查16进制⻓度,地址是40位16进制字符串,共160位
web3.isAddress(eth.account[0])
⽣成hash字符串
var Web3 = require('Web3') var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')) var hash0 = web3.sha3('abc') console.log(hash0) //对结果 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45进⾏ hash var hash1 = (web3.sha3(hash0)) console.log(hash1) //对结果4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 进⾏hash //将‘0x’去除掉 console.log(web3.sha3(hash0, {encoding:'hex'}))