当自我没有广播交易时,如何使用以太坊客户端从状态恢复异常中获取消息?
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 的限制(奇偶校验可能有一些问题)。以上是关于当自我没有广播交易时,如何使用以太坊客户端从状态恢复异常中获取消息?的主要内容,如果未能解决你的问题,请参考以下文章