Ori Newman 42e50e6dc2
[NOD-1191] Convert wire protocol to proto (#831)
* [NOD-1191] Convert wire protocol to 100% protobuf

* [NOD-1191] Simplify wire interface and remove redundant messages

* [NOD-1191] Map all proto to wire conversions

* [NOD-1203] Create netadapter outside of protocol manager

* [NOD-1191] Fix nil errors

* [NOD-1191] Fix comments

* [NOD-1191] Add converter interface

* [NOD-1191] Add missing GetBlockLocator message

* [NOD-1191] Change message names that starts with 'get' to 'request'

* [NOD-1191] Change message commands values

* [NOD-1191] Remove redundant methods

* [NOD-1191] Rename message constructors

* [NOD-1191] Change message commands to use iota

* [NOD-1191] Add missing outputs to protobuf conversion

* [NOD-1191] Make block header a required field

* [NOD-1191] Rename variables

* [NOD-1212] Fix test names

* [NOD-1191] Rename flow names

* [NOD-1191] Fix infinite loop
2020-07-30 18:19:55 +03:00

160 lines
3.9 KiB
Go

package protowire
import (
"github.com/kaspanet/kaspad/wire"
"github.com/pkg/errors"
)
type converter interface {
toWireMessage() (wire.Message, error)
}
// ToWireMessage converts a KaspadMessage to its wire.Message representation
func (x *KaspadMessage) ToWireMessage() (wire.Message, error) {
return x.Payload.(converter).toWireMessage()
}
// FromWireMessage creates a KaspadMessage from a wire.Message
func FromWireMessage(message wire.Message) (*KaspadMessage, error) {
payload, err := toPayload(message)
if err != nil {
return nil, err
}
return &KaspadMessage{
Payload: payload,
}, nil
}
func toPayload(message wire.Message) (isKaspadMessage_Payload, error) {
switch message := message.(type) {
case *wire.MsgAddresses:
payload := new(KaspadMessage_Addresses)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgBlock:
payload := new(KaspadMessage_Block)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgRequestBlockLocator:
payload := new(KaspadMessage_RequestBlockLocator)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgBlockLocator:
payload := new(KaspadMessage_BlockLocator)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgRequestAddresses:
payload := new(KaspadMessage_RequestAddresses)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgRequestIBDBlocks:
payload := new(KaspadMessage_RequestIBDBlocks)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgRequestRelayBlocks:
payload := new(KaspadMessage_RequestRelayBlocks)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgRequestSelectedTip:
payload := new(KaspadMessage_RequestSelectedTip)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgRequestTransactions:
payload := new(KaspadMessage_RequestTransactions)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgIBDBlock:
payload := new(KaspadMessage_IbdBlock)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgInvRelayBlock:
payload := new(KaspadMessage_InvRelayBlock)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgInvTransaction:
payload := new(KaspadMessage_InvTransactions)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgPing:
payload := new(KaspadMessage_Ping)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgPong:
payload := new(KaspadMessage_Pong)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgSelectedTip:
payload := new(KaspadMessage_SelectedTip)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgTx:
payload := new(KaspadMessage_Transaction)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgVerAck:
payload := new(KaspadMessage_Verack)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *wire.MsgVersion:
payload := new(KaspadMessage_Version)
err := payload.fromWireMessage(message)
if err != nil {
return nil, err
}
return payload, nil
default:
return nil, errors.Errorf("unknown message type %T", message)
}
}