events.rst 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. Events
  2. ======
  3. In Solidity, contracts can emit events that signal that changes have occurred. For example, a Solidity
  4. contract could emit a `Deposit` event, or `BetPlaced` in a poker game. These events are stored
  5. in the blockchain transaction log, so they become part of the permanent record. From Solidity's perspective,
  6. you can emit events but you cannot access events on the chain.
  7. Once those events are added to the chain, an off-chain application can listen for events. For example, the Web3.js
  8. interface has a `subscribe()` function. Another is example is
  9. `Hyperledger Burrow <https://hyperledger.github.io/burrow/#/reference/vent>`_
  10. which has a vent command which listens to events and inserts them into a Postgres database.
  11. An event has two parts. First, there is a limited set of topics. Usually there are no more than 3 topics,
  12. and each of those has a fixed length of 32 bytes. They are there so that an application listening for events
  13. can easily filter for particular types of events, without needing to do any decoding. There is also a data
  14. section of variable length bytes, which is ABI encoded. To decode this part, the ABI for the event must be known.
  15. From Solidity's perspective, an event has a name, and zero or more fields. The fields can either be ``indexed`` or
  16. not. ``indexed`` fields are stored as topics, so there can only be a limited number of ``indexed`` fields. The other
  17. fields are stored in the data section of the event. The event name does not need to be unique; just like
  18. functions, they can be overloaded as long as the fields are of different types, or the event has
  19. a different number of arguments.
  20. .. warning::
  21. On Solana, the ``indexed`` event field attribute has no effect. All event attributes will be encoded as data to
  22. be passed for Solana's ``sol_log_data`` system call, regardless if the ``indexed`` keyword is present or not.
  23. This behavior follows what Solana's Anchor framework does.
  24. In Polkadot, the topic fields are always the hash of the value of the field. Ethereum only hashes fields
  25. which do not fit in the 32 bytes. Since a cryptographic hash is used, it is only possible to compare the topic against a
  26. known value.
  27. An event can be declared in a contract, or outside.
  28. .. include:: ../examples/events.sol
  29. :code: solidity
  30. Like function calls, the emit statement can have the fields specified by position, or by field name. Using
  31. field names rather than position may be useful in case the event name is overloaded, since the field names
  32. make it clearer which exact event is being emitted.
  33. .. include:: ../examples/event_positional_fields.sol
  34. :code: solidity
  35. In the transaction log, the first topic of an event is the keccak256 hash of the signature of the
  36. event. The signature is the event name, followed by the fields types in a comma separated list in parentheses. So
  37. the first topic for the second UserModified event would be the keccak256 hash of ``UserModified(address,uint64)``.
  38. You can leave this topic out by declaring the event ``anonymous``. This makes the event slightly smaller (32 bytes
  39. less) and makes it possible to have 4 ``indexed`` fields rather than 3.