You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何触发VM Exception: revert?ExchangeTest合约调用异常咨询

合约回滚异常排查求助

合约代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ExchangeTest {
   address owner;
   address addr;
   mapping(address => uint256) balancesToken;

   constructor() {
       owner = msg.sender;
       addr = address(this);
   }

   function EthToToken() public payable {
       balancesToken[msg.sender] += msg.value;
   }

   function TokenToEth(uint256 val) public payable {
       require(addr.balance >= val, "Not enougt eth");
       require(msg.sender == owner, "Not a round");
       address sender = msg.sender;
       balancesToken[sender] -= val;
       payable(sender).transfer(val);
   }
}

触发的异常

VM Exception while processing transaction: revert

问题描述

我用web3.py调用上述ExchangeTest合约时触发了这个回滚异常,怀疑是不是因为我没有直接给合约转账/提现,而是通过另一个合约操作导致的?请帮忙排查原因。

可能的原因及排查点

  • 权限校验不通过:TokenToEth函数里有require(msg.sender == owner)的校验。如果是通过其他合约调用,此时msg.sender是中间合约的地址,而非部署合约时的owner外部账户,必然触发这个校验失败,直接回滚。这是跨合约调用时最可能的原因。
  • 合约ETH余额不足:检查调用TokenToEth前,合约地址是否有足够的ETH余额。比如是否先调用过EthToToken向合约转入了对应金额的ETH。
  • 账户代币余额不足:balancesToken[sender] -= val时,如果sender的代币余额小于val,Solidity 0.8及以上版本会自动触发算术溢出回滚,这是语言默认的安全机制,代码里没做额外检查。
  • 跨合约调用的其他问题:如果中间合约调用时,transfer执行失败(比如接收方是合约且fallback函数消耗gas超过2300),也会触发回滚。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:10:38