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

Posted

技术标签:

【中文标题】哪个是订阅以太坊状态变化的更有效方式【英文标题】:Which is more effective way to subscribe state change in Ethereum 【发布时间】:2021-10-13 00:55:15 【问题描述】:

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

我发现了两种方法

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

我的问题是

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

【问题讨论】:

我更喜欢使用事件的第一种方法,但这只是我的偏好。虽然,我不确定这是否是一种有效的方法。因为我还想确保智能合约的价值已经更新。 【参考方案1】:

当 tx.receipt != null 是否也意味着以太坊状态已更新?

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

true 成功 false 已恢复

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


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

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

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

【讨论】:

你的解释很详细。谢谢

以上是关于哪个是订阅以太坊状态变化的更有效方式的主要内容,如果未能解决你的问题,请参考以下文章

以太坊中的Ghost协议

什么是以太币/以太坊ETH?

以太坊钱包地址在哪里 如何买卖以太坊

比特币以太坊挖矿选择哪个更好?以太这么坚挺还能涨多少?

什么是以太币/以太坊ETH?

用Go来做以太坊开发⑤事件日志