通过web3.js与以太坊客户端进行交互

2024-07-27 21:44:28 浏览数 (1)

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

0 人点赞