阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      web3 交易 logs 相关总结

      • getPastLogs
      • myContract.getPastEvents()
      • web3.eth.abi.decodeLog
      • subscribe(‘logs’)- 未实现

      getPastLogsmyContract.getPastEvents() 都是调用eth_getLogs

      getPastLogs

      web3.eth.getPastLogs(options [, callback])
      
      new Method({
          name: 'getPastLogs',
          call: 'eth_getLogs',
          params: 1,
          inputFormatter: [formatter.inputLogFormatter],
          outputFormatter: formatter.outputLogFormatter
      }),
      
      

      获取过去的日志,匹配给定的选项。

      参数

      <Object> - 过滤器选项如下:

      • fromBlock - Number|String:
        • 从哪个块开始查询
        • 默认"latest"
        • “latest"可以表示最近和"pending"当前挖掘的块。
      • toBlock - Number|String:
        • 终止的块
        • 默认"latest”。
      • address - String|Array:
        • 仅从特定帐户获取日志的地址或地址列表。
      • topics - Array:
        • 必须各自出现在日志条目中的值数组。
        • 如果你想让主题不被使用 null,顺序很重要,
          • 例如。您还可以为每个主题传递一个数组,其中包含该主题的选项;
          • 例如 [null, '0x12...']null, ['option1', 'option2']]

      返回

      Promise returns Array- 日志对象的数组。

      返回事件的结构 Object 在 Array 如下外观:

      • address - String:此事件源于此。
      • data - String:包含非索引日志参数的数据。
      • topics - Array:具有最多 4 个 32 字节主题的数组,主题 1-3 包含日志的索引参数。
      • logIndex - Number:块中事件索引位置的整数。
      • transactionIndex- Number:事务的索引位置的整数,事件是在中创建的。
      • transactionHash 32 字节 - String:此事件创建的事务的哈希值。
      • blockHash 32 字节 - String:创建此事件的块的哈希值。null 当它仍然未决时。
      • blockNumber - Number:创建此日志的块编号。null 当仍处于挂起状态时。

      示例

      
      web3.eth.getPastLogs(
              {
                  address: "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe",
                  topics: ["0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234"]
              }
          )
          .then(console.log);
      
      > [
          {
      
              data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385',
              topics: [
                  '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7',
                  '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385'
                  ]
              logIndex: 0,
              transactionIndex: 0,
              transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385',
              blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7',
              blockNumber: 1234,
              address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
      
          },
          {...}
        ]
      
      

      web3.eth.abi.decodeLog

      解码 ABI 编码的日志数据。

      web3.eth.abi.decodeLog(inputs, hexString, topics);
      

      参数

      • inputs - Object:JSON 接口输入数组。
      • hexString - String:日志 data 字段中的 ABI 字节代码。
      • topics - Array:具有日志的索引参数主题的数组,如果是非匿名事件,则不带主题[0],否则使用主题[0]

      返回

      Object - 包含已解码参数的结果对象。

      示例

      web3.eth.abi.decodeLog([{
          type: 'string',
          name: 'myString'
      },{
          type: 'uint256',
          name: 'myNumber',
          indexed: true
      },{
          type: 'uint8',
          name: 'mySmallNumber',
          indexed: true
      }],
      '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000748656c6c6f252100000000000000000000000000000000000000000000000000',
      ['0x000000000000000000000000000000000000000000000000000000000000f310', '0x0000000000000000000000000000000000000000000000000000000000000010']);
      
      
      > Result {
          '0': 'Hello%!',
          '1': '62224',
          '2': '16',
          myString: 'Hello%!',
          myNumber: '62224',
          mySmallNumber: '16'
      }
      

      subscribe(‘logs’)

      订阅传入日志,按给定选项进行过滤。

      web3.eth.subscribe('logs', options [, callback]);
      

      参数

      • "logs"- String,订阅的类型。
      • Object - 订阅选项
        • fromBlock - Number:最早的块数。默认情况下 null。
        • address- String|Array:仅从特定帐户获取日志的地址或地址列表。
        • topics- Array:必须各自出现在日志条目中的值数组。
          • 如果你想让主题不被使用 null,顺序很重要,
          • 例如。您还可以为每个主题传递另一个数组,其中包含该主题的选项,
          • 例如 [null, ‘0x00…']null, [‘option1’, ‘option2’]]
      • callback- Function:(可选)
        • 返回错误对象作为第一个参数,结果作为秒。将为每个传入的订阅调用。

      返回

      EventEmitter:订阅实例作为事件发射器,具有以下事件:

      • "data" 返回 Object:
        • 以日志对象作为参数触发每个传入日志。
      • "changed" 返回 Object:
        • 触发从区块链中删除的每个日志。该日志将具有附加属性。"removed: true",
      • “error"返回 Object:发生订阅错误时触发。

      有关返回事件的结构,Object 参阅 web3.eth.getPastEvents 返回值。

      回调返回

      Object|Null - 如果订阅失败,则第一个参数是错误对象。 Object- web3.eth.getPastEvents 中的日志对象返回值。

      示例

      //subscription
      var subscription = web3.eth.subscribe('logs', {
          address: '0x123456..',
          topics: ['0x12345...']
      }, function(error, result){
          if (!error){
              console.log(result);
          }
      })
      .on("data", function(log){
          console.log(log);
      })
      .on("changed", function(log){
          //....
      });
      
      // unsubscribes
      subscription.unsubscribe(function(error, success){
          if(success){
              console.log('Successfully unsubscribed!');
          }
      });
      

      myContract.getPastEvents()

      myContract.getPastEvents(event[, options][, callback])
      
      var getPastLogs = new Method({
          name: 'getPastLogs',
          call: 'eth_getLogs',
          params: 1,
          inputFormatter: [formatters.inputLogFormatter],
          outputFormatter: this._decodeEventABI.bind(subOptions.event)
      });
      
      

      获取此合约的过去事件。

      参数

      • event- String:合同中事件的名称,或"allEvents"获取所有事件。
      • options- Object(可选):用于部署的选项。
        • filter - Object(可选):允许您通过索引参数过滤事件,
          • 例如,表示“myNumber”为 12 或 13 的所有事件。{filter: {myNumber: [12,13]}}
        • fromBlock- Number(可选):从中获取事件的块编号。
        • toBlock- Number(可选):用于获取事件的块编号(默认为"latest”)。
        • topics- Array(可选):这允许手动设置事件过滤器的主题。
          • 如果给定过滤器属性和事件签名,则不会自动设置(topic [0])。
      • callback- Function(可选):此回调将以第二个参数的事件日志数组或第一个参数的错误触发。

      返回

      Promise 返回 Array :包含过去事件的数组Objects,与给定的事件名称和过滤器匹配。

      对于返回事件的结构,Object 请参阅 getPastEvents 返回值。

      示例

      
      myContract.getPastEvents('MyEvent', {
          filter: {myIndexedParam: [20,23], myOtherIndexedParam: '0x123456789...'}, // Using an array means OR: e.g. 20 or 23
          fromBlock: 0,
          toBlock: 'latest'
      }, function(error, events){ console.log(events); })
      .then(function(events){
          console.log(events) // same results as the optional callback above
      });
      
      > [{
          returnValues: {
              myIndexedParam: 20,
              myOtherIndexedParam: '0x123456789...',
              myNonIndexParam: 'My String'
          },
          raw: {
              data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385',
              topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385']
          },
          event: 'MyEvent',
          signature: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7',
          logIndex: 0,
          transactionIndex: 0,
          transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385',
          blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7',
          blockNumber: 1234,
          address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
      },{
          ...
      }]
      
      
      目录
      目录