当自我没有广播交易时,如何使用以太坊客户端从状态恢复异常中获取消息?

Posted

技术标签:

【中文标题】当自我没有广播交易时,如何使用以太坊客户端从状态恢复异常中获取消息?【英文标题】:How can one obtain the message from state-reverting exception using ethereum clients, when self did not broadcast transaction? 【发布时间】:2020-06-16 10:36:41 【问题描述】:

假设以太坊智能合约有外部函数“foo”,其逻辑有状态恢复异常require(1 == 0, 'error: you broke the simulation!');

如果 ethereum-client A 广播交易“txA”,这是对 foo 的函数调用,ethereum-client B 如何访问与“txA”对应的状态恢复消息?

编辑:通过“如何”,我的意思是开发人员实际上如何使以太坊客户端 B 能够访问这些数据。即,您能否指出我从特定工具调用正确(低级..不是 webui)api/rpc 的方向?

显然这是可能的,因为区块浏览器会为失败的交易提供此类消息。我阅读了一些 etherscan 的源代码,但是它们的 javascript 被最小化并且不容易阅读。

提前致谢!

【问题讨论】:

我也一直在挖掘 go-ethereum 的源代码,以及 Metamask 寻找解决方案,但无济于事。 (然而?)。我还调查了对该网络中节点的可能 rpc 调用列表,我发现最接近的是“getTransactionLogs”。不幸的是,这些日志似乎只针对已包含在块中的事务,而当函数恢复时,情况并非如此。 【参考方案1】:

看到这个:https://ethereum.stackexchange.com/questions/39817/are-failed-transactions-included-in-the-blockchain

失败的交易通常包含在链中。

你有时会看到什么,如果你正在使用例如MetaMask,是一个弹出窗口,说“此交易将失败”,发生在交易发送到链之前。这是 MetaMask 试图提供帮助并防止您浪费气体。但是你无论如何都可以强制发送交易,你会得到一个失败/恢复的交易发布在链上(比如this one for this Solidity source)。

所以回答最初的问题,如果 TxA 发布在链上,那么客户端 B 将处理它并自己获取还原消息。如果 TxA 没有上链,那么就没有它的记录。

【讨论】:

我很欣赏你的理论肯定它可以做到。我最初的问题是`ethereum-client B 如何访问与“txA”对应的状态恢复消息?`所以作为开发人员,使用来自任何各种工具(go-ethereum 等)的 api(或 rpc 调用)调用, etherum-client B 如何访问这些数据?哪个 api(或 rpc)从哪个工具调用? 我使用 Nethereum,.NET api,调用是 web3.Eth.GetContractTransactionErrorReason,它传递了一个 tx 哈希并返回一个字符串。此处的示例用法:playground.nethereum.com/csharp/id/1050。我不知道 webjs 等价物是什么。另外,我相信仍然存在客户端必须是 geth 的限制(奇偶校验可能有一些问题)。

以上是关于当自我没有广播交易时,如何使用以太坊客户端从状态恢复异常中获取消息?的主要内容,如果未能解决你的问题,请参考以下文章

以太坊源码交易流程源码解读

以太坊源码 交易池 基本流程解析

以太坊工作原理之交易生命周期

我的以太坊收到错误:目前状态不可用

以太坊 数据规模 大小

以太坊 数据规模 大小