2.0 KiB
2.0 KiB
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
// 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 IBCTransfers 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
IBCOutMsgqueue (can poll on a certain time interval, or check after each new block, etc) - For any new
IBCOutMsg, buildIBCInMsgand post to destination chain
CLI
- Load relay process
- Execute
IBCOutMsg