哪个是订阅以太坊状态变化的更有效方式
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 进行比较哈希。
【讨论】:
你的解释很详细。谢谢以上是关于哪个是订阅以太坊状态变化的更有效方式的主要内容,如果未能解决你的问题,请参考以下文章