【问题标题】:How to read Event's log from transaction receipt with Web3.js?如何使用 Web3.js 从交易收据中读取事件日志?
【发布时间】:2022-07-17 21:40:09
【问题描述】:

我在我的solidity项目中实现了功能,它记录了一些事件名称为“NewRound”的事件,我想从中获取价值,以便在我发送交易后保存在我的集中数据库中,我收到的收据看起来像这样。

{
  blockHash: '0x8df078a04e47cbe4ea7e58626ffc894f0d7b2620e821f9432aa1c03b3431d480',
  blockNumber: 19125457,
  contractAddress: null,
  cumulativeGasUsed: 995561,
  from: '0x0c46c078196461b17f7e1e652004bd7ee448ed49',
  gasUsed: 116384,
  logs: [
    {
      address: '0xc032d238fd4deD8A8AB97a8983AE3B51ccfa8fd3',
      topics: [Array],
      data: '0x',
      blockNumber: 19125457,
      transactionHash: '0x1e13744ddaf81cb3ca7a9cbd98ca6b2ede51a22d7e2795305b2621d59a0b9ac1',
      transactionIndex: 5,
      blockHash: '0x8df078a04e47cbe4ea7e58626ffc894f0d7b2620e821f9432aa1c03b3431d480',
      logIndex: 7,
      removed: false,
      id: 'log_301e03cb'
    }
  ],
  logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000040000800000000020000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000',
  status: true,
  to: '0xc032d238fd4ded8a8ab97a8983ae3b51ccfa8fd3',
  transactionHash: '0x1e13744ddaf81cb3ca7a9cbd98ca6b2ede51a22d7e2795305b2621d59a0b9ac1',
  transactionIndex: 5,
  type: '0x0'
}

我的日志数据在主题参数中。但我不知道如何解码它。有没有人做过这样的事情?

我的活动数据。

【问题讨论】:

  • NewRound 事件接受哪些参数?可以分享topics 数组值吗?
  • @PetrHejda 我已经更新了我的问题。谢谢

标签: node.js ethereum solidity web3js binance-smart-chain


【解决方案1】:

topics[0] 字段始终存储事件签名哈希。它是事件名称的 keccak-256 哈希,后跟括号中的参数数据类型。

在您的情况下,这是字符串 NewRound(uint256) 的哈希值。

topics 数组的以下项是事件的索引参数。最后一个topics 项目是所有未索引的参数连接(这不适用于您的情况,因为没有未索引的参数)。

这些项目是ABI encoded 并以十六进制表示。

假设您拥有发出事件的合约的 ABI JSON,您可以使用 web3.eth.abi.decodeLog() 函数解码这些值。

【讨论】:

  • 我遇到了与上述类似的问题,这里的挑战是返回的日志有一种无效的数据字段:(数据:'0x',)这里的方法:web3js.readthedocs.io/en/v1.7.3/web3-eth-abi.html#decodelog 需要那是 ABI 的字节码。为什么我们最终没有字节码?
  • @Alvin 如果发出的日志列表为空,则没有发出任何事件日志。通常情况下,代码真的没有发出任何事件,交易被还原,或者交易还没有被挖掘。所以我会从调试为什么没有发出事件开始,这很可能是这些原因之一。
【解决方案2】:

This library 对解码交易收据日志很有帮助。只需手动加载合约 ABI 并使用提供的对象进行解码

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 2021-03-03
    • 2022-01-07
    • 2020-07-23
    • 2023-02-12
    • 2018-12-26
    • 2022-12-10
    • 1970-01-01
    • 2018-08-02
    相关资源
    最近更新 更多