Solidity v0.6.0. Fallback функции. Зачем они нужны?
После прочтения документации по Solidity v0.6.0 docs, я так и не понял смысл fallback функций. Прочитал, что она была разделена на 2 функции: fallback() external payable и receive() external payable. Что они анонимны, и не принимают никаких параметров и подавляющем большинстве случаев для получения средств используется receive() external payable. Можете плз обьяснить на примере моего кода, какие-то юзабельные кейсы для этих функций, чтобы понять все их плюшки, а то как-то все в вакууме, но понимаю что это важный концепт. Не понятен даже смысл функции receive() external payable в которой я стучусь к методу buyToken(), зачем она нужна, если я в Remix стучусь к buyToken() напрямую, минуя receive() external payable так как она не видна и анонимна.
pragma solidity ^0.7.0;
// SPDX-License-Identifier: MIT
contract BuyToken {
mapping(address => uint256) public balances;
address payable wallet;
event Purchase(
address indexed buyer,
uint256 amount
);
constructor(address payable _wallet) {
wallet = _wallet;
}
fallback() external payable {
}
receive() external payable {
buyToken();
}
function buyToken() public payable {
balances[msg.sender] += 1;
wallet.transfer(msg.value);
emit Purchase(msg.sender, 1);
}
}
Ответы (2 шт):
Насколько я понимаю обе функции "маскируют" вызов метода, который в смарт-контракте не описан: receive - для случая, когда в транзакции передается value, fallback - когда нет. Наличие этих функций исключает откат транзакции, если в ней указан несуществующий метод смарт-контракта.
Зачем это нужно? Вот прям сразу не придумаю. Ну, например, переводить на адрес смарт-контракта без указания метода.
receive выполняется когда на контракт падает эфир, в данном случае при поступлении эфира на контракт выполняется функция buyToken();
fallback определена пустой для защиты от атаки reentrance