mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Some documentation.
This commit is contained in:
parent
a0ae36ba70
commit
9115a0f525
@ -208,6 +208,48 @@ Restrictions for libraries in comparison to contracts:
|
|||||||
|
|
||||||
(These might be lifted at a later point.)
|
(These might be lifted at a later point.)
|
||||||
|
|
||||||
|
.. _library-selectors:
|
||||||
|
|
||||||
|
Function Signatures and Selectors in Libraries
|
||||||
|
==============================================
|
||||||
|
|
||||||
|
While external calls to public or external library functions are possible, the calling convention for such calls
|
||||||
|
is considered to be internal to Solidity and not the same as specified for the regular :ref:`contract ABI<ABI>`.
|
||||||
|
External library functions support more argument types than external contract functions, for example recursive structs
|
||||||
|
and storage pointers. For that reason, the function signatures used to compute the 4-byte selector are computed
|
||||||
|
following an internal naming schema and arguments of types not supported in the contract ABI use an internal encoding.
|
||||||
|
|
||||||
|
The following identifiers are used for the types in the signatures:
|
||||||
|
|
||||||
|
- Value types, non-storage ``string`` and non-storage ``bytes`` use the same identifiers as in the contract ABI.
|
||||||
|
- Non-storage array types follow the same convention as in the contract ABI, i.e. ``<type>[]`` for dynamic arrays and
|
||||||
|
``<type>[M]`` for fixed-size arrays of ``M`` elements.
|
||||||
|
- Non-storage structs are referred to by their fully qualified name, i.e. ``C.S`` for ``contract C { struct S { ... } }``.
|
||||||
|
- Storage pointer types use the type identifier of their corresponding non-storage type, but append a single space
|
||||||
|
followed by ``storage`` to it.
|
||||||
|
|
||||||
|
The argument encoding is the same as for the regular contract ABI, except for storage pointers, which are encoded as a
|
||||||
|
``uint256`` value referring to the storage slot to which they point.
|
||||||
|
|
||||||
|
Similarly to the contract ABI, the selector consists of the first four bytes of the Keccak256-hash of the signature.
|
||||||
|
Its value can be obtained from Solidity using the ``.selector`` member as follows:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
pragma solidity >0.5.13 <0.7.0;
|
||||||
|
|
||||||
|
library L {
|
||||||
|
function f(uint256) external {}
|
||||||
|
}
|
||||||
|
|
||||||
|
contract C {
|
||||||
|
function g() public pure returns (bytes4) {
|
||||||
|
return L.f.selector;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. _call-protection:
|
.. _call-protection:
|
||||||
|
|
||||||
Call Protection For Libraries
|
Call Protection For Libraries
|
||||||
|
Loading…
Reference in New Issue
Block a user