mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #1220 from ethereum/doc-updates
Documentation updates
This commit is contained in:
		
						commit
						3bcf0909af
					
				| @ -20,6 +20,9 @@ Contracts can be created "from outside" or from Solidity contracts. | |||||||
| When a contract is created, its constructor (a function with the same | When a contract is created, its constructor (a function with the same | ||||||
| name as the contract) is executed once. | name as the contract) is executed once. | ||||||
| 
 | 
 | ||||||
|  | A constructor is optional. Only one constructor is allowed and this means | ||||||
|  | overloading is not supported. | ||||||
|  | 
 | ||||||
| From ``web3.js``, i.e. the JavaScript | From ``web3.js``, i.e. the JavaScript | ||||||
| API, this is done as follows:: | API, this is done as follows:: | ||||||
| 
 | 
 | ||||||
| @ -421,9 +424,9 @@ change by overriding). | |||||||
| 
 | 
 | ||||||
| .. index:: ! constant | .. index:: ! constant | ||||||
| 
 | 
 | ||||||
| ********** | ************************ | ||||||
| Constants | Constant State Variables | ||||||
| ********** | ************************ | ||||||
| 
 | 
 | ||||||
| State variables can be declared as constant (this is not yet implemented | State variables can be declared as constant (this is not yet implemented | ||||||
| for array and struct types and not possible for mapping types). | for array and struct types and not possible for mapping types). | ||||||
| @ -442,6 +445,27 @@ for these variables and every occurrence is replaced by their constant value. | |||||||
| 
 | 
 | ||||||
| The value expression can only contain integer arithmetics. | The value expression can only contain integer arithmetics. | ||||||
| 
 | 
 | ||||||
|  | ****************** | ||||||
|  | Constant Functions | ||||||
|  | ****************** | ||||||
|  | 
 | ||||||
|  | Functions can be declared constant. These functions promise not to modify the state. | ||||||
|  | 
 | ||||||
|  | :: | ||||||
|  | 
 | ||||||
|  |     pragma solidity ^0.4.0; | ||||||
|  | 
 | ||||||
