Функция возврата не вызывается после изменения типа возврата с void на bool в зависимости - PullRequest
1 голос
/ 24 апреля 2019

Я довольно новый в солидности. Я пытаюсь переопределить атаку реентера.

Я получил эту работу по умному контракту ниже.


// 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.

Изменение заключается только в том, чтобы заставить функцию get () в HoneyPot возвращать тип 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;
  }

}

Пожалуйста, помогите! Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...