Echidna与Hevm假阴性问题?Ethernaut22权限测试异常
断言失败的根本原因(非Hevm假阴性)
核心问题:Ethernaut第22关的DexTwo合约
setTokens函数无权限限制
你混淆了第21关Dex合约和第22关DexTwo合约的实现差异:- 第21关Dex的
setTokens是构造函数,仅在部署时执行,不可外部调用; - 而第22关DexTwo特意把
setTokens改成了public无权限校验的函数,任何外部地址都可以调用它修改token1和token2的值。
你的测试用
hevm.prank(dist)模拟非Owner地址调用setTokens时,调用本身就是合法的,自然会修改token值,导致断言token1/token2为address(0)失败——这是测试前提错误,不是Hevm的假阴性问题。- 第21关Dex的
额外可能的测试逻辑问题
如果你的测试合约在部署DexTwo时未正确初始化Owner,或者dist地址被错误赋值为Owner地址,也会导致调用成功,但这种情况属于测试代码的低级错误,而非Hevm问题。关于Hevm假阴性的澄清
Hevm的prank机制是稳定的,它会准确切换调用上下文到指定地址,几乎不会出现假阴性。出现断言失败时,优先检查合约逻辑和测试假设,而不是归咎于Hevm。
内容的提问来源于stack exchange,提问作者Matteo Gigli
相关产品推荐
相关产品推荐

