Web3JS文档速读 (5)合约的交互操作

需要处理合约的交互操作, 那么就需要使用 eth.Contract 类.

初始化对象

1
const contract = new web3.eth.Contract(jsonInterface [,address] [,options]);

注意 jsonInterface 实际上就是合约的 abi.

初始化的时候可以不给 address 参数, 但进行查询或者写入操作之前, 必须要使用 .options.address 进行设置.

对象属性

  • address: 合约地址, 注意区别 from
  • jsonInterface: 合约 abi
  • data: 合约编译后的二进制数据
  • from: 交易发起账户, 注意区别 address
  • gasPrice: wei
  • gas: 最大愿意支付 gas 值(实际是 gas limit)

对象方法

  1. 克隆合约对象: .clone()

  2. 部署合约准备: .deploy({data:str, arguments:[]})

返回对象

  • arguments
  • send({from, gas, gasPrice})
  • encodeABI() String
  • estimateGas((err, gas) => {})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
myContract.deploy({
data: '0x12345...',
arguments: [123, 'My String']
})
.send({
from: '0x1234567890123456789012345678901234567891',
// gas: 1500000,
// gasPrice: '30000000000000'
}, function(error, transactionHash){ ... })
.on('error', function(error){ ... })
.on('transactionHash', function(transactionHash){ ... })
.on('receipt', function(receipt){
console.log(receipt.contractAddress) // contains the new contract address
})
.on('confirmation', function(confirmationNumber, receipt){ ... })
.then(function(newContractInstance){
console.log(newContractInstance.options.address) // instance with the new contract address
});
  1. 可调用方法列表 methods

  2. 调用合约方法

调用只读方法: methods.funcName(args).call({from, gas, gasPrice}).then(result => {}); // result 为对象(返回值个数为2+)/为简单值(返回值个数为1)

调用写方法:

methods.funcName(args).call({from, gas, gasPrice, value})
.on(“transactionHash”, txHash => {})
.on(‘confirmation’, (confirmationNumber, receipt) => {})
.on(‘receipt’, (receipt) => {}) // transactionHash, blockNumber, contractAddress, events
.on(‘error’, console.error);

估算费用: methods.funcName(args).estimateGas().then((err, gas) => {});

编译二进制: const abiData = methods.funcName(args).encodeABI();

监听事件

监听导数据后即刻退出:

contract.once(‘eventName’, options, (err, data) => {})

监听合约某个事件:

contract.events.eventName(options)
.on(‘data’, data=>{})
.on(‘changed’, data=>{})
.on(‘error’, err=>{})

监听合约的所有事件:

contract.events.allEvents(options)…

获取合约历史数据:

contract.getPastEvents(eventName/‘allEvents’ [,options])
.then(logs => { loop logs array })

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.