## Description Closes: #9404 --- ### Author Checklist *All items are required. Please add a note to the item if the item is not applicable and please add links to any relevant follow up issues.* I have... - [x] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] added `!` to the type prefix if API or client breaking change - [x] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting)) - [x] provided a link to the relevant issue or specification - [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules) - [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing) - [ ] added a changelog entry to `CHANGELOG.md` - [ ] included comments for [documenting Go code](https://blog.golang.org/godoc) - [ ] updated the relevant documentation or specification - [x] reviewed "Files changed" and left comments if necessary - [x] confirmed all CI checks have passed ### Reviewers Checklist *All items are required. Please add a note if the item is not applicable and please add your handle next to the items reviewed if you only reviewed selected items.* I have... - [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] confirmed `!` in the type prefix if API or client breaking change - [ ] confirmed all author checklist items have been addressed - [ ] reviewed state machine logic - [ ] reviewed API design and naming - [ ] reviewed documentation is accurate - [ ] reviewed tests and test coverage - [ ] manually tested (if applicable)
48 lines
2.5 KiB
Markdown
48 lines
2.5 KiB
Markdown
<!--
|
|
order: 4
|
|
-->
|
|
|
|
# Relayer
|
|
|
|
## Prerequisites Readings
|
|
|
|
* [IBC Overview](./overview.md) {prereq}
|
|
* [Events](https://github.com/cosmos/cosmos-sdk/blob/master/docs/core/events.md) {prereq}
|
|
|
|
## Events
|
|
|
|
Events are emitted for every transaction processed by the base application to indicate the execution
|
|
of some logic clients may want to be aware of. This is extremely useful when relaying IBC packets.
|
|
Any message that uses IBC will emit events for the corresponding TAO logic executed as defined in
|
|
the [IBC events spec](https://github.com/cosmos/ibc-go/blob/main/modules/core/spec/06_events.md).
|
|
|
|
In the Cosmos SDK, it can be assumed that for every message there is an event emitted with the type `message`,
|
|
attribute key `action`, and an attribute value representing the type of message sent
|
|
(`channel_open_init` would be the attribute value for `MsgChannelOpenInit`). If a relayer queries
|
|
for transaction events, it can split message events using this event Type/Attribute Key pair.
|
|
|
|
The Event Type `message` with the Attribute Key `module` may be emitted multiple times for a single
|
|
message due to application callbacks. It can be assumed that any TAO logic executed will result in
|
|
a module event emission with the attribute value `ibc_<submodulename>` (02-client emits `ibc_client`).
|
|
|
|
### Subscribing with Tendermint
|
|
|
|
Calling the Tendermint RPC method `Subscribe` via [Tendermint's Websocket](https://docs.tendermint.com/master/rpc/) will return events using
|
|
Tendermint's internal representation of them. Instead of receiving back a list of events as they
|
|
were emitted, Tendermint will return the type `map[string][]string` which maps a string in the
|
|
form `<event_type>.<attribute_key>` to `attribute_value`. This causes extraction of the event
|
|
ordering to be non-trivial, but still possible.
|
|
|
|
A relayer should use the `message.action` key to extract the number of messages in the transaction
|
|
and the type of IBC transactions sent. For every IBC transaction within the string array for
|
|
`message.action`, the necessary information should be extracted from the other event fields. If
|
|
`send_packet` appears at index 2 in the value for `message.action`, a relayer will need to use the
|
|
value at index 2 of the key `send_packet.packet_sequence`. This process should be repeated for each
|
|
piece of information needed to relay a packet.
|
|
|
|
## Example Implementations
|
|
|
|
* [Golang Relayer](https://github.com/iqlusioninc/relayer)
|
|
* [Hermes](https://github.com/informalsystems/ibc-rs/tree/master/relayer)
|
|
* [Typescript Relayer](https://github.com/confio/ts-relayer)
|