防止重入攻击4种方法
CEI模式
// contract_A: holds user's funds
function withdraw() external {
uint userBalance = userBalances[msg.sender];
require(userBalance > 0);
(bool success,) = msg.sender.call{ value: userBalance }("");
require(success,);
userBalances[msg.sender] = 0;
}// contract_B: reentrancy attackreceive() external payable {
if (address(contract_A).balance >= msg.value) {
contract_A.withdraw();
}
}function withdraw() external {
uint userBalance = userBalances[msg.sender];
require(userBalance > 0);
userBalances[msg.sender] = 0;
(bool success,) = msg.sender.call{ value: userBalance }("");
require(success,);
}互斥锁
中间商转发(Pull payment)
Gas Limit
Last updated