web3与以太坊关系图示

web3.pdf-学习文档 Download

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'}))