检查/效果/交互模式是否可以用于安全地向用户退款(代替单独的提款功能(?
EG在投标系统的情况下,如果用户2出价高于用户1,而用户1收到了他们的退款,那么支票/效果/模式是否足够安全,可以将用户1的钱退回?
例如,类似的东西
contract auction {
address highestBidder;
uint highestBid;
function bid() payable external {
require(msg.value >= highestBid);
prevHighestBidder = highestBidder
prevHighestBid = highestBid
highestBidder = msg.sender;
highestBid = msg.value;
(bool success, ) = prevHighestBidder.call.value(prevHighestBid)("");
require(success, "Transfer failed.")
}
}
我知道创建一个单独的提款功能是首选,但我希望能降低用户的汽油成本。
如果接收方(prevHighestBidder
(是一个拒绝交易的合同,该怎么办?这将有效地破坏你的游戏,因为在他们之后没有人能够成功地调用bid()
函数。
他们的合同可能和一样简单
contract BlockBids {
function callBid() payable {
// call the bid() function with value
address(<yourContract>).call{value: msg.value}('0x1998aeef');
}
receive () external payable {
revert();
}
}
我的建议是NOT检查prevHighestBidder
是否收到ETH。或者添加一个后备机制,在接收者拒绝交易的情况下将ETH提取到您的地址,以便您可以在他们证明获胜地址的所有权后将其发送给他们(例如,通过签署消息(。