Solidity合约测试触发VM交易回滚异常求助
解决Truffle测试中DeployedAddresses引发的VM Revert错误
先复盘一下你的代码和遇到的问题:
你的合约文件 dummycontrat.sol 内容:
pragma solidity ^0.4.17; contract DummyContract { function fetchRandomNumber() public pure returns(uint) { uint res = 10; return res; } }
测试文件 test/TestDummyContract.sol 的截断代码:
pragma solidity ^0.4.17; import "truffle/Assert.sol"; import "truffle/DeployedAddresses.sol"; import "../contracts/dummycontract.sol"; contract TestDummyContract { function testRandomNumberNew() public { DummyContract dummyContra... } }
你遇到的错误是 DeployedAddresses + Error: VM Exception while processing transaction: revert,我整理了几个大概率的解决方向:
先确认合约是否成功部署
Truffle的DeployedAddresses是用来存储已部署合约地址的工具,如果合约没部署成功,这个文件里就没有对应地址,调用时自然会触发revert。你可以:- 运行
truffle migrate --reset重新部署合约,清除旧的部署记录; - 检查部署过程中有没有报错,比如Gas不足、网络连接问题(如果用ganache,要确保节点在运行)。
- 运行
补全并修正测试合约的实例化代码
你的测试代码明显没写完,正确的实例化和测试逻辑应该是这样的:function testRandomNumberNew() public { // 通过DeployedAddresses获取已部署的合约实例 DummyContract dummyContract = DummyContract(DeployedAddresses.DummyContract()); uint expected = 10; uint result = dummyContract.fetchRandomNumber(); Assert.equal(result, expected, "Random number should return 10"); }这里要注意:
DeployedAddresses后面的合约名称要和你定义的DummyContract完全一致(大小写也不能错),Truffle是严格匹配合约名称来生成地址引用的。检查版本和网络配置
- 确保合约和测试文件的Solidity版本声明完全一致(都是
^0.4.17),版本不匹配可能导致隐性的部署或调用错误; - 核对
truffle-config.js(或旧版本的truffle.js)中的网络配置,确保和你的测试节点(比如ganache)的地址、端口完全对应,网络不匹配也会导致无法获取正确的部署地址。
- 确保合约和测试文件的Solidity版本声明完全一致(都是
内容的提问来源于stack exchange,提问作者Siddharth




