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 шт):

Автор решения: Mad Jackal

Насколько я понимаю обе функции "маскируют" вызов метода, который в смарт-контракте не описан: receive - для случая, когда в транзакции передается value, fallback - когда нет. Наличие этих функций исключает откат транзакции, если в ней указан несуществующий метод смарт-контракта.

Зачем это нужно? Вот прям сразу не придумаю. Ну, например, переводить на адрес смарт-контракта без указания метода.

→ Ссылка
Автор решения: yaskin

receive выполняется когда на контракт падает эфир, в данном случае при поступлении эфира на контракт выполняется функция buyToken();

fallback определена пустой для защиты от атаки reentrance

→ Ссылка