1 web3.js简介
web3.js是一个js API库。要使DApp在以太坊上运行,可用web3.js库提供的web3对象。
web3.js通过RPC调用与本地节点通信,它可用于任何暴露了RPC层的以太坊节点。web3包含eth对象-web3.eth(专门与以太坊区块链交互)和shh对象-web3.shh(用于与Whisper交互)。
2 web3模块加载
首先需要将web3模块安装在项目中:
代码语言:bash复制npm install web3@0.20.1
然后创建一个web3实例,设置一个"provider"
为保证MetaMask设置好的provider不被覆盖掉,在引入web3之前一般要做当前环境检查(以v0.20.1为例):
代码语言:js复制if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
3 异步回调(callback)
web3js API设计的最初目的,主要是为了和本地RPC节点共同使用,所以默认情况下发送同步HTTP请求。
如发送异步请求,可在函数最后一个参数位,传入一个回调函数。一般采用的回调风格是“错误优先”,如:
代码语言:js复制web3.eth.getBlock(48, function(error, result){
if(!error)
console.log(JSON.stringify(result));
else
console.error(error);
});
回调 Promise 事件(v1.0.0)
为助 web3 集成到不同标准的所有类型项目中,1.0.0版本提供多种方式处理异步函数。大多数web3对象允许将一个回调函数作为最后一个函数参数传入,同时返回一个promise用于链式调用。
以太坊作为一个区块链系统,一次请求具有不同的结束阶段。为满足这样要求,1.0.0 版本将这类函数调用的返回值包成一个“承诺事件”(promiEvent),这是一个 promise 和 EventEmitter 的结合体。
PromiEvent 的用法就像 promise 一样,另外还加入了.on、.once 和.off方法。
代码语言:js复制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 });nm
4 web3.js合约的相关方法
创建合约
创建合约实例的方法,最基本的合约相关方法:
代码语言:js复制new web3.eth.Contract(jsonInterface[,address][,options])
Contract接收三个参数:
- jsonInterface派生自合约的ABI
- 合约实际地址
- 一个对象,包含from,gasPrice,gas,data。后两个参数可选。
通过地址初始化合约实例,或者部署一个新的合约:
代码语言:js复制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});
监听合约事件
很多时候我们会关注合约执行的重要操作,如转账,在web3.js中我们可以监听对的合约事件,这样当合约事件被触发,web3.js就能感知事件并执行回调函数实现相应的业务逻辑。
事件和日志相关,有时希望检索一些日志数据,这个操作很常见,因为合绑署到区块链上,用户如何和合约交互完全不可控。
用户可通过我们提供的网站来和的交互,这样我们能获取一些交互数据,如交易Hash。
合约的 event 类似于 filter,可以设置过滤选项来监听
代码语言:javascript复制// 监听合约事件
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);
}
});