33 lines
1.8 KiB
Markdown
33 lines
1.8 KiB
Markdown
# App Data
|
|
|
|
The `appdata` package defines the basic types for streaming blockchain event and state data to external listeners, with a specific focus on supporting logical decoding and indexing of state.
|
|
|
|
A blockchain data source should accept a `Listener` instance and invoke the provided callbacks in the correct order. A downstream listener should provide a `Listener` instance and perform operations based on the data passed to its callbacks.
|
|
|
|
## `Listener` Callback Order
|
|
|
|
`Listener` callbacks should be called in this order
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
actor Source
|
|
actor Target
|
|
Source ->> Target: Initialize
|
|
Source -->> Target: InitializeModuleSchema
|
|
loop Block
|
|
Source ->> Target: StartBlock
|
|
Source ->> Target: OnBlockHeader
|
|
Source -->> Target: OnTx
|
|
Source -->> Target: OnEvent
|
|
Source -->> Target: OnKVPair
|
|
Source -->> Target: OnObjectUpdate
|
|
Source ->> Target: Commit
|
|
end
|
|
```
|
|
|
|
`Initialize` must be called before any other method and should only be invoked once. `InitializeModuleSchema` should be called at most once for every module with logical data.
|
|
|
|
Sources will generally only call `InitializeModuleSchema` and `OnObjectUpdate` if they have native logical decoding capabilities. Usually, the indexer framework will provide this functionality based on `OnKVPair` data and `schema.HasModuleCodec` implementations.
|
|
|
|
`StartBlock` and `OnBlockHeader` should be called only once at the beginning of a block, and `Commit` should be called only once at the end of a block. The `OnTx`, `OnEvent`, `OnKVPair` and `OnObjectUpdate` must be called after `OnBlockHeader`, may be called multiple times within a block and indexers should not assume that the order is logical unless `InitializationData.HasEventAlignedWrites` is true.
|