美文网首页
[快速入门]使用web3.js监听besu上的合约事件

[快速入门]使用web3.js监听besu上的合约事件

作者: 95加不满 | 来源:发表于2021-06-11 18:00 被阅读0次

注意点:
使用“allEvents”时filter不起作用。

事件方法(once、events、getPastEvents)

  • once : 仅仅收到一次监听的事件。
    myContract.once(event[, options], callback)

参数:

  1. event - String: 指定的事件名称,或者使用“allEvents”监听所有的事件。
  2. options -Object(选填):
    • filter - Object (optional): 可以通过indexed标识的参数进行条件约束。

示例:
监听到一次事件后,不再监听。如下所示:

方法代码:

async function once(deployedContractAddress) {
    console.log('********* once *********');
    const web3 = new Web3(besu.member1.wsUrl);
    const myContract = new web3.eth.Contract(contractAbi, deployedContractAddress);
    myContract.once('SetEventIndexParam', {
        filter: { no: [20, 21] }, // Using an array means OR: e.g. 20 or 21
    }, function (error, event) {
        console.log('***********once start *************');
        console.log(event);
        console.log('***********once end *************');
    });
}

结果输出:

***********once start *************
{
  logIndex: 0,
  removed: false,
  blockNumber: 41625,
  blockHash: '0x06de5075e3e48d5d28c3178ce4be90ead3e0d56824ac8c057ee3d4aac3aa239a',
  transactionHash: '0x2332d73be8a723c7ff08155d55e8980614d7dd8ff0de5c6cc9891e0a0248fd17',
  transactionIndex: 0,
  address: '0xCE43A53f22471d00Eb038A9618B588f40C61E97e',
  id: 'log_df6d00d3',
  returnValues: Result {
    '0': '20',
    '1': '0x67df77adbc271f558df88504cf3a3f87bfdd2d55b11e86c55c4fd978a935a836',
    no: '20',
    addr: '0x67df77adbc271f558df88504cf3a3f87bfdd2d55b11e86c55c4fd978a935a836'
  },
  event: 'SetEventIndexParam',
  signature: '0x5c105cb8c4301efd6cb5e58d7edc6409c9875d38a2fa6cfc271f38e4a32364ad',
  raw: {
    data: '0x',
    topics: [
      '0x5c105cb8c4301efd6cb5e58d7edc6409c9875d38a2fa6cfc271f38e4a32364ad',
      '0x0000000000000000000000000000000000000000000000000000000000000014',
      '0x67df77adbc271f558df88504cf3a3f87bfdd2d55b11e86c55c4fd978a935a836'
    ]
  }
}
***********once end *************

  • events
    myContract.events.MyEvent([options][, callback])

参数:

  1. options -Object(选填):
    • filter - Object (optional): 可以通过indexed标识的参数进行条件约束(仅仅uint类型支持,其他string测试没起效)。
    • fromBlock - Number|String|BN|BigNumber (optional):从指定的块号开始获取事件内容。

示例:
从块号3000开始,监听no为20或者21的事件。如下:

方法代码:

async function testEventIndexedParam(deployedContractAddress) {
    const web3 = new Web3(besu.member1.wsUrl);
    myContract = new web3.eth.Contract(contractAbi, deployedContractAddress);
    myContract.events.SetEventIndexParam({
        filter: { no: [20, 21] },
        fromBlock: 3000
    }, function (error, event) {
        console.log('***********testEventIndexedParam start *************');
        console.log(event);
        console.log('***********testEventIndexedParam end *************');
    }).on("connected", function (subscriptionId) {
        console.log("connected:" + subscriptionId);
    }).on('data', function (event) {
        // console.log("data:\n"+ JSON.stringify(event)); // same results as the optional callback above
    }).on('changed', function (event) {
        // remove event from local database
        console.log("changed:\n" + event)
    }).on('error', function (error, receipt) { // If the transaction was rejected by the network with a receipt, the second parameter will be the receipt.
        console.log(error);
    });
}

结果输出:

***********testEventIndexedParam start *************
{
  logIndex: 0,
  removed: false,
  blockNumber: 37063,
  blockHash: '0x6e44d0b602ea1594c7da11fd39f0846bac4e5fbae71d413ae6806a1ad15e80ec',
  transactionHash: '0xcde8dd9d08bffa1c97c38956700116ffdc7ba84446694d2c13b7d039e0449bd1',
  transactionIndex: 0,
  address: '0xCE43A53f22471d00Eb038A9618B588f40C61E97e',
  id: 'log_903c6e97',
  returnValues: Result {
    '0': '20',
    '1': '0x3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb',
    no: '20',
    addr: '0x3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb'
  },
  event: 'SetEventIndexParam',
  signature: '0x5c105cb8c4301efd6cb5e58d7edc6409c9875d38a2fa6cfc271f38e4a32364ad',
  raw: {
    data: '0x',
    topics: [
      '0x5c105cb8c4301efd6cb5e58d7edc6409c9875d38a2fa6cfc271f38e4a32364ad',
      '0x0000000000000000000000000000000000000000000000000000000000000014',
      '0x3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb'
    ]
  }
}
***********testEventIndexedParam end *************
***********testEventIndexedParam start *************
{
  logIndex: 0,
  removed: false,
  blockNumber: 37097,
  blockHash: '0xae021bb48bb8b9786a9e3a5dc65183787ea79ac1ea900a5165abb239066cd538',
  transactionHash: '0xab8f32a6798b6707a97d55a4e2847e8452a95616058bf964323edc848dc3367f',
  transactionIndex: 0,
  address: '0xCE43A53f22471d00Eb038A9618B588f40C61E97e',
  id: 'log_e5e96480',
  returnValues: Result {
    '0': '21',
    '1': '0x67fad3bfa1e0321bd021ca805ce14876e50acac8ca8532eda8cbf924da565160',
    no: '21',
    addr: '0x67fad3bfa1e0321bd021ca805ce14876e50acac8ca8532eda8cbf924da565160'
  },
  event: 'SetEventIndexParam',
  signature: '0x5c105cb8c4301efd6cb5e58d7edc6409c9875d38a2fa6cfc271f38e4a32364ad',
  raw: {
    data: '0x',
    topics: [
      '0x5c105cb8c4301efd6cb5e58d7edc6409c9875d38a2fa6cfc271f38e4a32364ad',
      '0x0000000000000000000000000000000000000000000000000000000000000015',
      '0x67fad3bfa1e0321bd021ca805ce14876e50acac8ca8532eda8cbf924da565160'
    ]
  }
}
***********testEventIndexedParam end *************

  • getPassEvents
    myContract.getPastEvents(event[, options][, callback])

