add basic components

This commit is contained in:
mossid 2018-03-14 13:53:26 +01:00
parent 1cb795ba73
commit 7049025f87
3 changed files with 121 additions and 9 deletions

View File

@ -1,6 +1,8 @@
package ibc
import (
"reflect"
sdk "github.com/cosmos/cosmos-sdk/types"
)
@ -11,6 +13,9 @@ func NewHandler(ibcm IBCMapper) sdk.Handler {
return handleIBCTransferMsg(ctx, ibcm, msg)
case IBCReceiveMsg:
return handleIBCReceiveMsg(ctx, ibcm, msg)
default:
errMsg := "Unrecognized IBC Msg type: " + reflect.TypeOf(msg).Name()
return sdk.ErrUnknownRequest(errMsg).Result()
}
}
}
@ -21,5 +26,15 @@ func handleIBCTransferMsg(ctx sdk.Context, ibcm IBCMapper, msg IBCTransferMsg) s
}
func handleIBCReceiveMsg(ctx sdk.Context, ibcm IBCMapper, msg IBCReceiveMsg) sdk.Result {
seq := ibc.IngressSequence(packet.SrcChain)
packet := msg.IBCPacket
seq := ibcm.GetIngressSequence(ctx, packet.SrcChain)
if msg.Sequence != seq {
return sdk.Result{} // error
}
ibcm.SetIngressSequence(ctx, packet.SrcChain, seq+1)
// handle packet
// packet.Handle(ctx)...
return sdk.Result{}
}

View File

@ -4,22 +4,92 @@ import (
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
wire "github.com/cosmos/cosmos-sdk/wire"
)
type IBCMapper struct {
ibcKey sdk.StoreKey
cdc *wire.Codec
}
func NewIBCMapper(ibcKey sdk.StoreKey) IBCMapper {
cdc := wire.NewCodec()
return IBCMapper{
ibcKey: ibcKey,
cdc: cdc,
}
}
func GetIngressKey(srcChain string) []byte {
return []byte(fmt.Sprintf("%s", srcChain))
func IngressKey(srcChain string) []byte {
return []byte(fmt.Sprintf("ingress/%s", srcChain))
}
func GetEgressKey(destChain string, index int64) []byte {
return []byte(fmt.Sprintf("%s/%d", destChain, index))
func EgressKey(destChain string, index int64) []byte {
return []byte(fmt.Sprintf("egress/%s/%d", destChain, index))
}
func EgressLengthKey(destChain string) []byte {
return []byte(fmt.Sprintf("egress/%s", destChain))
}
func (ibcm IBCMapper) getEgressLength(store sdk.KVStore, destChain string) int64 {
bz := store.Get(EgressLengthKey(destChain))
if bz == nil {
zero, err := ibcm.cdc.MarshalBinary(int64(0))
if err != nil {
panic(err)
}
store.Set(EgressLengthKey(destChain), zero)
return 0
}
var res int64
if err := ibcm.cdc.UnmarshalBinary(bz, &res); err != nil {
panic(err)
}
return res
}
func (ibcm IBCMapper) GetIngressSequence(ctx sdk.Context, srcChain string) int64 {
store := ctx.KVStore(ibcm.ibcKey)
bz := store.Get(IngressKey(srcChain))
if bz == nil {
zero, err := ibcm.cdc.MarshalBinary(int64(0))
if err != nil {
panic(err)
}
store.Set(IngressKey(srcChain), zero)
return 0
}
var res int64
if err := ibcm.cdc.UnmarshalBinary(bz, &res); err != nil {
panic(err)
}
return res
}
func (ibcm IBCMapper) SetIngressSequence(ctx sdk.Context, srcChain string, sequence int64) {
store := ctx.KVStore(ibcm.ibcKey)
bz, err := ibcm.cdc.MarshalBinary(sequence)
if err != nil {
panic(err)
}
store.Set(IngressKey(srcChain), bz)
}
func (ibcm IBCMapper) PushPacket(ctx sdk.Context, packet IBCPacket) {
store := ctx.KVStore(ibcm.ibcKey)
len := ibcm.getEgressLength(store, packet.DestChain)
packetbz, err := ibcm.cdc.MarshalBinary(packet)
if err != nil {
panic(err)
}
store.Set(EgressKey(packet.DestChain, len), packetbz)
lenbz, err := ibcm.cdc.MarshalBinary(int64(len + 1))
if err != nil {
panic(err)
}
store.Set(EgressLengthKey(packet.DestChain), lenbz)
}

View File

@ -32,7 +32,7 @@ func (msg IBCTransferMsg) Get(key interface{}) interface{} {
func (msg IBCTransferMsg) GetSignBytes() []byte {
cdc := newCodec()
bz, err := cdc.MarshalBinary(msg)
bz, err := cdc.MarshalBinary(msg.IBCPacket)
if err != nil {
panic(err)
}
@ -40,15 +40,42 @@ func (msg IBCTransferMsg) GetSignBytes() []byte {
}
func (msg IBCTransferMsg) ValidateBasic() sdk.Error {
return msg.Coins.ValidateBasic()
return nil
}
// x/bank/tx.go SendMsg.GetSigners()
func (msg IBCTransferMsg) GetSigners() []sdk.Address {
addrs := []sdk.Address{msg.SrcAddr}
return []sdk.Address{msg.SrcAddr}
}
type IBCReceiveMsg struct {
IBCPacket
Relayer sdk.Address
Relayer sdk.Address
Sequence int64
}
func (msg IBCReceiveMsg) Type() string {
return "ibcreceive"
}
func (msg IBCReceiveMsg) Get(key interface{}) interface{} {
return nil
}
func (msg IBCReceiveMsg) GetSignBytes() []byte {
cdc := newCodec()
bz, err := cdc.MarshalBinary(msg.IBCPacket)
if err != nil {
panic(err)
}
return bz
}
func (msg IBCReceiveMsg) ValidateBasic() sdk.Error {
return nil
}
// x/bank/tx.go SendMsg.GetSigners()
func (msg IBCReceiveMsg) GetSigners() []sdk.Address {
return []sdk.Address{msg.Relayer}
}