Безопасность. Внешние вызовы. Часть 3
Не используйте transfer() или send()
Оба метода используют фиксированное количество газа (2300), как изначально предполагалось для защиты от reentrancy. Однако с одним из последних обновлений (EIP 1884) количество газа в этих функциях может быть увеличено.
Рекомендуется использовать call().
Пример:
// плохо
contract Vulnerable {
function withdraw(uint256 amount) external {
// This forwards 2300 gas, which may not be enough if the recipient
// is a contract and gas costs change.
msg.sender.transfer(amount);
}
}
// хорошо
contract Fixed {
function withdraw(uint256 amount) external {
// This forwards all available gas. Be sure to check the return value!
(bool success, ) = msg.sender.call.value(amount)("");
require(success, "Transfer failed.");
}
}
P.S. call() также не защищает от reentrancy, просто в документации советуют использовать именно его.
#безопасность #externalcall #external
Post #351
159
- 👍 1