以太坊:Web3-Js订阅Log示例

1.web3.eth.subscribe(‘logs’, options [, callback])
Object 订阅选项
fromBlock- Number:最早的块编号。默认情况下null。
address- String|Array:仅从特定帐户获取日志的地址或地址列表。
topics- Array:一个值数组,每个值都必须出现在日志条目中。如果您想不使用主题,则顺序很重要null,例如。您还可以为每个主题传递另一个数组,并带有该主题的选项,例如[null, ‘0x00…’][null, [‘option1’, ‘option2’]]

先看文档

web3js文档是这么写的,看得懂就怪了

address和topic到底是个啥,怎么填这是个问题,请看下面
用到web3.eth.abi编码

// From a JSON interface object
web3.eth.abi.encodeFunctionSignature({
    name: 'myMethod',
    type: 'function',
    inputs: [{
        type: 'uint256',
        name: 'myNumber'
    },{
        type: 'string',
        name: 'myString'
    }]
})
> 0x24ee0097

// Or string
web3.eth.abi.encodeFunctionSignature('myMethod(uint256,string)')
> '0x24ee0097'

不错,这就是我们需要的topic,比方说我们可以监听erc20转账的事件
获取erc20转账事件的编码就是我们的topic了

var x =   web3.eth.abi.encodeEventSignature({
    name: 'Transfer',
    type: 'event',
    inputs: [{
        type: 'address',
        name: 'from'
    },{
        type: 'address',
        name: 'to'
    },{
      type: 'uint256',
      name: 'value'
  }]
});
console.log(x);//0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

然后开始log

var subscription = web3.eth.subscribe('logs', {
  address: '0x80aae114cd8482d6a86d279c38e56a8e64799500',
  topics: ['0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef']
}, function(error, result){
    if (!error)
        console.log(result);
})
.on("connected", function(subscriptionId){
    console.log(subscriptionId);
})
.on("data", function(log){
    console.log(log);
})
.on("changed", function(log){
});

再看文档理解了,address可以是账户可以是合约地址,看你想监听什么,topic可以写多个,毕竟一个合约里可以有多个函数多个事件,编码完后就可以订阅

另外还可以获取过去日志
web3.eth.getPastLogs文档在这再看的话就理解多了

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值