首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何调试稳固性测试

如何调试稳固性测试
EN

Ethereum用户
提问于 2021-08-18 18:31:32
回答 4查看 2.5K关注 0票数 2

我正在使用ganache和块菌来编写一些可靠的测试(遵循https://www.trufflesuite.com/docs/truffle/testing/writing-tests-in-solidity中的示例)。

我得到的消息通常并不是很有帮助:"Error:返回的错误: VM异常,同时处理事务: revert“。

我在代码中添加了事件,无论是在测试中还是在实际合同中。

当错误发生时,不会显示任何内容。

它没有显示失败的事务,因此我无法尝试启动调试会话。

没有断点也没有日志记录。如何调试此测试?

使用控制台,我已经验证了合同是否如预期的那样工作。

EN

回答 4

Ethereum用户

发布于 2021-08-20 09:13:38

测试事物的一些可能的选项:

  1. 使用硬帽console.log
  2. 使用温柔的探索者 (您可以使用testnet验证的契约,甚至可以使用他们的CLI来本地契约),或者如果契约在testnet上,也可以在他们的模拟器中运行。
  3. 开始隔离函数调用。一个接一个地识别,直到呼叫到达的地方,以及它正在发生什么状态的变化,等等。

做1是最简单的方法,2是困难的,3是最难的。

票数 3
EN

Ethereum用户

发布于 2021-08-18 20:50:01

首先,事件日志不会保存在事务失败时,因此您可以使用日志查看代码停止的位置。

如果您使用的是geth,您可以使用rpc命令debug_traceTransactiontraceCaller参数,它将从调用的契约开始返回对每个外部契约的所有调用。

如果您正在使用ganache,那么上面的选项是不可用的,您最好的选择是创建一个不会失败事务的测试智能契约,以获取事件日志。另一种选择是在您认为不带消息的契约调用上使用solidity的trycatch,并且在catch块中,您可以使用自己的消息进行还原。

“无消息还原”很容易成为您自己的契约代码无法正确执行的问题,比如超出范围的索引,或者在试图遍历更改的列表时。

票数 1
EN

Ethereum用户

发布于 2021-08-19 02:16:56

当涉及到调试时,您可能需要检查硬帽。这是一个开发环境,您可以将console.logs (与javascript中的方式相同)放置在智能契约中,这将为您提供更好的概述,您的逻辑中断在哪里。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/107370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档