为何触发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
相关产品推荐
相关产品推荐

