# Ibc-go v1.0.0 issue ## Summary of Bug When receiving a packet with a packet data byte of an incorrect struct, the chain cannot unmarshal json from this line: https://github.com/cosmos/ibc-go/blob/v1.0.0/modules/apps/transfer/module.go#L331. Then the error acknowledgment will be created and saved to the chain state. However, the behavior of `types.ModuleCdc.UnmarshalJSON` is nondeterministic making the acknowledgment containing different error messages. This will result in a consensus break. Below are the error acknowledgments from our two test nodes. - `{"error":"cannot unmarshal ICS-20 transfer packet data: unknown field \"timeout_timestamp\" in types.FungibleTokenPacketData"}` - `{"error":"cannot unmarshal ICS-20 transfer packet data: unknown field \"source_channel\" in types.FungibleTokenPacketData"}` For the error above, we added a function called `GetBytes()` to MsgTransfer type. Then we also passed the msg to `SendTransfer()` function and called `msg.GetBytes()` instead of using `packetdata.GetBytes()` as usual (https://github.com/cosmos/ibc-go/blob/v1.0.0/modules/apps/transfer/keeper/relay.go#L151). The nondeterminis error is from protobuf package. On this line https://github.com/gogo/protobuf/blob/master/jsonpb/jsonpb.go#L1116, if there are more than one unknown fields, looping through a map can return different orders of elements. ## Version ibc-go v1.0.0 ## Steps to Reproduce - start one chain with multiple validators - start another chain with a custom ibc-transfer module that sends incorrect packet data - Make sure relayer does not have CalculateGas (I modified go-relayer to skip CalculateGas step) so it will not fail in relayer - send a transaction from the second chain