哪种订阅以太坊状态变化的方式更有效

Which is more effective way to subscribe state change in Ethereum

我在 ERC721 中单击 运行 方法 approve(tokenID, myContract) 的按钮,以便我的合约可以转移此令牌。在那之后,我需要等到以太坊中的状态更新后再做其他事情。所以我需要知道以太坊中的状态何时更新

我找到了 2 种方法

  1. ERC721
  2. 中收听事件 Approval
  3. 调用 approve 后,我收到 response,其中包含 txHash。然后我可以使用这个 txHash 到 运行 library.getTransactionReceipt(txHash).then(receipt => {}) (library = Web3Provider)

我的问题是

  1. tx.receipt != null 是否也意味着以太坊状态已更新?
  2. 如果是,那哪种方式更有效?

When tx.receipt != null does it also means that Ethereum state updated?

当事务被恢复时,receipt 可以有非空值——这意味着状态没有更新。您可以在 receipt 字段中找到此信息 status

  • true成功
  • false 已还原

注意:最近实施的 EIP-2718 有效地允许没有 status 字段的交易收据,因此可能会有一些交易类型没有 status 将来。此外,拜占庭硬分叉(2017 年 10 月)之前的交易也没有 status 字段。


对于你原来的问题,这两种方式都是有效的。

如果您正在构建一个没有太多逻辑或有时会失败的小型应用程序,则第二个选项似乎不太健壮(就处理异步性而言)。您只需等待 txHash(您只会在 tx 被挖掘成一个块后收到),然后根据哈希得到 tx 收据(包含事件日志)。

但是,如果您的应用程序在获取交易哈希值和处理收据中的事件日志之间崩溃了怎么办?如果这是您的顾虑,您可能想要实现一种将 tx 哈希存储到数据库的方法,收听事件日志(您的第 1 点),并将每个事件日志(包含其事务的哈希)与存储的 tx 进行比较哈希值。