90 lines
2.0 KiB
Markdown
90 lines
2.0 KiB
Markdown
# IBC Spec
|
|
|
|
*This is a living document and should be edited as the IBC spec and implementation change*
|
|
|
|
## MVP2
|
|
|
|
IBC module will store its own router for handling custom incoming msgs. `IBCPush` are made for inter-module communication. `IBCRegisterMsg` adds a handler in the router of the module.
|
|
|
|
### IBC Module
|
|
|
|
```golang
|
|
// User facing API
|
|
|
|
type Packet struct {
|
|
Data Payload
|
|
SrcChain string
|
|
DestChain string
|
|
}
|
|
|
|
type Payload interface {
|
|
Type() string
|
|
ValidateBasic() sdk.Error
|
|
}
|
|
|
|
type TransferPayload struct {
|
|
SrcAddr sdk.Address
|
|
DestAddr sdk.Address
|
|
Coins sdk.Coins
|
|
}
|
|
|
|
// Implements sdk.Msg
|
|
type IBCTransferMsg struct {
|
|
Packet
|
|
}
|
|
|
|
// Implements sdk.Msg
|
|
type IBCReceiveMsg struct {
|
|
Packet
|
|
Relayer sdk.Address
|
|
Sequence int64
|
|
}
|
|
|
|
// Internal API
|
|
|
|
type rule struct {
|
|
r string
|
|
f func(sdk.Context, IBCPacket) sdk.Result
|
|
}
|
|
|
|
type Dispatcher struct {
|
|
rules []rule
|
|
}
|
|
|
|
func NewHandler(dispatcher Dispatcher, ibcm IBCMapper) sdk.Handler
|
|
|
|
type IBCMapper struct {
|
|
ibcKey sdk.StoreKey // IngressKey / EgressKey => Value
|
|
// Ingress: Source Chain ID => last income msg's sequence
|
|
// Egress: (Dest chain ID, Msg index) => length / indexed msg
|
|
}
|
|
|
|
type IngressKey struct {
|
|
SrcChain string
|
|
}
|
|
|
|
type EgressKey struct {
|
|
DestChain string
|
|
Index int64
|
|
}
|
|
|
|
// Used by other modules
|
|
func (ibcm IBCMapper) PushPacket(ctx sdk.Context, dest string, payload Payload)
|
|
```
|
|
|
|
`egressKey` stores the outgoing `IBCTransfer`s as a list. Its getter takes an `EgressKey` and returns the length if `egressKey.Index == -1`, an element if `egressKey.Index > 0`.
|
|
|
|
`ingressKey` stores the last income `IBCTransfer`'s sequence. Its getter takes an `IngressKey`.
|
|
|
|
## Relayer
|
|
|
|
**Packets**
|
|
- Connect to 2 Tendermint RPC endpoints
|
|
- Query for IBC outgoing `IBCOutMsg` queue (can poll on a certain time interval, or check after each new block, etc)
|
|
- For any new `IBCOutMsg`, build `IBCInMsg` and post to destination chain
|
|
|
|
## CLI
|
|
|
|
- Load relay process
|
|
- Execute `IBCOutMsg`
|