参数:

  1. event - String: 指定的事件名称,或者使用“allEvents”监听所有的事件。
  2. options -Object(选填):
    • filter - Object (optional): 可以通过indexed标识的参数进行条件约束(仅仅uint类型支持,其他string测试没起效)。
    • fromBlock - Number|String|BN|BigNumber (optional):从指定的块号(大于等于)开始获取事件内容。
    • toBlock - Number|String|BN|BigNumber (optional):截至到指定的块号(小于等于)获取事件内容。

返回:

  1. 返回数组(Array):事件的 Objects

示例:
从块号3000开始,监听no为20或者21的事件。如下:

方法代码:

async function getPastEvent(deployedContractAddress) {
    const web3 = new Web3(besu.member1.wsUrl);
    const myContract = new web3.eth.Contract(contractAbi, deployedContractAddress);
    myContract.getPastEvents('SetEventIndexParam', {
        filter: { no: [20, 21] }, // Using an array means OR: e.g. 20 or 21
        fromBlock: 3576,
        toBlock: 'latest'
    }, function (error, events) {
        // console.log(error);
        // console.log("events:\n"+JSON.stringify(events));
        for (let index = 0; index < events.length; index++) {
            console.log('***********getPastEvent start *************');
            const element = events[index];
            console.log(element.returnValues);
            console.log('***********getPastEvent end *************');
        }
    }).then(function (events) {
        // console.log(events) // same results as the optional callback above
    });
}

结果输出:

***********getPastEvent start *************
{
  logIndex: 0,
  removed: false,
  blockNumber: 37063,
  blockHash: '0x6e44d0b602ea1594c7da11fd39f0846bac4e5fbae71d413ae6806a1ad15e80ec',
  transactionHash: '0xcde8dd9d08bffa1c97c38956700116ffdc7ba84446694d2c13b7d039e0449bd1',
  transactionIndex: 0,
  address: '0xCE43A53f22471d00Eb038A9618B588f40C61E97e',
  id: 'log_903c6e97',
  returnValues: Result {
    '0': '20',
    '1': '0x3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb',
    no: '20',
    addr: '0x3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb'
  },
  event: 'SetEventIndexParam',
  signature: '0x5c105cb8c4301efd6cb5e58d7edc6409c9875d38a2fa6cfc271f38e4a32364ad',
  raw: {
    data: '0x',
    topics: [
      '0x5c105cb8c4301efd6cb5e58d7edc6409c9875d38a2fa6cfc271f38e4a32364ad',
      '0x0000000000000000000000000000000000000000000000000000000000000014',
      '0x3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb'
    ]
  }
}
***********getPastEvent end *************
***********getPastEvent start *************
{
  logIndex: 0,
  removed: false,
  blockNumber: 37097,
  blockHash: '0xae021bb48bb8b9786a9e3a5dc65183787ea79ac1ea900a5165abb239066cd538',
  transactionHash: '0xab8f32a6798b6707a97d55a4e2847e8452a95616058bf964323edc848dc3367f',
  transactionIndex: 0,
  address: '0xCE43A53f22471d00Eb038A9618B588f40C61E97e',
  id: 'log_e5e96480',
  returnValues: Result {
    '0': '21',
    '1': '0x67fad3bfa1e0321bd021ca805ce14876e50acac8ca8532eda8cbf924da565160',
    no: '21',
    addr: '0x67fad3bfa1e0321bd021ca805ce14876e50acac8ca8532eda8cbf924da565160'
  },
  event: 'SetEventIndexParam',
  signature: '0x5c105cb8c4301efd6cb5e58d7edc6409c9875d38a2fa6cfc271f38e4a32364ad',
  raw: {
    data: '0x',
    topics: [
      '0x5c105cb8c4301efd6cb5e58d7edc6409c9875d38a2fa6cfc271f38e4a32364ad',
      '0x0000000000000000000000000000000000000000000000000000000000000015',
      '0x67fad3bfa1e0321bd021ca805ce14876e50acac8ca8532eda8cbf924da565160'
    ]
  }
}
*

其他用法示例:
通过http方式监听besu上智能合约的事件
使用web3j监听besu上智能合约的事件

相关文章

网友评论

      本文标题:[快速入门]使用web3.js监听besu上的合约事件

      本文链接:https://www.haomeiwen.com/subject/korveltx.html