|  |     contract C { | ||||||
|  |         function f(uint a, uint b) constant returns (uint) { | ||||||
|  |             return a * (b + 42); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | .. note:: | ||||||
|  |   Accessor methods are marked constant. | ||||||
|  | 
 | ||||||
|  | .. warning:: | ||||||
|  |   The compiler does not enforce yet that a constant method is not modifying state. | ||||||
| 
 | 
 | ||||||
| .. index:: ! fallback function, function;fallback | .. index:: ! fallback function, function;fallback | ||||||
| 
 | 
 | ||||||
| @ -976,7 +1000,7 @@ are all compiled as calls (``DELEGATECALL``) to an external | |||||||
| contract/library. If you use libraries, take care that an | contract/library. If you use libraries, take care that an | ||||||
| actual external function call is performed. | actual external function call is performed. | ||||||
| ``msg.sender``, ``msg.value`` and ``this`` will retain their values | ``msg.sender``, ``msg.value`` and ``this`` will retain their values | ||||||
| in this call, though (prior to Homestead, ``msg.sender`` and | in this call, though (prior to Homestead, because of the use of `CALLCODE`, ``msg.sender`` and | ||||||
| ``msg.value`` changed, though). | ``msg.value`` changed, though). | ||||||
| 
 | 
 | ||||||
| The following example shows how to use memory types and | The following example shows how to use memory types and | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ Expressions and Control Structures | |||||||
| Control Structures | Control Structures | ||||||
| =================== | =================== | ||||||
| 
 | 
 | ||||||
| Most of the control structures from C/JavaScript are available in Solidity | Most of the control structures from C or JavaScript are available in Solidity | ||||||
| except for ``switch`` and ``goto``. So | except for ``switch`` and ``goto``. So | ||||||
| there is: ``if``, ``else``, ``while``, ``for``, ``break``, ``continue``, ``return``, ``? :``, with | there is: ``if``, ``else``, ``while``, ``for``, ``break``, ``continue``, ``return``, ``? :``, with | ||||||
| the usual semantics known from C or JavaScript. | the usual semantics known from C or JavaScript. | ||||||
| @ -785,7 +785,7 @@ Conventions in Solidity | |||||||
| 
 | 
 | ||||||
| In contrast to EVM assembly, Solidity knows types which are narrower than 256 bits, | In contrast to EVM assembly, Solidity knows types which are narrower than 256 bits, | ||||||
| e.g. ``uint24``. In order to make them more efficient, most arithmetic operations just | e.g. ``uint24``. In order to make them more efficient, most arithmetic operations just | ||||||
| treat them as 256 bit numbers and the higher-order bits are only cleaned at the | treat them as 256-bit numbers and the higher-order bits are only cleaned at the | ||||||
| point where it is necessary, i.e. just shortly before they are written to memory | point where it is necessary, i.e. just shortly before they are written to memory | ||||||
| or before comparisons are performed. This means that if you access such a variable | or before comparisons are performed. This means that if you access such a variable | ||||||
| from within inline assembly, you might have to manually clean the higher order bits | from within inline assembly, you might have to manually clean the higher order bits | ||||||
|  | |||||||
| @ -9,33 +9,12 @@ This list was originally compiled by `fivedogit <mailto:fivedogit@gmail.com>`_. | |||||||
| Basic Questions | Basic Questions | ||||||
| *************** | *************** | ||||||
| 
 | 
 | ||||||
| What is Solidity? | Example contracts | ||||||
| ================= | ================= | ||||||
| 
 | 
 | ||||||
| Solidity is the DEV-created (i.e. Ethereum Foundation-created), |  | ||||||
| Javascript-inspired language that can be used to create smart contracts |  | ||||||
| on the Ethereum blockchain. There are other |  | ||||||
| languages you can use as well (LLL, Serpent, etc). The main points in |  | ||||||
| favour of Solidity is that it is statically typed and offers many |  | ||||||
| advanced features like inheritance, libraries, complex |  | ||||||
| user-defined types and a bytecode optimizer. |  | ||||||
| 
 |  | ||||||
| Solidity contracts can be compiled a few different ways (see below) and the |  | ||||||
| resulting output can be cut/pasted into a geth console to deploy them to the |  | ||||||
| Ethereum blockchain. |  | ||||||
| 
 |  | ||||||
| There are some `contract examples <https://github.com/fivedogit/solidity-baby-steps/tree/master/contracts/>`_ by fivedogit and | There are some `contract examples <https://github.com/fivedogit/solidity-baby-steps/tree/master/contracts/>`_ by fivedogit and | ||||||
| there should be a `test contract <https://github.com/ethereum/solidity/blob/develop/test/libsolidity/SolidityEndToEndTest.cpp>`_ for every single feature of Solidity. | there should be a `test contract <https://github.com/ethereum/solidity/blob/develop/test/libsolidity/SolidityEndToEndTest.cpp>`_ for every single feature of Solidity. | ||||||
| 
 | 
 | ||||||
| How do I compile contracts? |  | ||||||
| =========================== |  | ||||||
| 
 |  | ||||||
| Probably the fastest way is the `online compiler <https://ethereum.github.io/browser-solidity/>`_. |  | ||||||
| 
 |  | ||||||
| You can also use the ``solc`` binary which comes with cpp-ethereum to compile |  | ||||||
| contracts or an emerging option is to use Mix, the IDE. |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| Create and publish the most basic contract possible | Create and publish the most basic contract possible | ||||||
| =================================================== | =================================================== | ||||||
| 
 | 
 | ||||||
| @ -71,13 +50,6 @@ several blockchain explorers. | |||||||
| Contracts on the blockchain should have their original source | Contracts on the blockchain should have their original source | ||||||
| code published if they are to be used by third parties. | code published if they are to be used by third parties. | ||||||
| 
 | 
 | ||||||
| Does ``selfdestruct()`` free up space in the blockchain? |  | ||||||
| ======================================================== |  | ||||||
| 
 |  | ||||||
| It removes the contract bytecode and storage from the current block |  | ||||||
| into the future, but since the blockchain stores every single block (i.e. |  | ||||||
| all history), this will not actually free up space on full/archive nodes. |  | ||||||
| 
 |  | ||||||
| Create a contract that can be killed and return funds | Create a contract that can be killed and return funds | ||||||
| ===================================================== | ===================================================== | ||||||
| 
 | 
 | ||||||
| @ -113,32 +85,6 @@ Use a non-constant function (req ``sendTransaction``) to increment a variable in | |||||||
| 
 | 
 | ||||||
| See `value_incrementer.sol <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/20_value_incrementer.sol>`_. | See `value_incrementer.sol <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/20_value_incrementer.sol>`_. | ||||||
| 
 | 
 | ||||||
| Get contract address in Solidity |  | ||||||
| ================================ |  | ||||||
| 
 |  | ||||||
| Short answer: The global variable ``this`` is the contract address. |  | ||||||
| 
 |  | ||||||
| See `basic_info_getter <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/15_basic_info_getter.sol>`_. |  | ||||||
| 
 |  | ||||||
| Long answer: ``this`` is a variable representing the current contract. |  | ||||||
| Its type is the type of the contract. Since any contract type basically inherits from the |  | ||||||
| ``address`` type, ``this`` is always convertible to ``address`` and in this case contains |  | ||||||
| its own address. |  | ||||||
| 
 |  | ||||||
| What is the difference between a function marked ``constant`` and one that is not? |  | ||||||
| ================================================================================== |  | ||||||
| 
 |  | ||||||
| ``constant`` functions can perform some action and return a value, but cannot |  | ||||||
| change state (this is not yet enforced by the compiler). In other words, a |  | ||||||
| constant function cannot save or update any variables within the contract or wider |  | ||||||
| blockchain. These functions are called using ``c.someFunction(...)`` from |  | ||||||
| geth or any other web3.js environment. |  | ||||||
| 
 |  | ||||||
| "non-constant" functions (those lacking the ``constant`` specifier) must be called |  | ||||||
| with ``c.someMethod.sendTransaction({from:eth.accounts[x], gas: 1000000});`` |  | ||||||
| That is, because they can change state, they have to have a gas |  | ||||||
| payment sent along to get the work done. |  | ||||||
| 
 |  | ||||||
| Get a contract to return its funds to you (not using ``selfdestruct(...)``). | Get a contract to return its funds to you (not using ``selfdestruct(...)``). | ||||||
| ============================================================================ | ============================================================================ | ||||||
| 
 | 
 | ||||||
| @ -146,52 +92,6 @@ This example demonstrates how to send funds from a contract to an address. | |||||||
| 
 | 
 | ||||||
| See `endowment_retriever <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/30_endowment_retriever.sol>`_. | See `endowment_retriever <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/30_endowment_retriever.sol>`_. | ||||||
| 
 | 
 | ||||||
| What is a ``mapping`` and how do we use them? |  | ||||||
| ============================================= |  | ||||||
| 
 |  | ||||||
| A mapping is very similar to a K->V hashmap. |  | ||||||
| If you have a state variable of type ``mapping (string -> uint) x;``, then you can |  | ||||||
| access the value by ``x["somekeystring"]``. |  | ||||||
| 
 |  | ||||||
| How can I get the length of a ``mapping``? |  | ||||||
| ========================================== |  | ||||||
| 
 |  | ||||||
| Mappings are a rather low-level data structure. It does not store the keys |  | ||||||
| and it is not possible to know which or how many values are "set". Actually, |  | ||||||
| all values to all possible keys are set by default, they are just |  | ||||||
| initialised with the zero value. |  | ||||||
| 
 |  | ||||||
| In this sense, the attribute ``length`` for a mapping does not really apply. |  | ||||||
| 
 |  | ||||||
| If you want to have a "sized mapping", you can use the iterable mapping |  | ||||||
| (see below) or just a dynamically-sized array of structs. |  | ||||||
| 
 |  | ||||||
| Are ``mapping``'s iterable? |  | ||||||
| =========================== |  | ||||||
| 
 |  | ||||||
| Mappings themselves are not iterable, but you can use a higher-level |  | ||||||
| datastructure on top of it, for example the `iterable mapping <https://github.com/ethereum/dapp-bin/blob/master/library/iterable_mapping.sol>`_. |  | ||||||
| 
 |  | ||||||
| Can I put arrays inside of a ``mapping``? How do I make a ``mapping`` of a ``mapping``? |  | ||||||
| ======================================================================================= |  | ||||||
| 
 |  | ||||||
| Mappings are already syntactically similar to arrays as they are, therefore it doesn't make much sense to store an array in them. Rather what you should do is create a mapping of a mapping. |  | ||||||
| 
 |  | ||||||
| An example of this would be:: |  | ||||||
| 
 |  | ||||||
|     contract C { |  | ||||||
|         struct myStruct { |  | ||||||
|             uint someNumber; |  | ||||||
|             string someString; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         mapping(uint => mapping(string => myStruct)) myDynamicMapping; |  | ||||||
| 
 |  | ||||||
|         function storeInMapping() { |  | ||||||
|             myDynamicMapping[1]["Foo"] = myStruct(2, "Bar"); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| Can you return an array or a ``string`` from a solidity function call? | Can you return an array or a ``string`` from a solidity function call? | ||||||
| ====================================================================== | ====================================================================== | ||||||
| 
 | 
 | ||||||
| @ -223,61 +123,6 @@ Example:: | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| What are ``event``'s and why do we need them? |  | ||||||
| ============================================= |  | ||||||
| 
 |  | ||||||
| Let us suppose that you need a contract to alert the outside world when |  | ||||||
| something happens. The contract can fire an event, which can be listened to |  | ||||||
| from web3 (inside geth or a web application). The main advantage of events |  | ||||||
| is that they are stored in a special way on the blockchain so that it |  | ||||||
| is very easy to search for them. |  | ||||||
| 
 |  | ||||||
| What are the different function visibilities? |  | ||||||
| ============================================= |  | ||||||
| 
 |  | ||||||
| The visibility specifiers do not only change the visibility but also |  | ||||||
| the way functions can be called. In general, functions in the |  | ||||||
| same contract can also be called internally (which is cheaper |  | ||||||
| and allows for memory types to be passed by reference). This |  | ||||||
| is done if you just use ``f(1,2)``. If you use ``this.f(1,2)`` |  | ||||||
| or ``otherContract.f(1,2)``, the function is called externally. |  | ||||||
| 
 |  | ||||||
| Internal function calls have the advantage that you can use |  | ||||||
| all Solidity types as parameters, but you have to stick to the |  | ||||||
| simpler ABI types for external calls. |  | ||||||
| 
 |  | ||||||
| * ``external``: all, only externally |  | ||||||
| 
 |  | ||||||
| * ``public``: all (this is the default), externally and internally |  | ||||||
| 
 |  | ||||||
| * ``internal``: only this contract and contracts deriving from it, only internally |  | ||||||
| 
 |  | ||||||
| * ``private``: only this contract, only internally |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| Do contract constructors have to be publicly visible? |  | ||||||
| ===================================================== |  | ||||||
| 
 |  | ||||||
| You can use the visibility specifiers, but they do not yet have any effect. |  | ||||||
| The constructor is removed from the contract code once it is deployed, |  | ||||||
| 
 |  | ||||||
| Can a contract have multiple constructors? |  | ||||||
| ========================================== |  | ||||||
| 
 |  | ||||||
| No, a contract can have only one constructor. |  | ||||||
| 
 |  | ||||||
| More specifically, it can only have one function whose name matches |  | ||||||
| that of the constructor. |  | ||||||
| 
 |  | ||||||
| Having multiple constructors with different number of arguments |  | ||||||
| or argument types, as it is possible in other languages |  | ||||||
| is not allowed in Solidity. |  | ||||||
| 
 |  | ||||||
| Is a constructor required? |  | ||||||
| ========================== |  | ||||||
| 
 |  | ||||||
| No. If there is no constructor, a generic one without arguments and no actions will be used. |  | ||||||
| 
 |  | ||||||
| Are timestamps (``now,`` ``block.timestamp``) reliable? | Are timestamps (``now,`` ``block.timestamp``) reliable? | ||||||
| ======================================================= | ======================================================= | ||||||
| 
 | 
 | ||||||
| @ -363,14 +208,6 @@ Examples:: | |||||||
|         C c = new C(); |         C c = new C(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| What is the ``modifier`` keyword? |  | ||||||
| ================================= |  | ||||||
| 
 |  | ||||||
| Modifiers are a way to prepend or append code to a function in order |  | ||||||
| to add guards, initialisation or cleanup functionality in a concise way. |  | ||||||
| 
 |  | ||||||
| For examples, see the `features.sol <https://github.com/ethereum/dapp-bin/blob/master/library/features.sol>`_. |  | ||||||
| 
 |  | ||||||
| How do structs work? | How do structs work? | ||||||
| ==================== | ==================== | ||||||
| 
 | 
 | ||||||
| @ -590,12 +427,6 @@ The correct way to do this is the following:: | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| Can a regular (i.e. non-contract) ethereum account be closed permanently like a contract can? |  | ||||||
| ============================================================================================= |  | ||||||
| 
 |  | ||||||
| No. Non-contract accounts "exist" as long as the private key is known by |  | ||||||
| someone or can be generated in some way. |  | ||||||
| 
 |  | ||||||
| What is the difference between ``bytes`` and ``byte[]``? | What is the difference between ``bytes`` and ``byte[]``? | ||||||
| ======================================================== | ======================================================== | ||||||
| 
 | 
 | ||||||
| @ -641,16 +472,6 @@ Use the constructor. Anything inside it will be executed when the contract is fi | |||||||
| 
 | 
 | ||||||
| See `replicator.sol <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/50_replicator.sol>`_. | See `replicator.sol <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/50_replicator.sol>`_. | ||||||
| 
 | 
 | ||||||
| Can a contract create another contract? |  | ||||||
| ======================================= |  | ||||||
| 
 |  | ||||||
| Yes, see `replicator.sol <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/50_replicator.sol>`_. |  | ||||||
| 
 |  | ||||||
| Note that the full code of the created contract has to be included in the creator contract. |  | ||||||
| This also means that cyclic creations are not possible (because the contract would have |  | ||||||
| to contain its own code) - at least not in a general way. |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| How do you create 2-dimensional arrays? | How do you create 2-dimensional arrays? | ||||||
| ======================================= | ======================================= | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,8 +1,12 @@ | |||||||
| Solidity | Solidity | ||||||
| ======== | ======== | ||||||
| 
 | 
 | ||||||
| Solidity is a high-level language whose syntax is similar to that of JavaScript | Solidity is a contract-oriented, high-level language whose syntax is similar to that of JavaScript | ||||||
| and it is designed to compile to code for the Ethereum Virtual Machine. | and it is designed to target the Ethereum Virtual Machine. | ||||||
|  | 
 | ||||||
|  | Solidity is statically typed, supports inheritance, libraries and complex | ||||||
|  | user-defines types among other features. | ||||||
|  | 
 | ||||||
| As you will see, it is possible to create contracts for voting, | As you will see, it is possible to create contracts for voting, | ||||||
| crowdfunding, blind auctions, multi-signature wallets and more. | crowdfunding, blind auctions, multi-signature wallets and more. | ||||||
| 
 | 
 | ||||||
| @ -16,7 +20,7 @@ Useful links | |||||||
| 
 | 
 | ||||||
| * `Ethereum <https://ethereum.org>`_ | * `Ethereum <https://ethereum.org>`_ | ||||||
| 
 | 
 | ||||||
| * `Changelog <https://github.com/ethereum/wiki/wiki/Solidity-Changelog>`_ | * `Changelog <https://github.com/ethereum/solidity/blob/develop/Changelog.md>`_ | ||||||
| 
 | 
 | ||||||
| * `Story Backlog <https://www.pivotaltracker.com/n/projects/1189488>`_ | * `Story Backlog <https://www.pivotaltracker.com/n/projects/1189488>`_ | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ Installing Solidity | |||||||
| Versioning | Versioning | ||||||
| ========== | ========== | ||||||
| 
 | 
 | ||||||
| Solidity versions follow `semantic versioning <https://semver.org>` and in addition to | Solidity versions follow `semantic versioning <https://semver.org>`_ and in addition to | ||||||
| releases, **nightly development builds** are also made available.  The nightly builds | releases, **nightly development builds** are also made available.  The nightly builds | ||||||
| are not guaranteed to be working and despite best efforts they might contain undocumented | are not guaranteed to be working and despite best efforts they might contain undocumented | ||||||
| and/or broken changes. We recommend to use the latest release. Package installers below | and/or broken changes. We recommend to use the latest release. Package installers below | ||||||
|  | |||||||
| @ -455,13 +455,19 @@ receives the address of the new contract on the stack. | |||||||
| 
 | 
 | ||||||
| .. index:: selfdestruct | .. index:: selfdestruct | ||||||
| 
 | 
 | ||||||
| ``selfdestruct`` | Self-destruct | ||||||
| ================ | ============= | ||||||
| 
 | 
 | ||||||
| The only possibility that code is removed from the blockchain is | The only possibility that code is removed from the blockchain is | ||||||
| when a contract at that address performs the ``selfdestruct`` operation. | when a contract at that address performs the ``selfdestruct`` operation. | ||||||
| The remaining Ether stored at that address is sent to a designated | The remaining Ether stored at that address is sent to a designated | ||||||
| target and then the storage and code is removed. | target and then the storage and code is removed from the state. | ||||||
| 
 | 
 | ||||||
| Note that even if a contract's code does not contain a call to ``selfdestruct``, | .. warning:: Even if a contract's code does not contain a call to ``selfdestruct``, | ||||||
| it can still perform that operation using ``delegatecall`` or ``callcode``. |   it can still perform that operation using ``delegatecall`` or ``callcode``. | ||||||
|  | 
 | ||||||
|  | .. note:: The pruning of old contracts may or may not be implemented by Ethereum | ||||||
|  |   clients. Additionally, archive nodes could choose to keep the contract storage | ||||||
|  |   and code indefinitely. | ||||||
|  | 
 | ||||||
|  | .. note:: Currently **external accounts** cannot be removed from the state. | ||||||
|  | |||||||
| @ -61,6 +61,7 @@ Layout in Memory | |||||||
| **************** | **************** | ||||||
| 
 | 
 | ||||||
| Solidity reserves three 256-bit slots: | Solidity reserves three 256-bit slots: | ||||||
|  | 
 | ||||||
| -  0 - 64: scratch space for hashing methods | -  0 - 64: scratch space for hashing methods | ||||||
| - 64 - 96: currently allocated memory size (aka. free memory pointer) | - 64 - 96: currently allocated memory size (aka. free memory pointer) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -371,6 +371,9 @@ So ``bytes`` should always be preferred over ``byte[]`` because it is cheaper. | |||||||
|     that you are accessing the low-level bytes of the UTF-8 representation, |     that you are accessing the low-level bytes of the UTF-8 representation, | ||||||
|     and not the individual characters! |     and not the individual characters! | ||||||
| 
 | 
 | ||||||
|  | It is possible to mark arrays ``public`` and have Solidity create an accessor. | ||||||
|  | The numeric index will become a required parameter for the accessor. | ||||||
|  | 
 | ||||||
| .. index:: ! array;allocating, new | .. index:: ! array;allocating, new | ||||||
| 
 | 
 | ||||||
| Allocating Memory Arrays | Allocating Memory Arrays | ||||||
| @ -617,6 +620,36 @@ Because of this, mappings do not have a length or a concept of a key or value be | |||||||
| Mappings are only allowed for state variables (or as storage reference types | Mappings are only allowed for state variables (or as storage reference types | ||||||
| in internal functions). | in internal functions). | ||||||
| 
 | 
 | ||||||
|  | It is possible to mark mappings ``public`` and have Solidity create an accessor. | ||||||
|  | The ``_KeyType`` will become a required parameter for the accessor and it will | ||||||
|  | return ``_ValueType``. | ||||||
|  | 
 | ||||||
|  | The ``_ValueType`` can be a mapping too. The accessor will have one parameter | ||||||
|  | for each ``_KeyType``, recursively. | ||||||
|  | 
 | ||||||
|  | :: | ||||||
|  | 
 | ||||||
|  |     pragma solidity ^0.4.0; | ||||||
|  | 
 | ||||||
|  |     contract MappingExample { | ||||||
|  |         mapping(address => uint) public balances; | ||||||
|  | 
 | ||||||
|  |         function update(uint newBalance) { | ||||||
|  |             balances[msg.sender] = newBalance; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     contract MappingUser { | ||||||
|  |         function f() returns (uint) { | ||||||
|  |             return MappingExample(<address>).balances(this); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .. note:: | ||||||
|  |   Mappings are not iterable, but it is possible to implement a data structure on top of them. | ||||||
|  |   For an example, see `iterable mapping <https://github.com/ethereum/dapp-bin/blob/master/library/iterable_mapping.sol>`_. | ||||||
|  | 
 | ||||||
| .. index:: assignment, ! delete, lvalue | .. index:: assignment, ! delete, lvalue | ||||||
| 
 | 
 | ||||||
| Operators Involving LValues | Operators Involving LValues | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user