mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Clarify some subtleties of the fallback function
This commit is contained in:
parent
cbd729957b
commit
88bce877c4
@ -543,9 +543,12 @@ functions match the given function identifier (or if no data was supplied at
|
|||||||
all).
|
all).
|
||||||
|
|
||||||
Furthermore, this function is executed whenever the contract receives plain
|
Furthermore, this function is executed whenever the contract receives plain
|
||||||
Ether (without data). In such a context, there is usually very little gas available to
|
Ether (without data). Additionally, in order to receive Ether, the fallback function
|
||||||
the function call (to be precise, 2300 gas), so it is important to make fallback functions as cheap as
|
must be marked ``payable``. If no such function exists, the contract cannot receive
|
||||||
possible.
|
Ether through regular transactions.
|
||||||
|
|
||||||
|
In such a context, there is usually very little gas available to the function call (to be precise, 2300 gas),
|
||||||
|
so it is important to make fallback functions as cheap as possible.
|
||||||
|
|
||||||
In particular, the following operations will consume more gas than the stipend provided to a fallback function:
|
In particular, the following operations will consume more gas than the stipend provided to a fallback function:
|
||||||
|
|
||||||
@ -556,6 +559,10 @@ In particular, the following operations will consume more gas than the stipend p
|
|||||||
|
|
||||||
Please ensure you test your fallback function thoroughly to ensure the execution cost is less than 2300 gas before deploying a contract.
|
Please ensure you test your fallback function thoroughly to ensure the execution cost is less than 2300 gas before deploying a contract.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Even though the fallback function cannot have arguments, one can still use ``msg.data`` to retrieve
|
||||||
|
any payload supplied with the call.
|
||||||
|
|
||||||
.. warning::
|
.. warning::
|
||||||
Contracts that receive Ether directly (without a function call, i.e. using ``send`` or ``transfer``)
|
Contracts that receive Ether directly (without a function call, i.e. using ``send`` or ``transfer``)
|
||||||
but do not define a fallback function
|
but do not define a fallback function
|
||||||
@ -563,6 +570,14 @@ Please ensure you test your fallback function thoroughly to ensure the execution
|
|||||||
before Solidity v0.4.0). So if you want your contract to receive Ether,
|
before Solidity v0.4.0). So if you want your contract to receive Ether,
|
||||||
you have to implement a fallback function.
|
you have to implement a fallback function.
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
A contract without a payable fallback function can receive Ether as a recipient of a `coinbase transaction` (aka `miner block reward`)
|
||||||
|
or as a destination of a ``selfdestruct``.
|
||||||
|
|
||||||
|
A contract cannot react to such Ether transfers and thus also cannot reject them. This is a design choice of the EVM and Solidity cannot work around it.
|
||||||
|
|
||||||
|
It also means that ``this.balance`` can be higher than the sum of some manual accounting implemented in a contract (i.e. having a counter updated in the fallback function).
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
pragma solidity ^0.4.0;
|
pragma solidity ^0.4.0;
|
||||||
|
@ -137,37 +137,6 @@ Enums are not supported by the ABI, they are just supported by Solidity.
|
|||||||
You have to do the mapping yourself for now, we might provide some help
|
You have to do the mapping yourself for now, we might provide some help
|
||||||
later.
|
later.
|
||||||
|
|
||||||
What is the deal with ``function () { ... }`` inside Solidity contracts? How can a function not have a name?
|
|
||||||
============================================================================================================
|
|
||||||
|
|
||||||
This function is called "fallback function" and it
|
|
||||||
is called when someone just sent Ether to the contract without
|
|
||||||
providing any data or if someone messed up the types so that they tried to
|
|
||||||
call a function that does not exist.
|
|
||||||
|
|
||||||
The default behaviour (if no fallback function is explicitly given) in
|
|
||||||
these situations is to throw an exception.
|
|
||||||
|
|
||||||
If the contract is meant to receive Ether with simple transfers, you
|
|
||||||
should implement the fallback function as
|
|
||||||
|
|
||||||
``function() payable { }``
|
|
||||||
|
|
||||||
Another use of the fallback function is to e.g. register that your
|
|
||||||
contract received ether by using an event.
|
|
||||||
|
|
||||||
*Attention*: If you implement the fallback function take care that it uses as
|
|
||||||
little gas as possible, because ``send()`` will only supply a limited amount.
|
|
||||||
|
|
||||||
Is it possible to pass arguments to the fallback function?
|
|
||||||
==========================================================
|
|
||||||
|
|
||||||
The fallback function cannot take parameters.
|
|
||||||
|
|
||||||
Under special circumstances, you can send data. If you take care
|
|
||||||
that none of the other functions is invoked, you can access the data
|
|
||||||
by ``msg.data``.
|
|
||||||
|
|
||||||
Can state variables be initialized in-line?
|
Can state variables be initialized in-line?
|
||||||
===========================================
|
===========================================
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user