一、
1、web3.js
(1)创建文件并初始化生成package.json
(2)指定web3版本安装并将其加入到package.json
2、web3模块加载
首先需要将 web3 模块安装在项目中:
npm install [email protected]
然后创建一个 web3 实例,设置一个“provider”
为了保证我们的 MetaMask 设置好的 provider 不被覆盖掉,在引入 web3 之前我们一般要做当前环境检查(以v0.20.1为例):
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
web3 = new Web3(new Web3.providers
.HttpProvider("http://localhost:8545"));
}
二、
1、异步回调(callback)
web3js API 设计的最初目的,主要是为了和本地 RPC 节点共同使用,所以默认情况下发送的是同步 HTTP 请求
如果要发送异步请求,可以在函数的最后一个参数位置上,传入一个回调函数。回调函数是可选(optioanl)的
我们一般采用的回调风格是所谓的“错误优先”,例如:
web3.eth.getBlock(48, function(error, result){
if(!error)
console.log(JSON.stringify(result));
else
console.error(error);
});
2、回调 Promise 事件(v1.0.0)
为了帮助 web3 集成到不同标准的所有类型项目中,1.0.0 版本提供了多种方式来处理异步函数。大多数的 web3 对象允许将一个回调函数作为最后一个函数参数传入,同时会返回一个 promise 用于链式函数调用。
以太坊作为一个区块链系统,一次请求具有不同的结束阶段。为了满足这样的要求,1.0.0 版本将这类函数调用的返回值包成一个“承诺事件”(promiEvent),这是一个 promise 和 EventEmitter 的结合体。
PromiEvent 的用法就像 promise 一样,另外还加入了.on,.once 和.off方法
web3.eth.sendTransaction({from: '0x123...', data: '0x432...'})
.once('transactionHash', function(hash){ ... })
.once('receipt', function(receipt){ ... })
.on('confirmation', function(confNumber, receipt){ ... })
.on('error', function(error){ ... })
.then(function(receipt){ // will be fired once the receipt is mined });
3、应用二进制接口(ABI)
gexiao@gexiaovm:~/geth/0403/web3_test$ ls
node_modules package.json package-lock.json
gexiao@gexiaovm:~/geth/0403/web3_test$ vi Coin.sol
gexiao@gexiaovm:~/geth/0403/web3_test$ cat Coin.sol
pragma solidity >0.4.22;
contract Coin {
mapping (address => uint ) public balances;
constructor(uint initalSupply) public {
balances[msg.sender] = initalSupply;
}
function send(address receiver, uint amount) public returns(bool succese) {
require(balances[msg.sender] >= amount);
require(balances[msg.sender]+amount >= balances[receiver]);
balances[msg.sender] -= amount;
balances[receiver] += amount;
return true;
}
}
gexiao@gexiaovm:~/geth/0403/web3_test$ mkdir contract
gexiao@gexiaovm:~/geth/0403/web3_test$ ls
Coin.sol contract node_modules package.json package-lock.json
gexiao@gexiaovm:~/geth/0403/web3_test$ mv Coin.sol contract/
gexiao@gexiaovm:~/geth/0403/web3_test$ ls
contract node_modules package.json package-lock.json
gexiao@gexiaovm:~/geth/0403/web3_test$ cd contract/
gexiao@gexiaovm:~/geth/0403/web3_test/contract$ ls
Coin.sol
//生成字节码,供web3调用
gexiao@gexiaovm:~/geth/0403/web3_test/contract$ solc --abi Coin.sol
======= Coin.sol:Coin =======
Contract JSON ABI
[{"inputs":[{"internalType":"uint256","name":"initalSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"send","outputs":[{"internalType":"bool","name":"succese","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
gexiao@gexiaovm:~/geth/0403/web3_test/contract$
四、
1、批处理请求(batch requests)
var batch = web3.createBatch(); batch.add(web3.eth.getBalance.request('0x0000000000000000 000000000000000000000000', 'latest', callback)); batch.add(web3.eth.contract(abi).at(address).balance.request(a ddress, callback2));
batch.execute();
2、大数处理(big numbers)
var balance = new BigNumber('131242344353464564564574574567456');
// or var balance = web3.eth.getBalance(someAddress);
balance.plus(21).toString(10);
//"131242344353464564564574574567477"
> var BigNumber = require('bignumber.js')
undefined
> var balance = new BigNumber('153546313248963123213216654')
undefined
> balance
//s表示正负(1和-1),e表示位数,c表示数组,14位划分一组
BigNumber { s: 1, e: 26, c: [ 1535463132489, 63123213216654 ] }
>
五、
1、常用 API —— 基本信息查询
2、基本信息查询
3、网络状态查询
六、
1、Provider
2、web3 通用工具方法
3、web3.eth – 账户相关
七、
1、区块相关
2、区块相关
3、 交易相关
4、交易执行相关
5、发送交易
6、消息调用
var result = web3.eth.call({ to: "0xc4abd0339eb8d57087278718986382264244252f",
data: "0xc6888fa10000000000000000000000000000000000000000000000000000000000000003" });
console.log(result);
八、
1、日志过滤(事件监听)
web3.eth.filter( filterOptions [ , callback ] )
// filterString 可以是 'latest' or 'pending'
var filter = web3.eth.filter(filterString);
// 或者可以填入一个日志过滤 options
var filter = web3.eth.filter(options);
// 监听日志变化
filter.watch(function(error, result){ if (!error) console.log(result); });
// 还可以用传入回调函数的方法,立刻开始监听日志
web3.eth.filter(options, function(error, result){
if (!error) console.log(result);
});
2、合约相关 —— 创建合约
web3.eth.contract
var MyContract = web3.eth.contract(abiArray);
// 通过地址初始化合约实例
var contractInstance = MyContract.at(address);
// 或者部署一个新合约
var contractInstance = MyContract.new([constructorParam1] [, constructorParam2], {data: '0x12345...', from: myAccount, gas: 1000000});
九、
1、调用合约函数
可以通过已创建的合约实例,直接调用合约函数
// 直接调用,自动按函数类型决定用 sendTransaction 还是 call
myContractInstance.myMethod(param1 [, param2, ...] [, transactionObject] [, defaultBlock] [, callback]);
// 显式以消息调用形式 call 该函数
myContractInstance.myMethod.call(param1 [, param2, ...] [, transactionObject] [, defaultBlock] [, callback]);
// 显式以发送交易形式调用该函数
myContractInstance.myMethod.sendTransaction(param1 [, param2, ...] [, transactionObject] [, callback]);
2、监听合约事件
合约的 event 类似于 filter,可以设置过滤选项来监听
var event = myContractInstance.MyEvent({valueA: 23} [, additionalFilterObject])
// 监听事件
event.watch(function(error, result){ if (!error) console.log(result); });
//还可以用传入回调函数的方法,立刻开始监听事件
var event = myContractInstance.MyEvent([{valueA: 23}]
[, additionalFilterObject] , function(error, result){
if (!error) console.log(result);
});
十、总结
主要是web3的一些解析和操作,但版本比较老,可能在现在一些命令不能使用。