You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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。你可以:

    1. 运行truffle migrate --reset重新部署合约,清除旧的部署记录;
    2. 检查部署过程中有没有报错,比如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是严格匹配合约名称来生成地址引用的。

  • 检查版本和网络配置

    1. 确保合约和测试文件的Solidity版本声明完全一致(都是^0.4.17),版本不匹配可能导致隐性的部署或调用错误;
    2. 核对truffle-config.js(或旧版本的truffle.js)中的网络配置,确保和你的测试节点(比如ganache)的地址、端口完全对应,网络不匹配也会导致无法获取正确的部署地址。

内容的提问来源于stack exchange,提问作者Siddharth

火山引擎 最新活动